Fix GitHub issue #231 - support packed array indexing in foreach statement.

(cherry picked from commit 6309674a8d)
This commit is contained in:
Martin Whitaker 2019-07-25 11:10:08 +01:00
parent e834302875
commit a01b7054fc
1 changed files with 9 additions and 5 deletions

View File

@ -4799,14 +4799,18 @@ NetProc* PForeach::elaborate(Design*des, NetScope*scope) const
<< " 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.
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)
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())
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
// 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, dims.size() == index_vars_.size());
ivl_assert(*this, dims.size() >= index_vars_.size());
NetProc*sub;
if (statement_)