diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index a76e0d713..3b58eaff5 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -3789,7 +3789,6 @@ RTLIL::SigSpec::SigSpec(std::initializer_list parts) cover("kernel.rtlil.sigspec.init.list"); width_ = 0; - hash_ = 0; packed_ = true; (void)new (&this->chunks_) std::vector(); @@ -3812,7 +3811,6 @@ RTLIL::SigSpec::SigSpec(const RTLIL::Const &value) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3828,7 +3826,6 @@ RTLIL::SigSpec::SigSpec(RTLIL::Const &&value) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3844,7 +3841,6 @@ RTLIL::SigSpec::SigSpec(const RTLIL::SigChunk &chunk) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3860,7 +3856,6 @@ RTLIL::SigSpec::SigSpec(RTLIL::SigChunk &&chunk) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3876,7 +3871,6 @@ RTLIL::SigSpec::SigSpec(RTLIL::Wire *wire) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3892,7 +3886,6 @@ RTLIL::SigSpec::SigSpec(RTLIL::Wire *wire, int offset, int width) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3908,7 +3901,6 @@ RTLIL::SigSpec::SigSpec(const std::string &str) } else { width_ = 0; } - hash_ = 0; check(); } @@ -3921,7 +3913,6 @@ RTLIL::SigSpec::SigSpec(int val, int width) if (width != 0) chunks_.emplace_back(val, width); width_ = width; - hash_ = 0; check(); } @@ -3934,7 +3925,6 @@ RTLIL::SigSpec::SigSpec(RTLIL::State bit, int width) if (width != 0) chunks_.emplace_back(bit, width); width_ = width; - hash_ = 0; check(); } @@ -3952,7 +3942,6 @@ RTLIL::SigSpec::SigSpec(const RTLIL::SigBit &bit, int width) chunks_.push_back(bit); } width_ = width; - hash_ = 0; check(); } @@ -3963,7 +3952,6 @@ RTLIL::SigSpec::SigSpec(const std::vector &chunks) packed_ = true; (void)new (&this->chunks_) std::vector(); width_ = 0; - hash_ = 0; for (const auto &c : chunks) append(c); check(); @@ -3976,7 +3964,6 @@ RTLIL::SigSpec::SigSpec(const std::vector &bits) packed_ = false; (void)new (&this->bits_) std::vector(); width_ = 0; - hash_ = 0; for (const auto &bit : bits) append(bit); check(); @@ -3989,7 +3976,6 @@ RTLIL::SigSpec::SigSpec(const pool &bits) packed_ = false; (void)new (&this->bits_) std::vector(); width_ = 0; - hash_ = 0; for (const auto &bit : bits) append(bit); check(); @@ -4002,7 +3988,6 @@ RTLIL::SigSpec::SigSpec(const std::set &bits) packed_ = false; (void)new (&this->bits_) std::vector(); width_ = 0; - hash_ = 0; for (const auto &bit : bits) append(bit); check(); @@ -4015,7 +4000,6 @@ RTLIL::SigSpec::SigSpec(bool bit) packed_ = false; (void)new (&this->bits_) std::vector(); width_ = 0; - hash_ = 0; append(SigBit(bit)); check(); } @@ -4097,34 +4081,32 @@ void RTLIL::SigSpec::unpack() const new_bits.emplace_back(c, i); that->chunks_.clear(); - that->hash_ = 0; that->switch_to_unpacked(); that->bits_.swap(new_bits); } -void RTLIL::SigSpec::updhash() const +size_t RTLIL::SigSpec::hash() const { RTLIL::SigSpec *that = (RTLIL::SigSpec*)this; - if (that->hash_ != 0) - return; - cover("kernel.rtlil.sigspec.hash"); that->pack(); - that->hash_ = mkhash_init; + long hash_ = mkhash_init; for (auto &c : that->chunks_) if (c.wire == NULL) { for (auto &v : c.data) - that->hash_ = mkhash(that->hash_, v); + hash_ = mkhash(hash_, v); } else { - that->hash_ = mkhash(that->hash_, c.wire->name.index_); - that->hash_ = mkhash(that->hash_, c.offset); - that->hash_ = mkhash(that->hash_, c.width); + hash_ = mkhash(hash_, c.wire->name.index_); + hash_ = mkhash(hash_, c.offset); + hash_ = mkhash(hash_, c.width); } - if (that->hash_ == 0) - that->hash_ = 1; + if (hash_ == 0) + hash_ = 1; + + return hash_; } void RTLIL::SigSpec::sort() @@ -4710,11 +4692,8 @@ bool RTLIL::SigSpec::operator <(const RTLIL::SigSpec &other) const if (chunks_.size() != other.chunks_.size()) return chunks_.size() < other.chunks_.size(); - updhash(); - other.updhash(); - - if (hash_ != other.hash_) - return hash_ < other.hash_; + if (hash() != other.hash()) + return hash() < other.hash(); for (size_t i = 0; i < chunks_.size(); i++) if (chunks_[i] != other.chunks_[i]) { @@ -4748,11 +4727,8 @@ bool RTLIL::SigSpec::operator ==(const RTLIL::SigSpec &other) const if (chunks_.size() != other.chunks_.size()) return false; - updhash(); - other.updhash(); - - if (hash_ != other.hash_) - return false; + if (hash() != other.hash()) + return hash() == other.hash(); for (size_t i = 0; i < chunks_.size(); i++) if (chunks_[i] != other.chunks_[i]) { diff --git a/kernel/rtlil.h b/kernel/rtlil.h index 179e892ec..327bc946a 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -843,7 +843,7 @@ struct RTLIL::SigSpec private: int width_; bool packed_; - unsigned long hash_; + // unsigned long hash_; union { std::vector chunks_; // LSB at index 0 std::vector bits_; // LSB at index 0 @@ -853,7 +853,6 @@ private: void unpack() const; void switch_to_packed() const; void switch_to_unpacked() const; - void updhash() const; inline bool packed() const { return packed_; @@ -869,14 +868,13 @@ private: friend struct RTLIL::Module; public: - SigSpec() : width_(0), packed_(true), hash_(0), chunks_() {} + SigSpec() : width_(0), packed_(true), chunks_() {} ~SigSpec() { if (packed_) chunks_.~vector(); else bits_.~vector(); } SigSpec(std::initializer_list parts); SigSpec(const Yosys::RTLIL::SigSpec &other) { packed_ = other.packed_; width_ = other.width_; - hash_ = other.hash_; if (packed_) { (void)new (&this->chunks_) std::vector(); chunks_ = other.chunks_; @@ -906,7 +904,6 @@ public: } width_ = other.width_; - hash_ = other.hash_; check(); return *this; } @@ -927,11 +924,7 @@ public: SigSpec(const std::set &bits); explicit SigSpec(bool bit); - size_t get_hash() const { - if (!hash_) hash(); - return hash_; - } - + size_t hash() const; inline const std::vector &chunks() const { pack(); return chunks_; } inline const std::vector &bits() const { inline_unpack(); return bits_; } @@ -1038,8 +1031,6 @@ public: operator std::vector() const { return bits(); } const RTLIL::SigBit &at(int offset, const RTLIL::SigBit &defval) { return offset < width_ ? (*this)[offset] : defval; } - unsigned int hash() const { if (!hash_) updhash(); return hash_; }; - #ifndef NDEBUG void check(Module *mod = nullptr) const; #else