Assorted microoptimization speedups in core data structures.

This commit is contained in:
Marcelina Kościelnicka 2022-07-27 16:15:11 +02:00
parent 6ba48515b5
commit a681904237
6 changed files with 118 additions and 194 deletions

View File

@ -627,7 +627,7 @@ const char *log_const(const RTLIL::Const &value, bool autoint)
} }
} }
const char *log_id(RTLIL::IdString str) const char *log_id(const RTLIL::IdString &str)
{ {
log_id_cache.push_back(strdup(str.c_str())); log_id_cache.push_back(strdup(str.c_str()));
const char *p = log_id_cache.back(); const char *p = log_id_cache.back();

View File

@ -237,7 +237,7 @@ void log_check_expected();
const char *log_signal(const RTLIL::SigSpec &sig, bool autoint = true); const char *log_signal(const RTLIL::SigSpec &sig, bool autoint = true);
const char *log_const(const RTLIL::Const &value, bool autoint = true); const char *log_const(const RTLIL::Const &value, bool autoint = true);
const char *log_id(RTLIL::IdString id); const char *log_id(const RTLIL::IdString &id);
template<typename T> static inline const char *log_id(T *obj, const char *nullstr = nullptr) { template<typename T> static inline const char *log_id(T *obj, const char *nullstr = nullptr) {
if (nullstr && obj == nullptr) if (nullstr && obj == nullptr)

View File

@ -199,11 +199,6 @@ const pool<IdString> &RTLIL::builtin_ff_cell_types() {
return res; return res;
} }
RTLIL::Const::Const()
{
flags = RTLIL::CONST_FLAG_NONE;
}
RTLIL::Const::Const(const std::string &str) RTLIL::Const::Const(const std::string &str)
{ {
flags = RTLIL::CONST_FLAG_STRING; flags = RTLIL::CONST_FLAG_STRING;
@ -395,12 +390,12 @@ bool RTLIL::Const::is_onehot(int *pos) const
return found; return found;
} }
bool RTLIL::AttrObject::has_attribute(RTLIL::IdString id) const bool RTLIL::AttrObject::has_attribute(const RTLIL::IdString &id) const
{ {
return attributes.count(id); return attributes.count(id);
} }
void RTLIL::AttrObject::set_bool_attribute(RTLIL::IdString id, bool value) void RTLIL::AttrObject::set_bool_attribute(const RTLIL::IdString &id, bool value)
{ {
if (value) if (value)
attributes[id] = RTLIL::Const(1); attributes[id] = RTLIL::Const(1);
@ -408,7 +403,7 @@ void RTLIL::AttrObject::set_bool_attribute(RTLIL::IdString id, bool value)
attributes.erase(id); attributes.erase(id);
} }
bool RTLIL::AttrObject::get_bool_attribute(RTLIL::IdString id) const bool RTLIL::AttrObject::get_bool_attribute(const RTLIL::IdString &id) const
{ {
const auto it = attributes.find(id); const auto it = attributes.find(id);
if (it == attributes.end()) if (it == attributes.end())
@ -416,7 +411,7 @@ bool RTLIL::AttrObject::get_bool_attribute(RTLIL::IdString id) const
return it->second.as_bool(); return it->second.as_bool();
} }
void RTLIL::AttrObject::set_string_attribute(RTLIL::IdString id, string value) void RTLIL::AttrObject::set_string_attribute(const RTLIL::IdString& id, string value)
{ {
if (value.empty()) if (value.empty())
attributes.erase(id); attributes.erase(id);
@ -424,7 +419,7 @@ void RTLIL::AttrObject::set_string_attribute(RTLIL::IdString id, string value)
attributes[id] = value; attributes[id] = value;
} }
string RTLIL::AttrObject::get_string_attribute(RTLIL::IdString id) const string RTLIL::AttrObject::get_string_attribute(const RTLIL::IdString &id) const
{ {
std::string value; std::string value;
const auto it = attributes.find(id); const auto it = attributes.find(id);
@ -433,7 +428,7 @@ string RTLIL::AttrObject::get_string_attribute(RTLIL::IdString id) const
return value; return value;
} }
void RTLIL::AttrObject::set_strpool_attribute(RTLIL::IdString id, const pool<string> &data) void RTLIL::AttrObject::set_strpool_attribute(const RTLIL::IdString& id, const pool<string> &data)
{ {
string attrval; string attrval;
for (const auto &s : data) { for (const auto &s : data) {
@ -444,7 +439,7 @@ void RTLIL::AttrObject::set_strpool_attribute(RTLIL::IdString id, const pool<str
set_string_attribute(id, attrval); set_string_attribute(id, attrval);
} }
void RTLIL::AttrObject::add_strpool_attribute(RTLIL::IdString id, const pool<string> &data) void RTLIL::AttrObject::add_strpool_attribute(const RTLIL::IdString& id, const pool<string> &data)
{ {
pool<string> union_data = get_strpool_attribute(id); pool<string> union_data = get_strpool_attribute(id);
union_data.insert(data.begin(), data.end()); union_data.insert(data.begin(), data.end());
@ -452,7 +447,7 @@ void RTLIL::AttrObject::add_strpool_attribute(RTLIL::IdString id, const pool<str
set_strpool_attribute(id, union_data); set_strpool_attribute(id, union_data);
} }
pool<string> RTLIL::AttrObject::get_strpool_attribute(RTLIL::IdString id) const pool<string> RTLIL::AttrObject::get_strpool_attribute(const RTLIL::IdString &id) const
{ {
pool<string> data; pool<string> data;
if (attributes.count(id) != 0) if (attributes.count(id) != 0)
@ -477,7 +472,7 @@ vector<string> RTLIL::AttrObject::get_hdlname_attribute() const
return split_tokens(get_string_attribute(ID::hdlname), " "); return split_tokens(get_string_attribute(ID::hdlname), " ");
} }
void RTLIL::AttrObject::set_intvec_attribute(RTLIL::IdString id, const vector<int> &data) void RTLIL::AttrObject::set_intvec_attribute(const RTLIL::IdString& id, const vector<int> &data)
{ {
std::stringstream attrval; std::stringstream attrval;
for (auto &i : data) { for (auto &i : data) {
@ -488,7 +483,7 @@ void RTLIL::AttrObject::set_intvec_attribute(RTLIL::IdString id, const vector<in
attributes[id] = RTLIL::Const(attrval.str()); attributes[id] = RTLIL::Const(attrval.str());
} }
vector<int> RTLIL::AttrObject::get_intvec_attribute(RTLIL::IdString id) const vector<int> RTLIL::AttrObject::get_intvec_attribute(const RTLIL::IdString &id) const
{ {
vector<int> data; vector<int> data;
auto it = attributes.find(id); auto it = attributes.find(id);
@ -506,7 +501,7 @@ vector<int> RTLIL::AttrObject::get_intvec_attribute(RTLIL::IdString id) const
return data; return data;
} }
bool RTLIL::Selection::selected_module(RTLIL::IdString mod_name) const bool RTLIL::Selection::selected_module(const RTLIL::IdString &mod_name) const
{ {
if (full_selection) if (full_selection)
return true; return true;
@ -517,7 +512,7 @@ bool RTLIL::Selection::selected_module(RTLIL::IdString mod_name) const
return false; return false;
} }
bool RTLIL::Selection::selected_whole_module(RTLIL::IdString mod_name) const bool RTLIL::Selection::selected_whole_module(const RTLIL::IdString &mod_name) const
{ {
if (full_selection) if (full_selection)
return true; return true;
@ -526,7 +521,7 @@ bool RTLIL::Selection::selected_whole_module(RTLIL::IdString mod_name) const
return false; return false;
} }
bool RTLIL::Selection::selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const bool RTLIL::Selection::selected_member(const RTLIL::IdString &mod_name, const RTLIL::IdString &memb_name) const
{ {
if (full_selection) if (full_selection)
return true; return true;
@ -638,12 +633,12 @@ RTLIL::ObjRange<RTLIL::Module*> RTLIL::Design::modules()
return RTLIL::ObjRange<RTLIL::Module*>(&modules_, &refcount_modules_); return RTLIL::ObjRange<RTLIL::Module*>(&modules_, &refcount_modules_);
} }
RTLIL::Module *RTLIL::Design::module(RTLIL::IdString name) RTLIL::Module *RTLIL::Design::module(const RTLIL::IdString& name)
{ {
return modules_.count(name) ? modules_.at(name) : NULL; return modules_.count(name) ? modules_.at(name) : NULL;
} }
const RTLIL::Module *RTLIL::Design::module(RTLIL::IdString name) const const RTLIL::Module *RTLIL::Design::module(const RTLIL::IdString& name) const
{ {
return modules_.count(name) ? modules_.at(name) : NULL; return modules_.count(name) ? modules_.at(name) : NULL;
} }
@ -825,7 +820,7 @@ void RTLIL::Design::optimize()
it.second.optimize(this); it.second.optimize(this);
} }
bool RTLIL::Design::selected_module(RTLIL::IdString mod_name) const bool RTLIL::Design::selected_module(const RTLIL::IdString& mod_name) const
{ {
if (!selected_active_module.empty() && mod_name != selected_active_module) if (!selected_active_module.empty() && mod_name != selected_active_module)
return false; return false;
@ -834,7 +829,7 @@ bool RTLIL::Design::selected_module(RTLIL::IdString mod_name) const
return selection_stack.back().selected_module(mod_name); return selection_stack.back().selected_module(mod_name);
} }
bool RTLIL::Design::selected_whole_module(RTLIL::IdString mod_name) const bool RTLIL::Design::selected_whole_module(const RTLIL::IdString& mod_name) const
{ {
if (!selected_active_module.empty() && mod_name != selected_active_module) if (!selected_active_module.empty() && mod_name != selected_active_module)
return false; return false;
@ -843,7 +838,7 @@ bool RTLIL::Design::selected_whole_module(RTLIL::IdString mod_name) const
return selection_stack.back().selected_whole_module(mod_name); return selection_stack.back().selected_whole_module(mod_name);
} }
bool RTLIL::Design::selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const bool RTLIL::Design::selected_member(const RTLIL::IdString& mod_name, const RTLIL::IdString& memb_name) const
{ {
if (!selected_active_module.empty() && mod_name != selected_active_module) if (!selected_active_module.empty() && mod_name != selected_active_module)
return false; return false;
@ -987,7 +982,7 @@ RTLIL::IdString RTLIL::Module::derive(RTLIL::Design*, const dict<RTLIL::IdString
log_error("Module `%s' is used with parameters but is not parametric!\n", id2cstr(name)); log_error("Module `%s' is used with parameters but is not parametric!\n", id2cstr(name));
} }
size_t RTLIL::Module::count_id(RTLIL::IdString id) size_t RTLIL::Module::count_id(const RTLIL::IdString& id)
{ {
return wires_.count(id) + memories.count(id) + cells_.count(id) + processes.count(id); return wires_.count(id) + memories.count(id) + cells_.count(id) + processes.count(id);
} }
@ -1012,7 +1007,7 @@ namespace {
cell->name.c_str(), cell->type.c_str(), __FILE__, linenr, buf.str().c_str()); cell->name.c_str(), cell->type.c_str(), __FILE__, linenr, buf.str().c_str());
} }
int param(RTLIL::IdString name) int param(const RTLIL::IdString& name)
{ {
auto it = cell->parameters.find(name); auto it = cell->parameters.find(name);
if (it == cell->parameters.end()) if (it == cell->parameters.end())
@ -1021,7 +1016,7 @@ namespace {
return it->second.as_int(); return it->second.as_int();
} }
int param_bool(RTLIL::IdString name) int param_bool(const RTLIL::IdString& name)
{ {
int v = param(name); int v = param(name);
if (GetSize(cell->parameters.at(name)) > 32) if (GetSize(cell->parameters.at(name)) > 32)
@ -1031,7 +1026,7 @@ namespace {
return v; return v;
} }
int param_bool(RTLIL::IdString name, bool expected) int param_bool(const RTLIL::IdString& name, bool expected)
{ {
int v = param_bool(name); int v = param_bool(name);
if (v != expected) if (v != expected)
@ -1039,14 +1034,14 @@ namespace {
return v; return v;
} }
void param_bits(RTLIL::IdString name, int width) void param_bits(const RTLIL::IdString& name, int width)
{ {
param(name); param(name);
if (GetSize(cell->parameters.at(name).bits) != width) if (GetSize(cell->parameters.at(name).bits) != width)
error(__LINE__); error(__LINE__);
} }
void port(RTLIL::IdString name, int width) void port(const RTLIL::IdString& name, int width)
{ {
auto it = cell->connections_.find(name); auto it = cell->connections_.find(name);
if (it == cell->connections_.end()) if (it == cell->connections_.end())
@ -3259,12 +3254,12 @@ std::map<unsigned int, RTLIL::Cell*> *RTLIL::Cell::get_all_cells(void)
} }
#endif #endif
bool RTLIL::Cell::hasPort(RTLIL::IdString portname) const bool RTLIL::Cell::hasPort(const RTLIL::IdString& portname) const
{ {
return connections_.count(portname) != 0; return connections_.count(portname) != 0;
} }
void RTLIL::Cell::unsetPort(RTLIL::IdString portname) void RTLIL::Cell::unsetPort(const RTLIL::IdString& portname)
{ {
RTLIL::SigSpec signal; RTLIL::SigSpec signal;
auto conn_it = connections_.find(portname); auto conn_it = connections_.find(portname);
@ -3287,7 +3282,7 @@ void RTLIL::Cell::unsetPort(RTLIL::IdString portname)
} }
} }
void RTLIL::Cell::setPort(RTLIL::IdString portname, RTLIL::SigSpec signal) void RTLIL::Cell::setPort(const RTLIL::IdString& portname, RTLIL::SigSpec signal)
{ {
auto r = connections_.insert(portname); auto r = connections_.insert(portname);
auto conn_it = r.first; auto conn_it = r.first;
@ -3309,7 +3304,7 @@ void RTLIL::Cell::setPort(RTLIL::IdString portname, RTLIL::SigSpec signal)
conn_it->second = std::move(signal); conn_it->second = std::move(signal);
} }
const RTLIL::SigSpec &RTLIL::Cell::getPort(RTLIL::IdString portname) const const RTLIL::SigSpec &RTLIL::Cell::getPort(const RTLIL::IdString& portname) const
{ {
return connections_.at(portname); return connections_.at(portname);
} }
@ -3328,7 +3323,7 @@ bool RTLIL::Cell::known() const
return false; return false;
} }
bool RTLIL::Cell::input(RTLIL::IdString portname) const bool RTLIL::Cell::input(const RTLIL::IdString& portname) const
{ {
if (yosys_celltypes.cell_known(type)) if (yosys_celltypes.cell_known(type))
return yosys_celltypes.cell_input(type, portname); return yosys_celltypes.cell_input(type, portname);
@ -3340,7 +3335,7 @@ bool RTLIL::Cell::input(RTLIL::IdString portname) const
return false; return false;
} }
bool RTLIL::Cell::output(RTLIL::IdString portname) const bool RTLIL::Cell::output(const RTLIL::IdString& portname) const
{ {
if (yosys_celltypes.cell_known(type)) if (yosys_celltypes.cell_known(type))
return yosys_celltypes.cell_output(type, portname); return yosys_celltypes.cell_output(type, portname);
@ -3352,22 +3347,22 @@ bool RTLIL::Cell::output(RTLIL::IdString portname) const
return false; return false;
} }
bool RTLIL::Cell::hasParam(RTLIL::IdString paramname) const bool RTLIL::Cell::hasParam(const RTLIL::IdString& paramname) const
{ {
return parameters.count(paramname) != 0; return parameters.count(paramname) != 0;
} }
void RTLIL::Cell::unsetParam(RTLIL::IdString paramname) void RTLIL::Cell::unsetParam(const RTLIL::IdString& paramname)
{ {
parameters.erase(paramname); parameters.erase(paramname);
} }
void RTLIL::Cell::setParam(RTLIL::IdString paramname, RTLIL::Const value) void RTLIL::Cell::setParam(const RTLIL::IdString& paramname, RTLIL::Const value)
{ {
parameters[paramname] = std::move(value); parameters[paramname] = std::move(value);
} }
const RTLIL::Const &RTLIL::Cell::getParam(RTLIL::IdString paramname) const const RTLIL::Const &RTLIL::Cell::getParam(const RTLIL::IdString& paramname) const
{ {
const auto &it = parameters.find(paramname); const auto &it = parameters.find(paramname);
if (it != parameters.end()) if (it != parameters.end())
@ -3472,61 +3467,6 @@ bool RTLIL::Cell::is_mem_cell() const
return type.in(ID($mem), ID($mem_v2)) || has_memid(); return type.in(ID($mem), ID($mem_v2)) || has_memid();
} }
RTLIL::SigChunk::SigChunk()
{
wire = NULL;
width = 0;
offset = 0;
}
RTLIL::SigChunk::SigChunk(const RTLIL::Const &value)
{
wire = NULL;
data = value.bits;
width = GetSize(data);
offset = 0;
}
RTLIL::SigChunk::SigChunk(RTLIL::Wire *wire)
{
log_assert(wire != nullptr);
this->wire = wire;
this->width = wire->width;
this->offset = 0;
}
RTLIL::SigChunk::SigChunk(RTLIL::Wire *wire, int offset, int width)
{
log_assert(wire != nullptr);
this->wire = wire;
this->width = width;
this->offset = offset;
}
RTLIL::SigChunk::SigChunk(const std::string &str)
{
wire = NULL;
data = RTLIL::Const(str).bits;
width = GetSize(data);
offset = 0;
}
RTLIL::SigChunk::SigChunk(int val, int width)
{
wire = NULL;
data = RTLIL::Const(val, width).bits;
this->width = GetSize(data);
offset = 0;
}
RTLIL::SigChunk::SigChunk(RTLIL::State bit, int width)
{
wire = NULL;
data = RTLIL::Const(bit, width).bits;
this->width = GetSize(data);
offset = 0;
}
RTLIL::SigChunk::SigChunk(const RTLIL::SigBit &bit) RTLIL::SigChunk::SigChunk(const RTLIL::SigBit &bit)
{ {
wire = bit.wire; wire = bit.wire;
@ -3538,11 +3478,6 @@ RTLIL::SigChunk::SigChunk(const RTLIL::SigBit &bit)
width = 1; width = 1;
} }
RTLIL::SigChunk::SigChunk(const RTLIL::SigChunk &sigchunk)
{
*this = sigchunk;
}
RTLIL::SigChunk RTLIL::SigChunk::extract(int offset, int length) const RTLIL::SigChunk RTLIL::SigChunk::extract(int offset, int length) const
{ {
RTLIL::SigChunk ret; RTLIL::SigChunk ret;
@ -3588,17 +3523,6 @@ bool RTLIL::SigChunk::operator !=(const RTLIL::SigChunk &other) const
return true; return true;
} }
RTLIL::SigSpec::SigSpec()
{
width_ = 0;
hash_ = 0;
}
RTLIL::SigSpec::SigSpec(const RTLIL::SigSpec &other)
{
*this = other;
}
RTLIL::SigSpec::SigSpec(std::initializer_list<RTLIL::SigSpec> parts) RTLIL::SigSpec::SigSpec(std::initializer_list<RTLIL::SigSpec> parts)
{ {
cover("kernel.rtlil.sigspec.init.list"); cover("kernel.rtlil.sigspec.init.list");
@ -3613,17 +3537,6 @@ RTLIL::SigSpec::SigSpec(std::initializer_list<RTLIL::SigSpec> parts)
append(*it--); append(*it--);
} }
RTLIL::SigSpec &RTLIL::SigSpec::operator=(const RTLIL::SigSpec &other)
{
cover("kernel.rtlil.sigspec.assign");
width_ = other.width_;
hash_ = other.hash_;
chunks_ = other.chunks_;
bits_ = other.bits_;
return *this;
}
RTLIL::SigSpec::SigSpec(const RTLIL::Const &value) RTLIL::SigSpec::SigSpec(const RTLIL::Const &value)
{ {
cover("kernel.rtlil.sigspec.init.const"); cover("kernel.rtlil.sigspec.init.const");
@ -3638,6 +3551,20 @@ RTLIL::SigSpec::SigSpec(const RTLIL::Const &value)
check(); check();
} }
RTLIL::SigSpec::SigSpec(RTLIL::Const &&value)
{
cover("kernel.rtlil.sigspec.init.const.move");
if (GetSize(value) != 0) {
chunks_.emplace_back(std::move(value));
width_ = chunks_.back().width;
} else {
width_ = 0;
}
hash_ = 0;
check();
}
RTLIL::SigSpec::SigSpec(const RTLIL::SigChunk &chunk) RTLIL::SigSpec::SigSpec(const RTLIL::SigChunk &chunk)
{ {
cover("kernel.rtlil.sigspec.init.chunk"); cover("kernel.rtlil.sigspec.init.chunk");
@ -3652,6 +3579,20 @@ RTLIL::SigSpec::SigSpec(const RTLIL::SigChunk &chunk)
check(); check();
} }
RTLIL::SigSpec::SigSpec(RTLIL::SigChunk &&chunk)
{
cover("kernel.rtlil.sigspec.init.chunk.move");
if (chunk.width != 0) {
chunks_.emplace_back(std::move(chunk));
width_ = chunks_.back().width;
} else {
width_ = 0;
}
hash_ = 0;
check();
}
RTLIL::SigSpec::SigSpec(RTLIL::Wire *wire) RTLIL::SigSpec::SigSpec(RTLIL::Wire *wire)
{ {
cover("kernel.rtlil.sigspec.init.wire"); cover("kernel.rtlil.sigspec.init.wire");

View File

@ -414,11 +414,11 @@ namespace RTLIL
return str.substr(1); return str.substr(1);
} }
static inline std::string unescape_id(RTLIL::IdString str) { static inline std::string unescape_id(const RTLIL::IdString &str) {
return unescape_id(str.str()); return unescape_id(str.str());
} }
static inline const char *id2cstr(RTLIL::IdString str) { static inline const char *id2cstr(const RTLIL::IdString &str) {
return log_id(str); return log_id(str);
} }
@ -435,7 +435,7 @@ namespace RTLIL
}; };
struct sort_by_id_str { struct sort_by_id_str {
bool operator()(RTLIL::IdString a, RTLIL::IdString b) const { bool operator()(const RTLIL::IdString &a, const RTLIL::IdString &b) const {
return strcmp(a.c_str(), b.c_str()) < 0; return strcmp(a.c_str(), b.c_str()) < 0;
} }
}; };
@ -635,7 +635,7 @@ struct RTLIL::Const
int flags; int flags;
std::vector<RTLIL::State> bits; std::vector<RTLIL::State> bits;
Const(); Const() : flags(RTLIL::CONST_FLAG_NONE) {}
Const(const std::string &str); Const(const std::string &str);
Const(int val, int width = 32); Const(int val, int width = 32);
Const(RTLIL::State bit, int width = 1); Const(RTLIL::State bit, int width = 1);
@ -696,21 +696,21 @@ struct RTLIL::AttrObject
{ {
dict<RTLIL::IdString, RTLIL::Const> attributes; dict<RTLIL::IdString, RTLIL::Const> attributes;
bool has_attribute(RTLIL::IdString id) const; bool has_attribute(const RTLIL::IdString &id) const;
void set_bool_attribute(RTLIL::IdString id, bool value=true); void set_bool_attribute(const RTLIL::IdString &id, bool value=true);
bool get_bool_attribute(RTLIL::IdString id) const; bool get_bool_attribute(const RTLIL::IdString &id) const;
bool get_blackbox_attribute(bool ignore_wb=false) const { bool get_blackbox_attribute(bool ignore_wb=false) const {
return get_bool_attribute(ID::blackbox) || (!ignore_wb && get_bool_attribute(ID::whitebox)); return get_bool_attribute(ID::blackbox) || (!ignore_wb && get_bool_attribute(ID::whitebox));
} }
void set_string_attribute(RTLIL::IdString id, string value); void set_string_attribute(const RTLIL::IdString& id, string value);
string get_string_attribute(RTLIL::IdString id) const; string get_string_attribute(const RTLIL::IdString &id) const;
void set_strpool_attribute(RTLIL::IdString id, const pool<string> &data); void set_strpool_attribute(const RTLIL::IdString& id, const pool<string> &data);
void add_strpool_attribute(RTLIL::IdString id, const pool<string> &data); void add_strpool_attribute(const RTLIL::IdString& id, const pool<string> &data);
pool<string> get_strpool_attribute(RTLIL::IdString id) const; pool<string> get_strpool_attribute(const RTLIL::IdString &id) const;
void set_src_attribute(const std::string &src) { void set_src_attribute(const std::string &src) {
set_string_attribute(ID::src, src); set_string_attribute(ID::src, src);
@ -722,8 +722,8 @@ struct RTLIL::AttrObject
void set_hdlname_attribute(const vector<string> &hierarchy); void set_hdlname_attribute(const vector<string> &hierarchy);
vector<string> get_hdlname_attribute() const; vector<string> get_hdlname_attribute() const;
void set_intvec_attribute(RTLIL::IdString id, const vector<int> &data); void set_intvec_attribute(const RTLIL::IdString& id, const vector<int> &data);
vector<int> get_intvec_attribute(RTLIL::IdString id) const; vector<int> get_intvec_attribute(const RTLIL::IdString &id) const;
}; };
struct RTLIL::SigChunk struct RTLIL::SigChunk
@ -732,16 +732,15 @@ struct RTLIL::SigChunk
std::vector<RTLIL::State> data; // only used if wire == NULL, LSB at index 0 std::vector<RTLIL::State> data; // only used if wire == NULL, LSB at index 0
int width, offset; int width, offset;
SigChunk(); SigChunk() : wire(nullptr), width(0), offset(0) {}
SigChunk(const RTLIL::Const &value); SigChunk(const RTLIL::Const &value) : wire(nullptr), data(value.bits), width(GetSize(data)), offset(0) {}
SigChunk(RTLIL::Wire *wire); SigChunk(RTLIL::Const &&value) : wire(nullptr), data(std::move(value.bits)), width(GetSize(data)), offset(0) {}
SigChunk(RTLIL::Wire *wire, int offset, int width = 1); SigChunk(RTLIL::Wire *wire) : wire(wire), width(GetSize(wire)), offset(0) {}
SigChunk(const std::string &str); SigChunk(RTLIL::Wire *wire, int offset, int width = 1) : wire(wire), width(width), offset(offset) {}
SigChunk(int val, int width = 32); SigChunk(const std::string &str) : SigChunk(RTLIL::Const(str)) {}
SigChunk(RTLIL::State bit, int width = 1); SigChunk(int val, int width = 32) : SigChunk(RTLIL::Const(val, width)) {}
SigChunk(RTLIL::State bit, int width = 1) : SigChunk(RTLIL::Const(bit, width)) {}
SigChunk(const RTLIL::SigBit &bit); SigChunk(const RTLIL::SigBit &bit);
SigChunk(const RTLIL::SigChunk &sigchunk);
RTLIL::SigChunk &operator =(const RTLIL::SigChunk &other) = default;
RTLIL::SigChunk extract(int offset, int length) const; RTLIL::SigChunk extract(int offset, int length) const;
inline int size() const { return width; } inline int size() const { return width; }
@ -827,13 +826,13 @@ private:
friend struct RTLIL::Module; friend struct RTLIL::Module;
public: public:
SigSpec(); SigSpec() : width_(0), hash_(0) {}
SigSpec(const RTLIL::SigSpec &other);
SigSpec(std::initializer_list<RTLIL::SigSpec> parts); SigSpec(std::initializer_list<RTLIL::SigSpec> parts);
RTLIL::SigSpec &operator=(const RTLIL::SigSpec &other);
SigSpec(const RTLIL::Const &value); SigSpec(const RTLIL::Const &value);
SigSpec(RTLIL::Const &&value);
SigSpec(const RTLIL::SigChunk &chunk); SigSpec(const RTLIL::SigChunk &chunk);
SigSpec(RTLIL::SigChunk &&chunk);
SigSpec(RTLIL::Wire *wire); SigSpec(RTLIL::Wire *wire);
SigSpec(RTLIL::Wire *wire, int offset, int width = 1); SigSpec(RTLIL::Wire *wire, int offset, int width = 1);
SigSpec(const std::string &str); SigSpec(const std::string &str);
@ -846,21 +845,6 @@ public:
SigSpec(const std::set<RTLIL::SigBit> &bits); SigSpec(const std::set<RTLIL::SigBit> &bits);
explicit SigSpec(bool bit); explicit SigSpec(bool bit);
SigSpec(RTLIL::SigSpec &&other) {
width_ = other.width_;
hash_ = other.hash_;
chunks_ = std::move(other.chunks_);
bits_ = std::move(other.bits_);
}
const RTLIL::SigSpec &operator=(RTLIL::SigSpec &&other) {
width_ = other.width_;
hash_ = other.hash_;
chunks_ = std::move(other.chunks_);
bits_ = std::move(other.bits_);
return *this;
}
size_t get_hash() const { size_t get_hash() const {
if (!hash_) hash(); if (!hash_) hash();
return hash_; return hash_;
@ -985,9 +969,9 @@ struct RTLIL::Selection
Selection(bool full = true) : full_selection(full) { } Selection(bool full = true) : full_selection(full) { }
bool selected_module(RTLIL::IdString mod_name) const; bool selected_module(const RTLIL::IdString &mod_name) const;
bool selected_whole_module(RTLIL::IdString mod_name) const; bool selected_whole_module(const RTLIL::IdString &mod_name) const;
bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const; bool selected_member(const RTLIL::IdString &mod_name, const RTLIL::IdString &memb_name) const;
void optimize(RTLIL::Design *design); void optimize(RTLIL::Design *design);
template<typename T1> void select(T1 *module) { template<typename T1> void select(T1 *module) {
@ -1053,11 +1037,11 @@ struct RTLIL::Design
~Design(); ~Design();
RTLIL::ObjRange<RTLIL::Module*> modules(); RTLIL::ObjRange<RTLIL::Module*> modules();
RTLIL::Module *module(RTLIL::IdString name); RTLIL::Module *module(const RTLIL::IdString &name);
const RTLIL::Module *module(RTLIL::IdString name) const; const RTLIL::Module *module(const RTLIL::IdString &name) const;
RTLIL::Module *top_module(); RTLIL::Module *top_module();
bool has(RTLIL::IdString id) const { bool has(const RTLIL::IdString &id) const {
return modules_.count(id) != 0; return modules_.count(id) != 0;
} }
@ -1082,9 +1066,9 @@ struct RTLIL::Design
void check(); void check();
void optimize(); void optimize();
bool selected_module(RTLIL::IdString mod_name) const; bool selected_module(const RTLIL::IdString &mod_name) const;
bool selected_whole_module(RTLIL::IdString mod_name) const; bool selected_whole_module(const RTLIL::IdString &mod_name) const;
bool selected_member(RTLIL::IdString mod_name, RTLIL::IdString memb_name) const; bool selected_member(const RTLIL::IdString &mod_name, const RTLIL::IdString &memb_name) const;
bool selected_module(RTLIL::Module *mod) const; bool selected_module(RTLIL::Module *mod) const;
bool selected_whole_module(RTLIL::Module *mod) const; bool selected_whole_module(RTLIL::Module *mod) const;
@ -1165,7 +1149,7 @@ public:
virtual ~Module(); virtual ~Module();
virtual RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> &parameters, bool mayfail = false); virtual RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> &parameters, bool mayfail = false);
virtual RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> &parameters, const dict<RTLIL::IdString, RTLIL::Module*> &interfaces, const dict<RTLIL::IdString, RTLIL::IdString> &modports, bool mayfail = false); virtual RTLIL::IdString derive(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Const> &parameters, const dict<RTLIL::IdString, RTLIL::Module*> &interfaces, const dict<RTLIL::IdString, RTLIL::IdString> &modports, bool mayfail = false);
virtual size_t count_id(RTLIL::IdString id); virtual size_t count_id(const RTLIL::IdString& id);
virtual void expand_interfaces(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Module *> &local_interfaces); virtual void expand_interfaces(RTLIL::Design *design, const dict<RTLIL::IdString, RTLIL::Module *> &local_interfaces);
virtual bool reprocess_if_necessary(RTLIL::Design *design); virtual bool reprocess_if_necessary(RTLIL::Design *design);
@ -1200,20 +1184,20 @@ public:
return design->selected_member(name, member->name); return design->selected_member(name, member->name);
} }
RTLIL::Wire* wire(RTLIL::IdString id) { RTLIL::Wire* wire(const RTLIL::IdString &id) {
auto it = wires_.find(id); auto it = wires_.find(id);
return it == wires_.end() ? nullptr : it->second; return it == wires_.end() ? nullptr : it->second;
} }
RTLIL::Cell* cell(RTLIL::IdString id) { RTLIL::Cell* cell(const RTLIL::IdString &id) {
auto it = cells_.find(id); auto it = cells_.find(id);
return it == cells_.end() ? nullptr : it->second; return it == cells_.end() ? nullptr : it->second;
} }
const RTLIL::Wire* wire(RTLIL::IdString id) const{ const RTLIL::Wire* wire(const RTLIL::IdString &id) const{
auto it = wires_.find(id); auto it = wires_.find(id);
return it == wires_.end() ? nullptr : it->second; return it == wires_.end() ? nullptr : it->second;
} }
const RTLIL::Cell* cell(RTLIL::IdString id) const { const RTLIL::Cell* cell(const RTLIL::IdString &id) const {
auto it = cells_.find(id); auto it = cells_.find(id);
return it == cells_.end() ? nullptr : it->second; return it == cells_.end() ? nullptr : it->second;
} }
@ -1483,6 +1467,10 @@ public:
#endif #endif
}; };
inline int GetSize(RTLIL::Wire *wire) {
return wire->width;
}
struct RTLIL::Memory : public RTLIL::AttrObject struct RTLIL::Memory : public RTLIL::AttrObject
{ {
unsigned int hashidx_; unsigned int hashidx_;
@ -1521,22 +1509,22 @@ public:
dict<RTLIL::IdString, RTLIL::Const> parameters; dict<RTLIL::IdString, RTLIL::Const> parameters;
// access cell ports // access cell ports
bool hasPort(RTLIL::IdString portname) const; bool hasPort(const RTLIL::IdString &portname) const;
void unsetPort(RTLIL::IdString portname); void unsetPort(const RTLIL::IdString &portname);
void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal); void setPort(const RTLIL::IdString &portname, RTLIL::SigSpec signal);
const RTLIL::SigSpec &getPort(RTLIL::IdString portname) const; const RTLIL::SigSpec &getPort(const RTLIL::IdString &portname) const;
const dict<RTLIL::IdString, RTLIL::SigSpec> &connections() const; const dict<RTLIL::IdString, RTLIL::SigSpec> &connections() const;
// information about cell ports // information about cell ports
bool known() const; bool known() const;
bool input(RTLIL::IdString portname) const; bool input(const RTLIL::IdString &portname) const;
bool output(RTLIL::IdString portname) const; bool output(const RTLIL::IdString &portname) const;
// access cell parameters // access cell parameters
bool hasParam(RTLIL::IdString paramname) const; bool hasParam(const RTLIL::IdString &paramname) const;
void unsetParam(RTLIL::IdString paramname); void unsetParam(const RTLIL::IdString &paramname);
void setParam(RTLIL::IdString paramname, RTLIL::Const value); void setParam(const RTLIL::IdString &paramname, RTLIL::Const value);
const RTLIL::Const &getParam(RTLIL::IdString paramname) const; const RTLIL::Const &getParam(const RTLIL::IdString &paramname) const;
void sort(); void sort();
void check(); void check();

View File

@ -534,11 +534,6 @@ std::string escape_filename_spaces(const std::string& filename)
return out; return out;
} }
int GetSize(RTLIL::Wire *wire)
{
return wire->width;
}
bool already_setup = false; bool already_setup = false;
void yosys_setup() void yosys_setup()

View File

@ -287,7 +287,7 @@ void remove_directory(std::string dirname);
std::string escape_filename_spaces(const std::string& filename); std::string escape_filename_spaces(const std::string& filename);
template<typename T> int GetSize(const T &obj) { return obj.size(); } template<typename T> int GetSize(const T &obj) { return obj.size(); }
int GetSize(RTLIL::Wire *wire); inline int GetSize(RTLIL::Wire *wire);
extern int autoidx; extern int autoidx;
extern int yosys_xtrace; extern int yosys_xtrace;