3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-14 09:56:16 +00:00
This commit is contained in:
Emil J. Tywoniak 2024-06-11 00:06:52 +02:00
parent c0a51c8a52
commit d7251df9a9
2 changed files with 157 additions and 61 deletions

View file

@ -1020,10 +1020,10 @@ namespace {
struct InternalOldCellChecker struct InternalOldCellChecker
{ {
RTLIL::Module *module; RTLIL::Module *module;
RTLIL::OldCell *cell; RTLIL::Cell *cell;
pool<RTLIL::IdString> expected_params, expected_ports; pool<RTLIL::IdString> expected_params, expected_ports;
InternalOldCellChecker(RTLIL::Module *module, RTLIL::OldCell *cell) : module(module), cell(cell) { } InternalOldCellChecker(RTLIL::Module *module, RTLIL::Cell *cell) : module(module), cell(cell) { }
void error(int linenr) void error(int linenr)
{ {
@ -1090,7 +1090,7 @@ namespace {
for (auto &para : cell->parameters) for (auto &para : cell->parameters)
if (expected_params.count(para.first) == 0) if (expected_params.count(para.first) == 0)
error(__LINE__); error(__LINE__);
for (auto &conn : cell->connections()) for (auto &conn : cell->connections_)
if (expected_ports.count(conn.first) == 0) if (expected_ports.count(conn.first) == 0)
error(__LINE__); error(__LINE__);
@ -1219,7 +1219,7 @@ namespace {
port(ID::B, param(ID::B_WIDTH)); port(ID::B, param(ID::B_WIDTH));
port(ID::Y, param(ID::Y_WIDTH)); port(ID::Y, param(ID::Y_WIDTH));
check_expected(); check_expected();
Macc().from_cell(cell); Macc().from_cell(cell->legacy);
return; return;
} }
@ -2128,9 +2128,9 @@ std::vector<RTLIL::Wire*> RTLIL::Module::selected_wires() const
return result; return result;
} }
std::vector<RTLIL::OldCell*> RTLIL::Module::selected_cells() const std::vector<RTLIL::Cell*> RTLIL::Module::selected_cells() const
{ {
std::vector<RTLIL::OldCell*> result; std::vector<RTLIL::Cell*> result;
result.reserve(cells_.size()); result.reserve(cells_.size());
for (auto &it : cells_) for (auto &it : cells_)
if (design->selected(this, it.second)) if (design->selected(this, it.second))
@ -2147,13 +2147,14 @@ void RTLIL::Module::add(RTLIL::Wire *wire)
wire->module = this; wire->module = this;
} }
void RTLIL::Module::add(RTLIL::OldCell *cell) void RTLIL::Module::add(RTLIL::Cell *cell)
{ {
log_assert(!cell->name.empty()); log_assert(!cell->name.empty());
log_assert(count_id(cell->name) == 0); log_assert(count_id(cell->name) == 0);
log_assert(refcount_cells_ == 0); log_assert(refcount_cells_ == 0);
cells_[cell->name] = cell; cells_[cell->name] = cell;
cell->module = this; // TODO
// cell->module = this;
} }
void RTLIL::Module::add(RTLIL::Process *process) void RTLIL::Module::add(RTLIL::Process *process)
@ -2208,14 +2209,16 @@ void RTLIL::Module::remove(const pool<RTLIL::Wire*> &wires)
} }
} }
void RTLIL::Module::remove(RTLIL::OldCell *cell) void RTLIL::Module::remove(RTLIL::Cell *cell)
{ {
while (!cell->connections_.empty()) // TODO is this ok?
cell->unsetPort(cell->connections_.begin()->first); // while (!cell->connections_.empty())
// cell->unsetPort(cell->connections_.begin()->first);
//
log_assert(cells_.count(cell->name) != 0); // log_assert(cells_.count(cell->name) != 0);
log_assert(refcount_cells_ == 0); // log_assert(refcount_cells_ == 0);
cells_.erase(cell->name); // cells_.erase(cell->name);
delete cell; delete cell;
} }
@ -2235,7 +2238,7 @@ void RTLIL::Module::rename(RTLIL::Wire *wire, RTLIL::IdString new_name)
add(wire); add(wire);
} }
void RTLIL::Module::rename(RTLIL::OldCell *cell, RTLIL::IdString new_name) void RTLIL::Module::rename(RTLIL::Cell *cell, RTLIL::IdString new_name)
{ {
log_assert(cells_[cell->name] == cell); log_assert(cells_[cell->name] == cell);
log_assert(refcount_wires_ == 0); log_assert(refcount_wires_ == 0);
@ -2270,7 +2273,7 @@ void RTLIL::Module::swap_names(RTLIL::Wire *w1, RTLIL::Wire *w2)
wires_[w2->name] = w2; wires_[w2->name] = w2;
} }
void RTLIL::Module::swap_names(RTLIL::OldCell *c1, RTLIL::OldCell *c2) void RTLIL::Module::swap_names(RTLIL::Cell *c1, RTLIL::Cell *c2)
{ {
log_assert(cells_[c1->name] == c1); log_assert(cells_[c1->name] == c1);
log_assert(cells_[c2->name] == c2); log_assert(cells_[c2->name] == c2);
@ -2427,7 +2430,7 @@ RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, RTLIL::IdString type)
// std::cout << "alloc " << (long long)cell << " called " << cell->name.c_str() << "\n"; // std::cout << "alloc " << (long long)cell << " called " << cell->name.c_str() << "\n";
cell->name = name; cell->name = name;
cell->type = type; cell->type = type;
if (RTLIL::Cell::is_legacy(type)) { if (RTLIL::Cell::is_legacy_type(type)) {
auto legOldCell = new RTLIL::OldCell; auto legOldCell = new RTLIL::OldCell;
legOldCell->name = name; legOldCell->name = name;
legOldCell->type = type; legOldCell->type = type;
@ -2436,14 +2439,15 @@ RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, RTLIL::IdString type)
return cell; return cell;
} }
RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, const RTLIL::OldCell *other) // TODO ? brokey
{ // RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, const RTLIL::OldCell *other)
RTLIL::Cell *cell = addCell(name, other->type); // {
cell->connections_ = other->connections_; // RTLIL::Cell *cell = addCell(name, other->type);
cell->parameters = other->parameters; // cell->connections_ = other->connections_;
cell->attributes = other->attributes; // cell->parameters = other->parameters;
return cell; // cell->attributes = other->attributes;
} // return cell;
// }
RTLIL::Memory *RTLIL::Module::addMemory(RTLIL::IdString name, const RTLIL::Memory *other) RTLIL::Memory *RTLIL::Module::addMemory(RTLIL::IdString name, const RTLIL::Memory *other)
{ {
@ -3293,7 +3297,7 @@ RTLIL::Cell* RTLIL::Module::addAnyinit(RTLIL::IdString name, const RTLIL::SigSpe
RTLIL::SigSpec RTLIL::Module::Anyconst(RTLIL::IdString name, int width, const std::string &src) RTLIL::SigSpec RTLIL::Module::Anyconst(RTLIL::IdString name, int width, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, width); RTLIL::SigSpec sig = addWire(NEW_ID, width);
OldCell *cell = addCell(name, ID($anyconst)); Cell *cell = addCell(name, ID($anyconst));
cell->setParam(ID::WIDTH, width); cell->setParam(ID::WIDTH, width);
cell->setPort(ID::Y, sig); cell->setPort(ID::Y, sig);
cell->set_src_attribute(src); cell->set_src_attribute(src);
@ -3303,7 +3307,7 @@ RTLIL::SigSpec RTLIL::Module::Anyconst(RTLIL::IdString name, int width, const st
RTLIL::SigSpec RTLIL::Module::Anyseq(RTLIL::IdString name, int width, const std::string &src) RTLIL::SigSpec RTLIL::Module::Anyseq(RTLIL::IdString name, int width, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, width); RTLIL::SigSpec sig = addWire(NEW_ID, width);
OldCell *cell = addCell(name, ID($anyseq)); Cell *cell = addCell(name, ID($anyseq));
cell->setParam(ID::WIDTH, width); cell->setParam(ID::WIDTH, width);
cell->setPort(ID::Y, sig); cell->setPort(ID::Y, sig);
cell->set_src_attribute(src); cell->set_src_attribute(src);
@ -3313,7 +3317,7 @@ RTLIL::SigSpec RTLIL::Module::Anyseq(RTLIL::IdString name, int width, const std:
RTLIL::SigSpec RTLIL::Module::Allconst(RTLIL::IdString name, int width, const std::string &src) RTLIL::SigSpec RTLIL::Module::Allconst(RTLIL::IdString name, int width, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, width); RTLIL::SigSpec sig = addWire(NEW_ID, width);
OldCell *cell = addCell(name, ID($allconst)); Cell *cell = addCell(name, ID($allconst));
cell->setParam(ID::WIDTH, width); cell->setParam(ID::WIDTH, width);
cell->setPort(ID::Y, sig); cell->setPort(ID::Y, sig);
cell->set_src_attribute(src); cell->set_src_attribute(src);
@ -3323,7 +3327,7 @@ RTLIL::SigSpec RTLIL::Module::Allconst(RTLIL::IdString name, int width, const st
RTLIL::SigSpec RTLIL::Module::Allseq(RTLIL::IdString name, int width, const std::string &src) RTLIL::SigSpec RTLIL::Module::Allseq(RTLIL::IdString name, int width, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, width); RTLIL::SigSpec sig = addWire(NEW_ID, width);
OldCell *cell = addCell(name, ID($allseq)); Cell *cell = addCell(name, ID($allseq));
cell->setParam(ID::WIDTH, width); cell->setParam(ID::WIDTH, width);
cell->setPort(ID::Y, sig); cell->setPort(ID::Y, sig);
cell->set_src_attribute(src); cell->set_src_attribute(src);
@ -3333,7 +3337,7 @@ RTLIL::SigSpec RTLIL::Module::Allseq(RTLIL::IdString name, int width, const std:
RTLIL::SigSpec RTLIL::Module::Initstate(RTLIL::IdString name, const std::string &src) RTLIL::SigSpec RTLIL::Module::Initstate(RTLIL::IdString name, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID); RTLIL::SigSpec sig = addWire(NEW_ID);
OldCell *cell = addCell(name, ID($initstate)); Cell *cell = addCell(name, ID($initstate));
cell->setPort(ID::Y, sig); cell->setPort(ID::Y, sig);
cell->set_src_attribute(src); cell->set_src_attribute(src);
return sig; return sig;
@ -3342,7 +3346,7 @@ RTLIL::SigSpec RTLIL::Module::Initstate(RTLIL::IdString name, const std::string
RTLIL::SigSpec RTLIL::Module::SetTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_c, const std::string &src) RTLIL::SigSpec RTLIL::Module::SetTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_c, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, sig_a.size()); RTLIL::SigSpec sig = addWire(NEW_ID, sig_a.size());
OldCell *cell = addCell(name, ID($set_tag)); Cell *cell = addCell(name, ID($set_tag));
cell->parameters[ID::WIDTH] = sig_a.size(); cell->parameters[ID::WIDTH] = sig_a.size();
cell->parameters[ID::TAG] = tag; cell->parameters[ID::TAG] = tag;
cell->setPort(ID::A, sig_a); cell->setPort(ID::A, sig_a);
@ -3355,7 +3359,7 @@ RTLIL::SigSpec RTLIL::Module::SetTag(RTLIL::IdString name, const std::string &ta
RTLIL::Cell* RTLIL::Module::addSetTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_c, const RTLIL::SigSpec &sig_y, const std::string &src) RTLIL::Cell* RTLIL::Module::addSetTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_c, const RTLIL::SigSpec &sig_y, const std::string &src)
{ {
OldCell *cell = addCell(name, ID($set_tag)); Cell *cell = addCell(name, ID($set_tag));
cell->parameters[ID::WIDTH] = sig_a.size(); cell->parameters[ID::WIDTH] = sig_a.size();
cell->parameters[ID::TAG] = tag; cell->parameters[ID::TAG] = tag;
cell->setPort(ID::A, sig_a); cell->setPort(ID::A, sig_a);
@ -3369,7 +3373,7 @@ RTLIL::Cell* RTLIL::Module::addSetTag(RTLIL::IdString name, const std::string &t
RTLIL::SigSpec RTLIL::Module::GetTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const std::string &src) RTLIL::SigSpec RTLIL::Module::GetTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, sig_a.size()); RTLIL::SigSpec sig = addWire(NEW_ID, sig_a.size());
OldCell *cell = addCell(name, ID($get_tag)); Cell *cell = addCell(name, ID($get_tag));
cell->parameters[ID::WIDTH] = sig_a.size(); cell->parameters[ID::WIDTH] = sig_a.size();
cell->parameters[ID::TAG] = tag; cell->parameters[ID::TAG] = tag;
cell->setPort(ID::A, sig_a); cell->setPort(ID::A, sig_a);
@ -3393,7 +3397,7 @@ RTLIL::Cell* RTLIL::Module::addOverwriteTag(RTLIL::IdString name, const std::str
RTLIL::SigSpec RTLIL::Module::OriginalTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const std::string &src) RTLIL::SigSpec RTLIL::Module::OriginalTag(RTLIL::IdString name, const std::string &tag, const RTLIL::SigSpec &sig_a, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, sig_a.size()); RTLIL::SigSpec sig = addWire(NEW_ID, sig_a.size());
OldCell *cell = addCell(name, ID($original_tag)); Cell *cell = addCell(name, ID($original_tag));
cell->parameters[ID::WIDTH] = sig_a.size(); cell->parameters[ID::WIDTH] = sig_a.size();
cell->parameters[ID::TAG] = tag; cell->parameters[ID::TAG] = tag;
cell->setPort(ID::A, sig_a); cell->setPort(ID::A, sig_a);
@ -3405,7 +3409,7 @@ RTLIL::SigSpec RTLIL::Module::OriginalTag(RTLIL::IdString name, const std::strin
RTLIL::SigSpec RTLIL::Module::FutureFF(RTLIL::IdString name, const RTLIL::SigSpec &sig_e, const std::string &src) RTLIL::SigSpec RTLIL::Module::FutureFF(RTLIL::IdString name, const RTLIL::SigSpec &sig_e, const std::string &src)
{ {
RTLIL::SigSpec sig = addWire(NEW_ID, sig_e.size()); RTLIL::SigSpec sig = addWire(NEW_ID, sig_e.size());
OldCell *cell = addCell(name, ID($future_ff)); Cell *cell = addCell(name, ID($future_ff));
cell->parameters[ID::WIDTH] = sig_e.size(); cell->parameters[ID::WIDTH] = sig_e.size();
cell->setPort(ID::A, sig_e); cell->setPort(ID::A, sig_e);
cell->setPort(ID::Y, sig); cell->setPort(ID::Y, sig);
@ -3487,7 +3491,7 @@ RTLIL::Cell::~Cell()
} }
constexpr void RTLIL::Cell::setPort(const RTLIL::IdString &portname, RTLIL::SigSpec signal) { void RTLIL::Cell::setPort(const RTLIL::IdString &portname, RTLIL::SigSpec signal) {
if (is_legacy()) { if (is_legacy()) {
legacy->setPort(portname, signal); legacy->setPort(portname, signal);
return; return;
@ -3505,7 +3509,7 @@ constexpr void RTLIL::Cell::setPort(const RTLIL::IdString &portname, RTLIL::SigS
throw std::out_of_range("Cell::setPort()"); throw std::out_of_range("Cell::setPort()");
} }
} }
constexpr const RTLIL::SigSpec &RTLIL::Cell::getPort(const RTLIL::IdString &portname) { const RTLIL::SigSpec &RTLIL::Cell::getPort(const RTLIL::IdString &portname) {
if (is_legacy()) if (is_legacy())
return legacy->getPort(portname); return legacy->getPort(portname);
@ -3523,7 +3527,7 @@ constexpr const RTLIL::SigSpec &RTLIL::Cell::getPort(const RTLIL::IdString &port
} }
// TODO autogen // TODO autogen
constexpr void RTLIL::Cell::setParam(const RTLIL::IdString &paramname, RTLIL::Const value) { void RTLIL::Cell::setParam(const RTLIL::IdString &paramname, RTLIL::Const value) {
if (is_legacy()) { if (is_legacy()) {
legacy->setParam(paramname, value); legacy->setParam(paramname, value);
return; return;
@ -3543,8 +3547,8 @@ constexpr void RTLIL::Cell::setParam(const RTLIL::IdString &paramname, RTLIL::Co
} }
// TODO autogen // TODO autogen
constexpr const RTLIL::Const RTLIL::Cell::getParam(const RTLIL::IdString &paramname) { const RTLIL::Const RTLIL::Cell::getParam(const RTLIL::IdString &paramname) {
if (is_legacy()) { if (is_legacy())
return legacy->getParam(paramname); return legacy->getParam(paramname);
if (type == ID($not)) { if (type == ID($not)) {

View file

@ -1050,6 +1050,7 @@ struct RTLIL::Monitor
virtual void notify_module_add(RTLIL::Module*) { } virtual void notify_module_add(RTLIL::Module*) { }
virtual void notify_module_del(RTLIL::Module*) { } virtual void notify_module_del(RTLIL::Module*) { }
virtual void notify_connect(RTLIL::Cell*, const RTLIL::IdString&, const RTLIL::SigSpec&, const RTLIL::SigSpec&) { } virtual void notify_connect(RTLIL::Cell*, const RTLIL::IdString&, const RTLIL::SigSpec&, const RTLIL::SigSpec&) { }
virtual void notify_connect(RTLIL::OldCell*, const RTLIL::IdString&, const RTLIL::SigSpec&, const RTLIL::SigSpec&) { }
virtual void notify_connect(RTLIL::Module*, const RTLIL::SigSig&) { } virtual void notify_connect(RTLIL::Module*, const RTLIL::SigSig&) { }
virtual void notify_connect(RTLIL::Module*, const std::vector<RTLIL::SigSig>&) { } virtual void notify_connect(RTLIL::Module*, const std::vector<RTLIL::SigSig>&) { }
virtual void notify_blackout(RTLIL::Module*) { } virtual void notify_blackout(RTLIL::Module*) { }
@ -1649,6 +1650,12 @@ public:
RTLIL::Const at(RTLIL::IdString name) { RTLIL::Const at(RTLIL::IdString name) {
return parent->getParam(name); return parent->getParam(name);
} }
// Watch out! This is different semantics than what dict has!
// but we rely on RTLIL::Cell always being constructed correctly
// since its layout is fixed as defined by InternalOldCellChecker
RTLIL::Const operator[](RTLIL::IdString name) {
return parent->getParam(name);
}
int count(RTLIL::IdString name) { int count(RTLIL::IdString name) {
try { try {
parent->getParam(name); parent->getParam(name);
@ -1657,6 +1664,7 @@ public:
} }
return 1; return 1;
} }
}; };
struct FakeConns { struct FakeConns {
RTLIL::Cell* parent; RTLIL::Cell* parent;
@ -1671,7 +1679,23 @@ public:
} }
return 1; return 1;
} }
class iterator: public std::iterator<std::input_iterator_tag, std::pair<IdString, SigSpec>> { size_t size() const {
if (parent->is_legacy()) {
return parent->legacy->connections_.size();
} else if (parent->type == ID($pos)) {
return parent->pos.connections().size();
} else if (parent->type == ID($neg)) {
return parent->neg.connections().size();
} else if (parent->type == ID($not)) {
return parent->not_.connections().size();
} else {
log_assert(false && "malformed cell or code broke");
}
}
bool empty() {
return !size();
}
class iterator: public std::iterator<std::bidirectional_iterator_tag, std::pair<IdString, SigSpec>> {
Cell* parent; Cell* parent;
int position; int position;
public: public:
@ -1686,6 +1710,55 @@ public:
bool operator!=(const iterator &other) const { bool operator!=(const iterator &other) const {
return !(*this == other); return !(*this == other);
} }
std::pair<IdString, SigSpec>& operator*() const {
if (parent->is_legacy()) {
auto it = parent->legacy->connections_.begin();
it += position;
return *it;
} else if (parent->type == ID($pos)) {
// auto a = ();
return parent->pos.connections()[position];
} else if (parent->type == ID($neg)) {
return parent->neg.connections()[position];
} else if (parent->type == ID($not)) {
return parent->not_.connections()[position];
} else {
log_assert(false && "malformed cell or code broke");
}
}
};
iterator begin() {
return iterator(parent, 0);
}
iterator end() {
if (parent->is_legacy()) {
return iterator(parent, parent->legacy->connections_.size());
} else if (parent->type == ID($pos)) {
return iterator(parent, parent->pos.connections().size());
} else if (parent->type == ID($neg)) {
return iterator(parent, parent->neg.connections().size());
} else if (parent->type == ID($not)) {
return iterator(parent, parent->not_.connections().size());
} else {
log_assert(false && "malformed cell or code broke");
}
}
// CONST ITERATOR
class const_iterator: public std::iterator<std::input_iterator_tag, std::pair<IdString, SigSpec>> {
Cell* parent;
int position;
public:
const_iterator(Cell *parent, int position)
: parent(parent), position(position) {}
const_iterator& operator++() {
position++; return *this;
}
bool operator==(const const_iterator &other) const {
return position == other.position;
}
bool operator!=(const const_iterator &other) const {
return !(*this == other);
}
std::pair<IdString, SigSpec> operator*() const { std::pair<IdString, SigSpec> operator*() const {
if (parent->is_legacy()) { if (parent->is_legacy()) {
auto it = parent->legacy->connections_.begin(); auto it = parent->legacy->connections_.begin();
@ -1698,25 +1771,26 @@ public:
} else if (parent->type == ID($not)) { } else if (parent->type == ID($not)) {
return parent->not_.connections()[position]; return parent->not_.connections()[position];
} else { } else {
log_assert(false && "unreachable"); log_assert(false && "malformed cell or code broke");
__builtin_unreachable();
}
}
iterator begin() const {
return iterator(parent, 0);
}
iterator end() const {
if (parent->is_legacy()) {
return iterator(parent, parent->legacy->connections_.size());
} else if (parent->type == ID($pos)) {
return iterator(parent, parent->pos.connections().size());
} else if (parent->type == ID($neg)) {
return iterator(parent, parent->neg.connections().size());
} else if (parent->type == ID($not)) {
return iterator(parent, parent->not_.connections().size());
} }
} }
}; };
const_iterator begin() const {
return const_iterator(parent, 0);
}
const_iterator end() const {
if (parent->is_legacy()) {
return const_iterator(parent, parent->legacy->connections_.size());
} else if (parent->type == ID($pos)) {
return const_iterator(parent, parent->pos.connections().size());
} else if (parent->type == ID($neg)) {
return const_iterator(parent, parent->neg.connections().size());
} else if (parent->type == ID($not)) {
return const_iterator(parent, parent->not_.connections().size());
} else {
log_assert(false && "malformed cell or code broke");
}
}
}; };
FakeParams parameters; FakeParams parameters;
FakeConns connections_; FakeConns connections_;
@ -1728,14 +1802,32 @@ public:
}; };
// The weird bits // The weird bits
bool has_memid() { return is_legacy() && legacy->has_memid(); }
bool is_mem_cell() { return is_legacy() && legacy->is_mem_cell(); }
// TODO stub
void set_src_attribute(const std::string &src) { };
constexpr void setPort(const RTLIL::IdString &portname, RTLIL::SigSpec signal); void setPort(const RTLIL::IdString &portname, RTLIL::SigSpec signal);
constexpr const RTLIL::SigSpec &getPort(const RTLIL::IdString &portname); const RTLIL::SigSpec &getPort(const RTLIL::IdString &portname);
constexpr void setParam(const RTLIL::IdString &paramname, RTLIL::Const value); void setParam(const RTLIL::IdString &paramname, RTLIL::Const value);
constexpr const RTLIL::Const getParam(const RTLIL::IdString &paramname); const RTLIL::Const getParam(const RTLIL::IdString &paramname);
bool hasParam(const RTLIL::IdString &paramname) { bool hasParam(const RTLIL::IdString &paramname) {
return parameters.count(paramname); return parameters.count(paramname);
} }
template<typename T>
void rewrite_sigspecs2(T &functor) {
for (auto &it : connections_)
functor(it.second);
}
template<typename T>
void rewrite_sigspecs(T &functor) {
for (auto &it : connections_)
functor(it.second);
}
void sort() {
if (is_legacy()) legacy->sort();
}
private: private:
// NOT the tag, but a helper - faster short-circuit if public? // NOT the tag, but a helper - faster short-circuit if public?