Improved sig.remove2() performance
authorClifford Wolf <clifford@clifford.at>
Sun, 17 Aug 2014 00:16:56 +0000 (02:16 +0200)
committerClifford Wolf <clifford@clifford.at>
Sun, 17 Aug 2014 00:16:56 +0000 (02:16 +0200)
kernel/rtlil.cc

index 60c514d19e64a322fe84fe609cc636b8283a985f..e4bf4f9f3bab37655395ca95544498333c79de32 100644 (file)
@@ -2182,14 +2182,23 @@ void RTLIL::SigSpec::remove2(const std::set<RTLIL::SigBit> &pattern, RTLIL::SigS
 
        std::vector<RTLIL::SigBit> new_bits, new_other_bits;
 
+       new_bits.resize(SIZE(bits_));
+       if (other != NULL)
+               new_other_bits.resize(SIZE(bits_));
+
+       int k = 0;
        for (int i = 0; i < SIZE(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]);
+                       new_other_bits[k] = other->bits_[i];
+               new_bits[k++] = bits_[i];
        }
 
+       new_bits.resize(k);
+       if (other != NULL)
+               new_other_bits.resize(k);
+
        bits_.swap(new_bits);
        width_ = SIZE(bits_);