diff options
authorRick Altherr <>2016-01-31 08:55:49 -0800
committerRick Altherr <>2016-01-31 09:20:16 -0800
commit0265d7b1006e0946eb4635d73a6d49d31b3e4235 (patch)
parent89dc40f162a7f06d15ad489066dd0cc64937fbd7 (diff)
rtlil: speed up SigSpec::sort_and_unify()
std::set<> internally is often a red-black tree which is fairly expensive to create but fast to lookup. In the case of sort_and_unify(), a set<> is constructed as a temporary object to attempt to speed up lookups. Being a temporarily, however, the cost of creation far outweights the lookup improvement and is a net performance loss. Instead, sort the vector<> that already exists and then apply std::unique().
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/ b/kernel/
index ca448057..ee0f44a3 100644
--- a/kernel/
+++ b/kernel/
@@ -2573,8 +2573,18 @@ void RTLIL::SigSpec::sort()
void RTLIL::SigSpec::sort_and_unify()
+ unpack();
- *this = this->to_sigbit_set();
+ // A copy of the bits vector is used to prevent duplicating the logic from
+ // SigSpec::SigSpec(std::vector<SigBit>). This incurrs an extra copy but
+ // that isn't showing up as significant in profiles.
+ std::vector<SigBit> unique_bits = bits_;
+ std::sort(unique_bits.begin(), unique_bits.end());
+ auto last = std::unique(unique_bits.begin(), unique_bits.end());
+ unique_bits.erase(last, unique_bits.end());
+ *this = unique_bits;
void RTLIL::SigSpec::replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with)