diff --git a/elab_net.cc b/elab_net.cc index db70c4069..cb574ea3b 100644 --- a/elab_net.cc +++ b/elab_net.cc @@ -364,15 +364,26 @@ bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig, bool bit_defined_flag; /* bool flag = */ calculate_bits_(des, scope, msb, bit_defined_flag); ivl_assert(*this, bit_defined_flag); - midx = sig->sb_to_idx(prefix_indices, msb); - if (midx >= (long)sig->vector_width()) { - cerr << get_fileline() << ": error: Index " << sig->name() - << "[" << msb << "] is out of range." - << endl; - des->errors += 1; - midx = 0; + + if (prefix_indices.size()+2 <= sig->packed_dims().size()) { + long tmp_loff; + unsigned long tmp_lwid; + bool rcl = sig->sb_to_slice(prefix_indices, msb, + tmp_loff, tmp_lwid); + ivl_assert(*this, rcl); + midx = tmp_loff + tmp_lwid - 1; + lidx = tmp_loff; + } else { + midx = sig->sb_to_idx(prefix_indices, msb); + if (midx >= (long)sig->vector_width()) { + cerr << get_fileline() << ": error: Index " << sig->name() + << "[" << msb << "] is out of range." + << endl; + des->errors += 1; + midx = 0; + } + lidx = midx; } - lidx = midx; } else { cerr << get_fileline() << ": internal error: " diff --git a/tgt-vvp/vvp_scope.c b/tgt-vvp/vvp_scope.c index edb29b5e7..37555c5ca 100644 --- a/tgt-vvp/vvp_scope.c +++ b/tgt-vvp/vvp_scope.c @@ -427,14 +427,19 @@ static void draw_reg_in_scope(ivl_signal_t sig) { int msb; int lsb; - if (ivl_signal_packed_dimensions(sig) > 1) { - // FIX ME: Improve this when vvp becomes aware of packed - // arrays. + switch (ivl_signal_packed_dimensions(sig)) { + case 0: + msb = 0; + lsb = 0; + break; + case 1: + msb = ivl_signal_packed_msb(sig, 0); + lsb = ivl_signal_packed_lsb(sig, 0); + break; + default: msb = ivl_signal_width(sig) - 1; lsb = 0; - } else { - msb = ivl_signal_msb(sig); - lsb = ivl_signal_lsb(sig); + break; } const char*datatype_flag = ivl_signal_integer(sig) ? "/i" : @@ -483,8 +488,22 @@ static void draw_reg_in_scope(ivl_signal_t sig) */ static void draw_net_in_scope(ivl_signal_t sig) { - int msb = ivl_signal_msb(sig); - int lsb = ivl_signal_lsb(sig); + int msb; + int lsb; + switch (ivl_signal_packed_dimensions(sig)) { + case 0: + msb = 0; + lsb = 0; + break; + case 1: + msb = ivl_signal_packed_msb(sig, 0); + lsb = ivl_signal_packed_lsb(sig, 0); + break; + default: + msb = ivl_signal_width(sig) - 1; + lsb = 0; + break; + } const char*datatype_flag = ivl_signal_signed(sig)? "/s" : ""; const char*local_flag = ivl_signal_local(sig)? "*" : "";