mirror of https://github.com/YosysHQ/yosys.git
Instead of using packing and hashing to compute SigSpec ordering and equality, just use the width and chunkwise comparisons
This avoids having to pack and compute hashes, and generally results in a simpler ordering.
This commit is contained in:
parent
92ea557979
commit
a69d48dd19
|
|
@ -5345,22 +5345,11 @@ bool RTLIL::SigSpec::operator <(const RTLIL::SigSpec &other) const
|
||||||
if (width_ != other.width_)
|
if (width_ != other.width_)
|
||||||
return width_ < other.width_;
|
return width_ < other.width_;
|
||||||
|
|
||||||
pack();
|
auto other_it = other.chunks().begin();
|
||||||
other.pack();
|
for (const SigChunk &c : chunks()) {
|
||||||
|
if (c != *other_it)
|
||||||
if (chunks_.size() != other.chunks_.size())
|
return c < *other_it;
|
||||||
return chunks_.size() < other.chunks_.size();
|
++other_it;
|
||||||
|
|
||||||
updhash();
|
|
||||||
other.updhash();
|
|
||||||
|
|
||||||
if (hash_ != other.hash_)
|
|
||||||
return hash_ < other.hash_;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < chunks_.size(); i++)
|
|
||||||
if (chunks_[i] != other.chunks_[i]) {
|
|
||||||
cover("kernel.rtlil.sigspec.comp_lt.hash_collision");
|
|
||||||
return chunks_[i] < other.chunks_[i];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cover("kernel.rtlil.sigspec.comp_lt.equal");
|
cover("kernel.rtlil.sigspec.comp_lt.equal");
|
||||||
|
|
@ -5377,28 +5366,11 @@ bool RTLIL::SigSpec::operator ==(const RTLIL::SigSpec &other) const
|
||||||
if (width_ != other.width_)
|
if (width_ != other.width_)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Without this, SigSpec() == SigSpec(State::S0, 0) will fail
|
auto other_it = other.chunks().begin();
|
||||||
// since the RHS will contain one SigChunk of width 0 causing
|
for (const SigChunk &c : chunks()) {
|
||||||
// the size check below to fail
|
if (c != *other_it)
|
||||||
if (width_ == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
pack();
|
|
||||||
other.pack();
|
|
||||||
|
|
||||||
if (chunks_.size() != other.chunks_.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
updhash();
|
|
||||||
other.updhash();
|
|
||||||
|
|
||||||
if (hash_ != other.hash_)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < chunks_.size(); i++)
|
|
||||||
if (chunks_[i] != other.chunks_[i]) {
|
|
||||||
cover("kernel.rtlil.sigspec.comp_eq.hash_collision");
|
|
||||||
return false;
|
return false;
|
||||||
|
++other_it;
|
||||||
}
|
}
|
||||||
|
|
||||||
cover("kernel.rtlil.sigspec.comp_eq.equal");
|
cover("kernel.rtlil.sigspec.comp_eq.equal");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue