Fix GitHub issue #231 - support packed array indexing in foreach statement.
(cherry picked from commit 6309674a8d)
This commit is contained in:
parent
e834302875
commit
a01b7054fc
14
elaborate.cc
14
elaborate.cc
|
|
@ -4799,14 +4799,18 @@ NetProc* PForeach::elaborate(Design*des, NetScope*scope) const
|
||||||
<< " packed dimensions." << endl;
|
<< " packed dimensions." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<netrange_t>dims = array_sig->unpacked_dims();
|
||||||
|
if (array_sig->packed_dimensions() > 0) {
|
||||||
|
dims.insert(dims.end(), array_sig->packed_dims().begin(), array_sig->packed_dims().end());
|
||||||
|
}
|
||||||
|
|
||||||
// Classic arrays are processed this way.
|
// Classic arrays are processed this way.
|
||||||
if (array_sig->data_type()==IVL_VT_BOOL)
|
if (array_sig->data_type()==IVL_VT_BOOL)
|
||||||
return elaborate_static_array_(des, scope, array_sig->unpacked_dims());
|
return elaborate_static_array_(des, scope, dims);
|
||||||
if (array_sig->data_type()==IVL_VT_LOGIC)
|
if (array_sig->data_type()==IVL_VT_LOGIC)
|
||||||
return elaborate_static_array_(des, scope, array_sig->unpacked_dims());
|
return elaborate_static_array_(des, scope, dims);
|
||||||
if (array_sig->unpacked_dimensions() >= index_vars_.size())
|
if (array_sig->unpacked_dimensions() >= index_vars_.size())
|
||||||
return elaborate_static_array_(des, scope, array_sig->unpacked_dims());
|
return elaborate_static_array_(des, scope, dims);
|
||||||
|
|
||||||
|
|
||||||
// At this point, we know that the array is dynamic so we
|
// At this point, we know that the array is dynamic so we
|
||||||
// handle that slightly differently, using run-time tests.
|
// handle that slightly differently, using run-time tests.
|
||||||
|
|
@ -4877,7 +4881,7 @@ NetProc* PForeach::elaborate_static_array_(Design*des, NetScope*scope,
|
||||||
}
|
}
|
||||||
|
|
||||||
ivl_assert(*this, index_vars_.size() > 0);
|
ivl_assert(*this, index_vars_.size() > 0);
|
||||||
ivl_assert(*this, dims.size() == index_vars_.size());
|
ivl_assert(*this, dims.size() >= index_vars_.size());
|
||||||
|
|
||||||
NetProc*sub;
|
NetProc*sub;
|
||||||
if (statement_)
|
if (statement_)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue