rtlil: improve performance of SigSpec::replace(SigSpec, SigSpec, SigSpec*)
authorRick Altherr <kc8apf@kc8apf.net>
Sun, 31 Jan 2016 03:43:29 +0000 (19:43 -0800)
committerRick Altherr <kc8apf@kc8apf.net>
Sun, 31 Jan 2016 17:20:16 +0000 (09:20 -0800)
kernel/rtlil.cc

index 91b7371510ffa55853901430c91f6bfbe6a482fc..ca4480576936a9276b7eec73b84a03c8aa17e117 100644 (file)
@@ -2584,18 +2584,26 @@ void RTLIL::SigSpec::replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec
 
 void RTLIL::SigSpec::replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with, RTLIL::SigSpec *other) const
 {
+       log_assert(other != NULL);
+       log_assert(width_ == other->width_);
        log_assert(pattern.width_ == with.width_);
 
        pattern.unpack();
        with.unpack();
+       unpack();
+       other->unpack();
 
-       dict<RTLIL::SigBit, RTLIL::SigBit> rules;
-
-       for (int i = 0; i < GetSize(pattern.bits_); i++)
-               if (pattern.bits_[i].wire != NULL)
-                       rules[pattern.bits_[i]] = with.bits_[i];
+       for (int i = 0; i < GetSize(pattern.bits_); i++) {
+               if (pattern.bits_[i].wire != NULL) {
+                       for (int j = 0; j < GetSize(bits_); j++) {
+                               if (bits_[j] == pattern.bits_[i]) {
+                                       other->bits_[j] = with.bits_[i];
+                               }
+                       }
+               }
+       }
 
-       replace(rules, other);
+       other->check();
 }
 
 void RTLIL::SigSpec::replace(const dict<RTLIL::SigBit, RTLIL::SigBit> &rules)