summaryrefslogtreecommitdiff
path: root/kernel/rtlil.cc
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2014-07-27 14:47:48 +0200
committerClifford Wolf <clifford@clifford.at>2014-07-27 14:47:48 +0200
commit4be645860bf83de75cdd00fbe615f3fe05221d54 (patch)
treefe7d18597997c3acef3adb8612a900588630d2a8 /kernel/rtlil.cc
parentcbc3a46a9717f0f6e90b20b29c9003c3720a5aa0 (diff)
Added RTLIL::SigSpec::remove_const() handling of packed SigSpecs
Diffstat (limited to 'kernel/rtlil.cc')
-rw-r--r--kernel/rtlil.cc35
1 files changed, 26 insertions, 9 deletions
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc
index db85f9e3..9f9bd7e0 100644
--- a/kernel/rtlil.cc
+++ b/kernel/rtlil.cc
@@ -1978,19 +1978,36 @@ void RTLIL::SigSpec::replace(int offset, const RTLIL::SigSpec &with)
void RTLIL::SigSpec::remove_const()
{
- cover("kernel.rtlil.sigspec.remove_const");
+ if (packed())
+ {
+ cover("kernel.rtlil.sigspec.remove_const.packed");
- unpack();
+ std::vector<RTLIL::SigChunk> new_chunks;
+ new_chunks.reserve(SIZE(chunks_));
+
+ width_ = 0;
+ for (auto &chunk : chunks_)
+ if (chunk.wire != NULL) {
+ new_chunks.push_back(chunk);
+ width_ += chunk.width;
+ }
+
+ chunks_.swap(new_chunks);
+ }
+ else
+ {
+ cover("kernel.rtlil.sigspec.remove_const.unpacked");
- std::vector<RTLIL::SigBit> new_bits;
- new_bits.reserve(width_);
+ std::vector<RTLIL::SigBit> new_bits;
+ new_bits.reserve(width_);
- for (auto &bit : bits_)
- if (bit.wire != NULL)
- new_bits.push_back(bit);
+ for (auto &bit : bits_)
+ if (bit.wire != NULL)
+ new_bits.push_back(bit);
- bits_.swap(new_bits);
- width_ = bits_.size();
+ bits_.swap(new_bits);
+ width_ = bits_.size();
+ }
check();
}