Handle invalid enum dimensions
Specifying and enum with an invalid dimension range results in an assert or
segfault. E.g. `enum [$] E { ... }`.
Use the `evaluate_ranges()` function to elaborate the enum dimensions. This
functions has proper error checking and recovery built-in.
In addition verify that there is at most one packed dimension.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
ea1bf7577a
commit
90edf48ac6
|
|
@ -180,18 +180,25 @@ static void collect_scope_specparams(Design*des, NetScope*scope,
|
|||
static void elaborate_scope_enumeration(Design*des, NetScope*scope,
|
||||
enum_type_t*enum_type)
|
||||
{
|
||||
std::vector<netrange_t> ranges;
|
||||
bool rc_flag;
|
||||
assert(enum_type->range->size() == 1);
|
||||
pform_range_t&range = enum_type->range->front();
|
||||
NetExpr*msb_ex = elab_and_eval(des, scope, range.first, -1);
|
||||
NetExpr*lsb_ex = elab_and_eval(des, scope, range.second, -1);
|
||||
|
||||
if (enum_type->range.get())
|
||||
evaluate_ranges(des, scope, enum_type, ranges, *enum_type->range);
|
||||
|
||||
long msb = 0;
|
||||
rc_flag = eval_as_long(msb, msb_ex);
|
||||
assert(rc_flag);
|
||||
long lsb = 0;
|
||||
rc_flag = eval_as_long(lsb, lsb_ex);
|
||||
assert(rc_flag);
|
||||
|
||||
if (!ranges.empty()) {
|
||||
msb = ranges.front().get_msb();
|
||||
lsb = ranges.front().get_lsb();
|
||||
if (ranges.size() > 1) {
|
||||
cerr << enum_type->get_fileline() << ": error: "
|
||||
<< "Enum type must not have more than 1 packed dimension."
|
||||
<< endl;
|
||||
des->errors++;
|
||||
}
|
||||
}
|
||||
|
||||
netenum_t*use_enum = new netenum_t(enum_type->base_type,
|
||||
enum_type->signed_flag,
|
||||
|
|
|
|||
5
pform.cc
5
pform.cc
|
|
@ -3575,8 +3575,6 @@ static void pform_set_enum(const struct vlltype&li, enum_type_t*enum_type,
|
|||
|
||||
cur->set_signed(enum_type->signed_flag);
|
||||
|
||||
assert(enum_type->range.get() != 0);
|
||||
assert(enum_type->range->size() == 1);
|
||||
//XXXXcur->set_range(*enum_type->range, SR_NET);
|
||||
// If this is an integer enumeration switch the wire to an integer.
|
||||
if (enum_type->integer_flag) {
|
||||
|
|
@ -3594,9 +3592,6 @@ static void pform_set_enum(const struct vlltype&li, enum_type_t*enum_type,
|
|||
// IVL_VT_BOOL.
|
||||
assert(enum_type->base_type==IVL_VT_LOGIC || enum_type->base_type==IVL_VT_BOOL);
|
||||
|
||||
assert(enum_type->range.get() != 0);
|
||||
assert(enum_type->range->size() == 1);
|
||||
|
||||
// Add the file and line information to the enumeration type.
|
||||
FILE_NAME(&(enum_type->li), li);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue