rtlil: duplicate remove2() for std::set<>
authorRick Altherr <kc8apf@kc8apf.net>
Sat, 30 Jan 2016 06:03:12 +0000 (22:03 -0800)
committerRick Altherr <kc8apf@kc8apf.net>
Sat, 30 Jan 2016 07:06:40 +0000 (23:06 -0800)
kernel/rtlil.cc
kernel/rtlil.h

index 4403bcfdcd03d117aea8ed31bcc7ba585c101f78..dfccc78f87fa43da2aadb657a33d823837ce9efe 100644 (file)
@@ -2718,6 +2718,45 @@ void RTLIL::SigSpec::remove2(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec
        check();
 }
 
+void RTLIL::SigSpec::remove2(const std::set<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other)
+{
+       if (other)
+               cover("kernel.rtlil.sigspec.remove_other");
+       else
+               cover("kernel.rtlil.sigspec.remove");
+
+       unpack();
+
+       if (other != NULL) {
+               log_assert(width_ == other->width_);
+               other->unpack();
+       }
+
+       std::vector<RTLIL::SigBit> new_bits, new_other_bits;
+
+       new_bits.reserve(GetSize(bits_));
+       if (other != NULL)
+               new_other_bits.reserve(GetSize(bits_));
+
+       for (int i = 0; i < GetSize(bits_); i++) {
+               if (bits_[i].wire != NULL && pattern.count(bits_[i]))
+                       continue;
+               if (other != NULL)
+                       new_other_bits.push_back(other->bits_[i]);
+               new_bits.push_back(bits_[i]);
+       }
+
+       bits_.swap(new_bits);
+       width_ = GetSize(bits_);
+
+       if (other != NULL) {
+               other->bits_.swap(new_other_bits);
+               other->width_ = GetSize(other->bits_);
+       }
+
+       check();
+}
+
 RTLIL::SigSpec RTLIL::SigSpec::extract(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec *other) const
 {
        pool<RTLIL::SigBit> pattern_bits = pattern.to_sigbit_pool();
index 0444834acf3914cf6d3422eed27e38a69e36c38d..5dff5579ffe50d1eb5d90f7d4f73a526a23a6f05 100644 (file)
@@ -670,6 +670,8 @@ public:
        void remove(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other) const;
        void remove2(const pool<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other);
 
+       void remove2(const std::set<RTLIL::SigBit> &pattern, RTLIL::SigSpec *other);
+
        void remove(int offset, int length = 1);
        void remove_const();