Handle packed array slices at module ports.
This commit is contained in:
parent
63b7fe059d
commit
e7a974347e
27
elab_net.cc
27
elab_net.cc
|
|
@ -364,15 +364,26 @@ 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);
|
||||||
midx = sig->sb_to_idx(prefix_indices, msb);
|
|
||||||
if (midx >= (long)sig->vector_width()) {
|
if (prefix_indices.size()+2 <= sig->packed_dims().size()) {
|
||||||
cerr << get_fileline() << ": error: Index " << sig->name()
|
long tmp_loff;
|
||||||
<< "[" << msb << "] is out of range."
|
unsigned long tmp_lwid;
|
||||||
<< endl;
|
bool rcl = sig->sb_to_slice(prefix_indices, msb,
|
||||||
des->errors += 1;
|
tmp_loff, tmp_lwid);
|
||||||
midx = 0;
|
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 {
|
} else {
|
||||||
cerr << get_fileline() << ": internal error: "
|
cerr << get_fileline() << ": internal error: "
|
||||||
|
|
|
||||||
|
|
@ -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)? "*" : "";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue