diff options
author | Rick Altherr <kc8apf@kc8apf.net> | 2016-01-31 08:55:49 -0800 |
---|---|---|
committer | Rick Altherr <kc8apf@kc8apf.net> | 2016-01-31 09:20:16 -0800 |
commit | 0265d7b1006e0946eb4635d73a6d49d31b3e4235 (patch) | |
tree | 3661ebb9cad772243169a52189cd5a0da9813843 /kernel | |
parent | 89dc40f162a7f06d15ad489066dd0cc64937fbd7 (diff) | |
download | yosys-0265d7b1006e0946eb4635d73a6d49d31b3e4235.tar.gz yosys-0265d7b1006e0946eb4635d73a6d49d31b3e4235.tar.bz2 yosys-0265d7b1006e0946eb4635d73a6d49d31b3e4235.zip |
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().
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rtlil.cc | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index ca4480576..ee0f44a38 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -2573,8 +2573,18 @@ void RTLIL::SigSpec::sort() void RTLIL::SigSpec::sort_and_unify() { + unpack(); cover("kernel.rtlil.sigspec.sort_and_unify"); - *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) |