From: Eddie Hung Date: Thu, 26 Mar 2020 21:33:06 +0000 (-0700) Subject: kernel: Cell::set{Port,Param}() to pass by value, but use std::move X-Git-Tag: working-ls180~702^2~2 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f97b90e40b9a9b8e8b8ea692c651464980721ce4;p=yosys.git kernel: Cell::set{Port,Param}() to pass by value, but use std::move Otherwise cell->setPort(ID::A, cell->getPort(ID::B)) could be invalid --- diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 6eb698b2b..baa033401 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -2481,11 +2481,11 @@ void RTLIL::Cell::unsetPort(RTLIL::IdString portname) } } -void RTLIL::Cell::setPort(RTLIL::IdString portname, const RTLIL::SigSpec &signal) +void RTLIL::Cell::setPort(RTLIL::IdString portname, RTLIL::SigSpec signal) { auto r = connections_.insert(portname); auto conn_it = r.first; - if (conn_it->second == signal) + if (!r.second && conn_it->second == signal) return; for (auto mon : module->monitors) @@ -2500,7 +2500,7 @@ void RTLIL::Cell::setPort(RTLIL::IdString portname, const RTLIL::SigSpec &signal log_backtrace("-X- ", yosys_xtrace-1); } - conn_it->second = signal; + conn_it->second = std::move(signal); } const RTLIL::SigSpec &RTLIL::Cell::getPort(RTLIL::IdString portname) const @@ -2556,9 +2556,9 @@ void RTLIL::Cell::unsetParam(RTLIL::IdString paramname) parameters.erase(paramname); } -void RTLIL::Cell::setParam(RTLIL::IdString paramname, const RTLIL::Const &value) +void RTLIL::Cell::setParam(RTLIL::IdString paramname, RTLIL::Const value) { - parameters[paramname] = value; + parameters[paramname] = std::move(value); } const RTLIL::Const &RTLIL::Cell::getParam(RTLIL::IdString paramname) const diff --git a/kernel/rtlil.h b/kernel/rtlil.h index deb677f68..c0f1c7fa8 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -1381,7 +1381,7 @@ public: // access cell ports bool hasPort(RTLIL::IdString portname) const; void unsetPort(RTLIL::IdString portname); - void setPort(RTLIL::IdString portname, const RTLIL::SigSpec &signal); + void setPort(RTLIL::IdString portname, RTLIL::SigSpec signal); const RTLIL::SigSpec &getPort(RTLIL::IdString portname) const; const dict &connections() const; @@ -1393,7 +1393,7 @@ public: // access cell parameters bool hasParam(RTLIL::IdString paramname) const; void unsetParam(RTLIL::IdString paramname); - void setParam(RTLIL::IdString paramname, const RTLIL::Const& value); + void setParam(RTLIL::IdString paramname, RTLIL::Const value); const RTLIL::Const &getParam(RTLIL::IdString paramname) const; void sort();