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,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: "

View File

@ -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)? "*" : "";