kernel: optimise Module::remove(const pool<RTLIL::Wire*>()

This commit is contained in:
Eddie Hung 2020-03-12 15:55:54 -07:00
parent a076052fe4
commit b567f03c26
2 changed files with 9 additions and 10 deletions

View File

@ -1586,30 +1586,25 @@ void RTLIL::Module::remove(const pool<RTLIL::Wire*> &wires)
const pool<RTLIL::Wire*> *wires_p; const pool<RTLIL::Wire*> *wires_p;
void operator()(RTLIL::SigSpec &sig) { void operator()(RTLIL::SigSpec &sig) {
std::vector<RTLIL::SigChunk> chunks = sig; for (auto &c : sig.chunks_)
for (auto &c : chunks)
if (c.wire != NULL && wires_p->count(c.wire)) { if (c.wire != NULL && wires_p->count(c.wire)) {
c.wire = module->addWire(NEW_ID, c.width); c.wire = module->addWire(NEW_ID, c.width);
c.offset = 0; c.offset = 0;
} }
sig = chunks;
} }
void operator()(RTLIL::SigSpec &lhs, RTLIL::SigSpec &rhs) { void operator()(RTLIL::SigSpec &lhs, RTLIL::SigSpec &rhs) {
log_assert(GetSize(lhs) == GetSize(rhs)); log_assert(GetSize(lhs) == GetSize(rhs));
RTLIL::SigSpec new_lhs, new_rhs; lhs.unpack();
rhs.unpack();
for (int i = 0; i < GetSize(lhs); i++) { for (int i = 0; i < GetSize(lhs); i++) {
RTLIL::SigBit lhs_bit = lhs[i]; RTLIL::SigBit &lhs_bit = lhs.bits_[i];
if (lhs_bit.wire != nullptr && wires_p->count(lhs_bit.wire)) if (lhs_bit.wire != nullptr && wires_p->count(lhs_bit.wire))
continue; continue;
RTLIL::SigBit rhs_bit = rhs[i]; RTLIL::SigBit &rhs_bit = rhs.bits_[i];
if (rhs_bit.wire != nullptr && wires_p->count(rhs_bit.wire)) if (rhs_bit.wire != nullptr && wires_p->count(rhs_bit.wire))
continue; continue;
new_lhs.append(lhs_bit);
new_rhs.append(rhs_bit);
} }
lhs = new_lhs;
rhs = new_rhs;
} }
}; };

View File

@ -758,6 +758,10 @@ private:
unpack(); unpack();
} }
// Only used by Module::remove(const pool<Wire*> &wires)
// but cannot be more specific as it isn't yet declared
friend struct RTLIL::Module;
public: public:
SigSpec(); SigSpec();
SigSpec(const RTLIL::SigSpec &other); SigSpec(const RTLIL::SigSpec &other);