kernel: SigPool to use const& + overloads to prevent implicit SigSpec
authorEddie Hung <eddie@fpgeh.com>
Thu, 12 Mar 2020 22:50:42 +0000 (15:50 -0700)
committerEddie Hung <eddie@fpgeh.com>
Thu, 12 Mar 2020 23:00:34 +0000 (16:00 -0700)
kernel/sigtools.h

index 2517d6de33ad782bf31ed83dc506043f813e42b8..37674df8165c9fecc036e6ade861539aeccfc7fe 100644 (file)
@@ -39,7 +39,7 @@ struct SigPool
                bits.clear();
        }
 
-       void add(RTLIL::SigSpec sig)
+       void add(const RTLIL::SigSpec &sig)
        {
                for (auto &bit : sig)
                        if (bit.wire != NULL)
@@ -52,7 +52,7 @@ struct SigPool
                        bits.insert(bit);
        }
 
-       void del(RTLIL::SigSpec sig)
+       void del(const RTLIL::SigSpec &sig)
        {
                for (auto &bit : sig)
                        if (bit.wire != NULL)
@@ -65,7 +65,7 @@ struct SigPool
                        bits.erase(bit);
        }
 
-       void expand(RTLIL::SigSpec from, RTLIL::SigSpec to)
+       void expand(const RTLIL::SigSpec &from, const RTLIL::SigSpec &to)
        {
                log_assert(GetSize(from) == GetSize(to));
                for (int i = 0; i < GetSize(from); i++) {
@@ -75,16 +75,16 @@ struct SigPool
                }
        }
 
-       RTLIL::SigSpec extract(RTLIL::SigSpec sig)
+       RTLIL::SigSpec extract(const RTLIL::SigSpec &sig) const
        {
                RTLIL::SigSpec result;
                for (auto &bit : sig)
                        if (bit.wire != NULL && bits.count(bit))
-                               result.append_bit(bit);
+                               result.append(bit);
                return result;
        }
 
-       RTLIL::SigSpec remove(RTLIL::SigSpec sig)
+       RTLIL::SigSpec remove(const RTLIL::SigSpec &sig) const
        {
                RTLIL::SigSpec result;
                for (auto &bit : sig)
@@ -93,12 +93,12 @@ struct SigPool
                return result;
        }
 
-       bool check(RTLIL::SigBit bit)
+       bool check(const RTLIL::SigBit &bit) const
        {
                return bit.wire != NULL && bits.count(bit);
        }
 
-       bool check_any(RTLIL::SigSpec sig)
+       bool check_any(const RTLIL::SigSpec &sig) const
        {
                for (auto &bit : sig)
                        if (bit.wire != NULL && bits.count(bit))
@@ -106,7 +106,7 @@ struct SigPool
                return false;
        }
 
-       bool check_all(RTLIL::SigSpec sig)
+       bool check_all(const RTLIL::SigSpec &sig) const
        {
                for (auto &bit : sig)
                        if (bit.wire != NULL && bits.count(bit) == 0)
@@ -114,14 +114,14 @@ struct SigPool
                return true;
        }
 
-       RTLIL::SigSpec export_one()
+       RTLIL::SigSpec export_one() const
        {
                for (auto &bit : bits)
                        return RTLIL::SigSpec(bit.first, bit.second);
                return RTLIL::SigSpec();
        }
 
-       RTLIL::SigSpec export_all()
+       RTLIL::SigSpec export_all() const
        {
                pool<RTLIL::SigBit> sig;
                for (auto &bit : bits)
@@ -153,7 +153,7 @@ struct SigSet
                bits.clear();
        }
 
-       void insert(RTLIL::SigSpec sig, T data)
+       void insert(const RTLIL::SigSpec &sig, T data)
        {
                for (auto &bit : sig)
                        if (bit.wire != NULL)
@@ -262,7 +262,7 @@ struct SigMap
                        add(it.first, it.second);
        }
 
-       void add(RTLIL::SigSpec from, RTLIL::SigSpec to)
+       void add(const RTLIL::SigSpec& from, const RTLIL::SigSpec& to)
        {
                log_assert(GetSize(from) == GetSize(to));
 
@@ -287,15 +287,21 @@ struct SigMap
                }
        }
 
-       void add(RTLIL::SigSpec sig)
+       void add(const RTLIL::SigBit &bit)
        {
-               for (auto &bit : sig) {
-                       RTLIL::SigBit b = database.find(bit);
-                       if (b.wire != nullptr)
-                               database.promote(bit);
-               }
+               RTLIL::SigBit b = database.find(bit);
+               if (b.wire != nullptr)
+                       database.promote(bit);
        }
 
+       void add(const RTLIL::SigSpec &sig)
+       {
+               for (auto &bit : sig)
+                       add(bit);
+       }
+
+       inline void add(const Wire *wire) { return add(RTLIL::SigSpec(wire)); }
+
        void apply(RTLIL::SigBit &bit) const
        {
                bit = database.find(bit);