Merge pull request #578 from larsclausen/enum_invalid_dimensions
Handle invalid enum dimensions
This commit is contained in:
commit
db72a1d769
|
|
@ -180,22 +180,26 @@ 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;
|
||||
netrange_t range;
|
||||
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);
|
||||
|
||||
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 (enum_type->range.get())
|
||||
evaluate_ranges(des, scope, enum_type, ranges, *enum_type->range);
|
||||
|
||||
if (!ranges.empty()) {
|
||||
range = ranges.front();
|
||||
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,
|
||||
enum_type->integer_flag, msb, lsb,
|
||||
enum_type->integer_flag, range,
|
||||
enum_type->names->size(),
|
||||
enum_type);
|
||||
|
||||
|
|
|
|||
17
netenum.cc
17
netenum.cc
|
|
@ -24,10 +24,10 @@
|
|||
using namespace std;
|
||||
|
||||
netenum_t::netenum_t(ivl_variable_type_t btype, bool signed_flag,
|
||||
bool integer_flag, long msb, long lsb, size_t name_count,
|
||||
bool integer_flag, const netrange_t &range, size_t name_count,
|
||||
enum_type_t*enum_type)
|
||||
: base_type_(btype), enum_type_(enum_type), signed_flag_(signed_flag),
|
||||
integer_flag_(integer_flag), msb_(msb), lsb_(lsb),
|
||||
integer_flag_(integer_flag), range_(range),
|
||||
names_(name_count), bits_(name_count)
|
||||
{
|
||||
}
|
||||
|
|
@ -56,26 +56,19 @@ bool netenum_t::packed() const
|
|||
|
||||
long netenum_t::packed_width() const
|
||||
{
|
||||
if (msb_ >= lsb_)
|
||||
return msb_ - lsb_ + 1;
|
||||
else
|
||||
return lsb_ - msb_ + 1;
|
||||
return range_.width();
|
||||
}
|
||||
|
||||
vector<netrange_t> netenum_t::slice_dimensions() const
|
||||
{
|
||||
vector<netrange_t> tmp (1);
|
||||
tmp[0] = netrange_t(msb_, lsb_);
|
||||
return tmp;
|
||||
return vector<netrange_t>(1, range_);
|
||||
}
|
||||
|
||||
|
||||
bool netenum_t::insert_name(size_t name_idx, perm_string name, const verinum&val)
|
||||
{
|
||||
std::pair<std::map<perm_string,verinum>::iterator, bool> res;
|
||||
|
||||
assert((msb_-lsb_+1) > 0);
|
||||
assert(val.has_len() && val.len() == (unsigned)(msb_-lsb_+1));
|
||||
assert(val.has_len() && val.len() == packed_width());
|
||||
|
||||
// Insert a map of the name to the value. This also gets a
|
||||
// flag that returns true if the name is unique, or false
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class netenum_t : public LineInfo, public ivl_type_s {
|
|||
|
||||
public:
|
||||
explicit netenum_t(ivl_variable_type_t base_type, bool signed_flag,
|
||||
bool isint_flag, long msb, long lsb,
|
||||
bool isint_flag, const netrange_t &range,
|
||||
size_t name_count, enum_type_t*enum_type);
|
||||
~netenum_t();
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ class netenum_t : public LineInfo, public ivl_type_s {
|
|||
enum_type_t*enum_type_;
|
||||
bool signed_flag_;
|
||||
bool integer_flag_;
|
||||
long msb_, lsb_;
|
||||
netrange_t range_;
|
||||
|
||||
std::map<perm_string,verinum> names_map_;
|
||||
std::vector<perm_string> names_;
|
||||
|
|
|
|||
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