netenum_t: Use netrange_t to store range
Use netrange_t, which is meant for storing ranges, for storing the range of a netenum_t. This makes the integration with the rest of the codebase a bit more seamlessly and also allow to reuse methods defined for netrange_t such as the width() method rather than having to reimplement it. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
This commit is contained in:
parent
90edf48ac6
commit
3176611771
|
|
@ -181,17 +181,14 @@ static void elaborate_scope_enumeration(Design*des, NetScope*scope,
|
||||||
enum_type_t*enum_type)
|
enum_type_t*enum_type)
|
||||||
{
|
{
|
||||||
std::vector<netrange_t> ranges;
|
std::vector<netrange_t> ranges;
|
||||||
|
netrange_t range;
|
||||||
bool rc_flag;
|
bool rc_flag;
|
||||||
|
|
||||||
if (enum_type->range.get())
|
if (enum_type->range.get())
|
||||||
evaluate_ranges(des, scope, enum_type, ranges, *enum_type->range);
|
evaluate_ranges(des, scope, enum_type, ranges, *enum_type->range);
|
||||||
|
|
||||||
long msb = 0;
|
|
||||||
long lsb = 0;
|
|
||||||
|
|
||||||
if (!ranges.empty()) {
|
if (!ranges.empty()) {
|
||||||
msb = ranges.front().get_msb();
|
range = ranges.front();
|
||||||
lsb = ranges.front().get_lsb();
|
|
||||||
if (ranges.size() > 1) {
|
if (ranges.size() > 1) {
|
||||||
cerr << enum_type->get_fileline() << ": error: "
|
cerr << enum_type->get_fileline() << ": error: "
|
||||||
<< "Enum type must not have more than 1 packed dimension."
|
<< "Enum type must not have more than 1 packed dimension."
|
||||||
|
|
@ -202,7 +199,7 @@ 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, range,
|
||||||
enum_type->names->size(),
|
enum_type->names->size(),
|
||||||
enum_type);
|
enum_type);
|
||||||
|
|
||||||
|
|
|
||||||
14
netenum.cc
14
netenum.cc
|
|
@ -24,10 +24,10 @@
|
||||||
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, const netrange_t &range, size_t name_count,
|
||||||
enum_type_t*enum_type)
|
enum_type_t*enum_type)
|
||||||
: base_type_(btype), enum_type_(enum_type), signed_flag_(signed_flag),
|
: 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)
|
names_(name_count), bits_(name_count)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -56,20 +56,14 @@ bool netenum_t::packed() const
|
||||||
|
|
||||||
long netenum_t::packed_width() const
|
long netenum_t::packed_width() const
|
||||||
{
|
{
|
||||||
if (msb_ >= lsb_)
|
return range_.width();
|
||||||
return msb_ - lsb_ + 1;
|
|
||||||
else
|
|
||||||
return lsb_ - msb_ + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<netrange_t> netenum_t::slice_dimensions() const
|
vector<netrange_t> netenum_t::slice_dimensions() const
|
||||||
{
|
{
|
||||||
vector<netrange_t> tmp (1);
|
return vector<netrange_t>(1, range_);
|
||||||
tmp[0] = netrange_t(msb_, lsb_);
|
|
||||||
return tmp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool netenum_t::insert_name(size_t name_idx, perm_string name, const verinum&val)
|
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;
|
std::pair<std::map<perm_string,verinum>::iterator, bool> res;
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ 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, const netrange_t &range,
|
||||||
size_t name_count, enum_type_t*enum_type);
|
size_t name_count, enum_type_t*enum_type);
|
||||||
~netenum_t();
|
~netenum_t();
|
||||||
|
|
||||||
|
|
@ -77,7 +77,7 @@ class netenum_t : public LineInfo, public ivl_type_s {
|
||||||
enum_type_t*enum_type_;
|
enum_type_t*enum_type_;
|
||||||
bool signed_flag_;
|
bool signed_flag_;
|
||||||
bool integer_flag_;
|
bool integer_flag_;
|
||||||
long msb_, lsb_;
|
netrange_t range_;
|
||||||
|
|
||||||
std::map<perm_string,verinum> names_map_;
|
std::map<perm_string,verinum> names_map_;
|
||||||
std::vector<perm_string> names_;
|
std::vector<perm_string> names_;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue