Enumerations are compatible if their type definitions match.
This commit is contained in:
parent
2e9c4cde55
commit
6948c27c2d
|
|
@ -180,7 +180,8 @@ static void elaborate_scope_enumeration(Design*des, NetScope*scope,
|
||||||
netenum_t*use_enum = new netenum_t(enum_type->base_type,
|
netenum_t*use_enum = new netenum_t(enum_type->base_type,
|
||||||
enum_type->signed_flag,
|
enum_type->signed_flag,
|
||||||
enum_type->integer_flag, msb, lsb,
|
enum_type->integer_flag, msb, lsb,
|
||||||
enum_type->names->size());
|
enum_type->names->size(),
|
||||||
|
enum_type);
|
||||||
|
|
||||||
use_enum->set_line(enum_type->li);
|
use_enum->set_line(enum_type->li);
|
||||||
if (scope)
|
if (scope)
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@
|
||||||
# include "PPackage.h"
|
# include "PPackage.h"
|
||||||
# include "PSpec.h"
|
# include "PSpec.h"
|
||||||
# include "netlist.h"
|
# include "netlist.h"
|
||||||
|
# include "netenum.h"
|
||||||
# include "netvector.h"
|
# include "netvector.h"
|
||||||
# include "netdarray.h"
|
# include "netdarray.h"
|
||||||
# include "netparray.h"
|
# include "netparray.h"
|
||||||
|
|
@ -2668,7 +2669,8 @@ NetProc* PAssign::elaborate(Design*des, NetScope*scope) const
|
||||||
return bl;
|
return bl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lv->enumeration() && (lv->enumeration() != rv->enumeration())) {
|
if (lv->enumeration() &&
|
||||||
|
! lv->enumeration()->matches(rv->enumeration())) {
|
||||||
cerr << get_fileline() << ": error: "
|
cerr << get_fileline() << ": error: "
|
||||||
<< "Enumeration type mismatch in assignment." << endl;
|
<< "Enumeration type mismatch in assignment." << endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
|
|
|
||||||
13
netenum.cc
13
netenum.cc
|
|
@ -24,9 +24,11 @@
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
netenum_t::netenum_t(ivl_variable_type_t btype, bool signed_flag,
|
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, long msb, long lsb, size_t name_count,
|
||||||
: base_type_(btype), signed_flag_(signed_flag), integer_flag_(integer_flag),
|
enum_type_t*enum_type)
|
||||||
msb_(msb), lsb_(lsb), names_(name_count), bits_(name_count)
|
: base_type_(btype), enum_type_(enum_type), signed_flag_(signed_flag),
|
||||||
|
integer_flag_(integer_flag), msb_(msb), lsb_(lsb),
|
||||||
|
names_(name_count), bits_(name_count)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -161,3 +163,8 @@ perm_string netenum_t::bits_at(size_t idx) const
|
||||||
{
|
{
|
||||||
return bits_[idx];
|
return bits_[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool netenum_t::matches(const netenum_t*other) const
|
||||||
|
{
|
||||||
|
return enum_type_ == other->enum_type_;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,14 @@
|
||||||
|
|
||||||
class NetScope;
|
class NetScope;
|
||||||
|
|
||||||
|
struct enum_type_t;
|
||||||
|
|
||||||
class netenum_t : public LineInfo, public ivl_type_s {
|
class netenum_t : public LineInfo, public ivl_type_s {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit netenum_t(ivl_variable_type_t base_type, bool signed_flag,
|
explicit netenum_t(ivl_variable_type_t base_type, bool signed_flag,
|
||||||
bool isint_flag, long msb, long lsb,
|
bool isint_flag, long msb, long lsb,
|
||||||
size_t name_count);
|
size_t name_count, enum_type_t*enum_type);
|
||||||
~netenum_t();
|
~netenum_t();
|
||||||
|
|
||||||
virtual ivl_variable_type_t base_type() const;
|
virtual ivl_variable_type_t base_type() const;
|
||||||
|
|
@ -67,8 +69,12 @@ class netenum_t : public LineInfo, public ivl_type_s {
|
||||||
perm_string name_at(size_t idx) const;
|
perm_string name_at(size_t idx) const;
|
||||||
perm_string bits_at(size_t idx) const;
|
perm_string bits_at(size_t idx) const;
|
||||||
|
|
||||||
|
// Check if two enumerations have the same definition.
|
||||||
|
bool matches(const netenum_t*other) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ivl_variable_type_t base_type_;
|
ivl_variable_type_t base_type_;
|
||||||
|
enum_type_t*enum_type_;
|
||||||
bool signed_flag_;
|
bool signed_flag_;
|
||||||
bool integer_flag_;
|
bool integer_flag_;
|
||||||
long msb_, lsb_;
|
long msb_, lsb_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue