ivl: Support for part selection in multidimensional packed ports assignment.
(cherry picked from commit b4baace4b1)
This commit is contained in:
parent
b2281b0e65
commit
30257e0914
27
elab_net.cc
27
elab_net.cc
|
|
@ -328,8 +328,34 @@ bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (prefix_indices.size()+1 < sig->packed_dims().size()) {
|
||||||
|
// Here we have a slice that doesn't have enough indices
|
||||||
|
// to get to a single slice. For example:
|
||||||
|
// wire [9:0][5:1] foo
|
||||||
|
// ... foo[4:3] ...
|
||||||
|
// Make this work by finding the indexed slices and
|
||||||
|
// creating a generated slice that spans the whole
|
||||||
|
// range.
|
||||||
|
long loff, moff;
|
||||||
|
unsigned long lwid, mwid;
|
||||||
|
bool lrc;
|
||||||
|
lrc = sig->sb_to_slice(prefix_indices, lsb, loff, lwid);
|
||||||
|
ivl_assert(*this, lrc);
|
||||||
|
lrc = sig->sb_to_slice(prefix_indices, msb, moff, mwid);
|
||||||
|
ivl_assert(*this, lrc);
|
||||||
|
ivl_assert(*this, lwid == mwid);
|
||||||
|
|
||||||
|
if (moff > loff) {
|
||||||
|
lidx = loff;
|
||||||
|
midx = moff + mwid - 1;
|
||||||
|
} else {
|
||||||
|
lidx = moff;
|
||||||
|
midx = loff + lwid - 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
long lidx_tmp = sig->sb_to_idx(prefix_indices, lsb);
|
long lidx_tmp = sig->sb_to_idx(prefix_indices, lsb);
|
||||||
long midx_tmp = sig->sb_to_idx(prefix_indices, msb);
|
long midx_tmp = sig->sb_to_idx(prefix_indices, msb);
|
||||||
|
|
||||||
/* Detect reversed indices of a part select. */
|
/* Detect reversed indices of a part select. */
|
||||||
if (lidx_tmp > midx_tmp) {
|
if (lidx_tmp > midx_tmp) {
|
||||||
cerr << get_fileline() << ": error: Part select "
|
cerr << get_fileline() << ": error: Part select "
|
||||||
|
|
@ -361,6 +387,7 @@ bool PEIdent::eval_part_select_(Design*des, NetScope*scope, NetNet*sig,
|
||||||
|
|
||||||
midx = midx_tmp;
|
midx = midx_tmp;
|
||||||
lidx = lidx_tmp;
|
lidx = lidx_tmp;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1440,7 +1440,7 @@ bool evaluate_index_prefix(Design*des, NetScope*scope,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
prefix_indices .push_back(tmp);
|
prefix_indices.push_back(tmp);
|
||||||
delete texpr;
|
delete texpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue