From 4be645860bf83de75cdd00fbe615f3fe05221d54 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Sun, 27 Jul 2014 14:47:48 +0200 Subject: [PATCH] Added RTLIL::SigSpec::remove_const() handling of packed SigSpecs --- kernel/rtlil.cc | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index db85f9e3d..9f9bd7e03 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 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 new_bits; - new_bits.reserve(width_); + std::vector 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(); } -- 2.30.2