kernel: Cell::set{Port,Param}() to pass by value, but use std::move
authorEddie Hung <eddie@fpgeh.com>
Thu, 26 Mar 2020 21:33:06 +0000 (14:33 -0700)
committerEddie Hung <eddie@fpgeh.com>
Thu, 26 Mar 2020 21:33:06 +0000 (14:33 -0700)
Otherwise cell->setPort(ID::A, cell->getPort(ID::B)) could be invalid

kernel/rtlil.cc
kernel/rtlil.h

index 6eb698b2b0ab1c9e7f5a96f54c817432e4c2e7c5..baa033401fc738631dd0cabf05ee1851ce87d66b 100644 (file)
@@ -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
index deb677f68476300266d78c93327b0d5b1d946fe2..c0f1c7fa8911ab38ec19df4ff5be5a795d27b86f 100644 (file)
@@ -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<RTLIL::IdString, RTLIL::SigSpec> &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();