From: Rick Altherr Date: Sat, 30 Jan 2016 06:03:12 +0000 (-0800) Subject: rtlil: duplicate remove2() for std::set<> X-Git-Tag: yosys-0.6~33^2~1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=12ebdef17c66bc5d1fc9acf6fdafac0795f872f3;p=yosys.git rtlil: duplicate remove2() for std::set<> --- diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 4403bcfdc..dfccc78f8 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -2718,6 +2718,45 @@ void RTLIL::SigSpec::remove2(const pool &pattern, RTLIL::SigSpec check(); } +void RTLIL::SigSpec::remove2(const std::set &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 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 pattern_bits = pattern.to_sigbit_pool(); diff --git a/kernel/rtlil.h b/kernel/rtlil.h index 0444834ac..5dff5579f 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -670,6 +670,8 @@ public: void remove(const pool &pattern, RTLIL::SigSpec *other) const; void remove2(const pool &pattern, RTLIL::SigSpec *other); + void remove2(const std::set &pattern, RTLIL::SigSpec *other); + void remove(int offset, int length = 1); void remove_const();