mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-01 03:41:22 +00:00
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().
This commit is contained in:
parent
89dc40f162
commit
0265d7b100
1 changed files with 11 additions and 1 deletions
|
@ -2573,8 +2573,18 @@ void RTLIL::SigSpec::sort()
|
||||||
|
|
||||||
void RTLIL::SigSpec::sort_and_unify()
|
void RTLIL::SigSpec::sort_and_unify()
|
||||||
{
|
{
|
||||||
|
unpack();
|
||||||
cover("kernel.rtlil.sigspec.sort_and_unify");
|
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)
|
void RTLIL::SigSpec::replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue