Handle packed array slices at module ports.

This commit is contained in:
Stephen Williams 2012-04-22 19:08:22 -07:00
parent 63b7fe059d
commit e7a974347e
2 changed files with 46 additions and 16 deletions

View File

@ -364,6 +364,16 @@ bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig,
bool bit_defined_flag; bool bit_defined_flag;
/* bool flag = */ calculate_bits_(des, scope, msb, bit_defined_flag); /* bool flag = */ calculate_bits_(des, scope, msb, bit_defined_flag);
ivl_assert(*this, bit_defined_flag); ivl_assert(*this, bit_defined_flag);
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); midx = sig->sb_to_idx(prefix_indices, msb);
if (midx >= (long)sig->vector_width()) { if (midx >= (long)sig->vector_width()) {
cerr << get_fileline() << ": error: Index " << sig->name() cerr << get_fileline() << ": error: Index " << sig->name()
@ -373,6 +383,7 @@ bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig,
midx = 0; midx = 0;
} }
lidx = midx; lidx = midx;
}
} else { } else {
cerr << get_fileline() << ": internal error: " cerr << get_fileline() << ": internal error: "

View File

@ -427,14 +427,19 @@ static void draw_reg_in_scope(ivl_signal_t sig)
{ {
int msb; int msb;
int lsb; int lsb;
if (ivl_signal_packed_dimensions(sig) > 1) { switch (ivl_signal_packed_dimensions(sig)) {
// FIX ME: Improve this when vvp becomes aware of packed case 0:
// arrays. 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; msb = ivl_signal_width(sig) - 1;
lsb = 0; lsb = 0;
} else { break;
msb = ivl_signal_msb(sig);
lsb = ivl_signal_lsb(sig);
} }
const char*datatype_flag = ivl_signal_integer(sig) ? "/i" : 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) static void draw_net_in_scope(ivl_signal_t sig)
{ {
int msb = ivl_signal_msb(sig); int msb;
int lsb = ivl_signal_lsb(sig); 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*datatype_flag = ivl_signal_signed(sig)? "/s" : "";
const char*local_flag = ivl_signal_local(sig)? "*" : ""; const char*local_flag = ivl_signal_local(sig)? "*" : "";