summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/rtlil.cc39
-rw-r--r--kernel/rtlil.h2
2 files changed, 41 insertions, 0 deletions
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc
index 4403bcfd..dfccc78f 100644
--- a/kernel/rtlil.cc
+++ b/kernel/rtlil.cc
@@ -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();
diff --git a/kernel/rtlil.h b/kernel/rtlil.h
index 0444834a..5dff5579 100644
--- a/kernel/rtlil.h
+++ b/kernel/rtlil.h
@@ -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();