3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-08-03 18:00:24 +00:00
This commit is contained in:
Robert O'Callahan 2025-07-31 13:22:05 +02:00 committed by GitHub
commit 40d311e36f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -451,16 +451,21 @@ class dict {
return 1; return 1;
} }
int do_lookup(const K &key, Hasher::hash_t &hash) const int do_lookup(const K &key, Hasher::hash_t &hash)
{ {
if (hashtable.empty()) if (hashtable.empty())
return -1; return -1;
if (entries.size() * hashtable_size_trigger > hashtable.size()) { if (entries.size() * hashtable_size_trigger > hashtable.size()) {
((dict*)this)->do_rehash(); do_rehash();
hash = do_hash(key); hash = do_hash(key);
} }
return do_lookup_internal(key, hash);
}
int do_lookup_internal(const K &key, Hasher::hash_t hash) const
{
int index = hashtable[hash]; int index = hashtable[hash];
while (index >= 0 && !ops.cmp(entries[index].udata.first, key)) { while (index >= 0 && !ops.cmp(entries[index].udata.first, key)) {
@ -471,6 +476,14 @@ class dict {
return index; return index;
} }
int do_lookup_no_rehash(const K &key, Hasher::hash_t hash) const
{
if (hashtable.empty())
return -1;
return do_lookup_internal(key, hash);
}
int do_insert(const K &key, Hasher::hash_t &hash) int do_insert(const K &key, Hasher::hash_t &hash)
{ {
if (hashtable.empty()) { if (hashtable.empty()) {
@ -694,14 +707,14 @@ public:
int count(const K &key) const int count(const K &key) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
return i < 0 ? 0 : 1; return i < 0 ? 0 : 1;
} }
int count(const K &key, const_iterator it) const int count(const K &key, const_iterator it) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
return i < 0 || i > it.index ? 0 : 1; return i < 0 || i > it.index ? 0 : 1;
} }
@ -717,7 +730,7 @@ public:
const_iterator find(const K &key) const const_iterator find(const K &key) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
if (i < 0) if (i < 0)
return end(); return end();
return const_iterator(this, i); return const_iterator(this, i);
@ -735,7 +748,7 @@ public:
const T& at(const K &key) const const T& at(const K &key) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
if (i < 0) if (i < 0)
throw std::out_of_range("dict::at()"); throw std::out_of_range("dict::at()");
return entries[i].udata.second; return entries[i].udata.second;
@ -744,7 +757,7 @@ public:
const T& at(const K &key, const T &defval) const const T& at(const K &key, const T &defval) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
if (i < 0) if (i < 0)
return defval; return defval;
return entries[i].udata.second; return entries[i].udata.second;
@ -906,16 +919,21 @@ protected:
return 1; return 1;
} }
int do_lookup(const K &key, Hasher::hash_t &hash) const int do_lookup(const K &key, Hasher::hash_t &hash)
{ {
if (hashtable.empty()) if (hashtable.empty())
return -1; return -1;
if (entries.size() * hashtable_size_trigger > hashtable.size()) { if (entries.size() * hashtable_size_trigger > hashtable.size()) {
((pool*)this)->do_rehash(); do_rehash();
hash = do_hash(key); hash = do_hash(key);
} }
return do_lookup_internal(key, hash);
}
int do_lookup_internal(const K &key, Hasher::hash_t hash) const
{
int index = hashtable[hash]; int index = hashtable[hash];
while (index >= 0 && !ops.cmp(entries[index].udata, key)) { while (index >= 0 && !ops.cmp(entries[index].udata, key)) {
@ -926,6 +944,14 @@ protected:
return index; return index;
} }
int do_lookup_no_rehash(const K &key, Hasher::hash_t hash) const
{
if (hashtable.empty())
return -1;
return do_lookup_internal(key, hash);
}
int do_insert(const K &value, Hasher::hash_t &hash) int do_insert(const K &value, Hasher::hash_t &hash)
{ {
if (hashtable.empty()) { if (hashtable.empty()) {
@ -1087,14 +1113,14 @@ public:
int count(const K &key) const int count(const K &key) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
return i < 0 ? 0 : 1; return i < 0 ? 0 : 1;
} }
int count(const K &key, const_iterator it) const int count(const K &key, const_iterator it) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
return i < 0 || i > it.index ? 0 : 1; return i < 0 || i > it.index ? 0 : 1;
} }
@ -1110,7 +1136,7 @@ public:
const_iterator find(const K &key) const const_iterator find(const K &key) const
{ {
Hasher::hash_t hash = do_hash(key); Hasher::hash_t hash = do_hash(key);
int i = do_lookup(key, hash); int i = do_lookup_no_rehash(key, hash);
if (i < 0) if (i < 0)
return end(); return end();
return const_iterator(this, i); return const_iterator(this, i);
@ -1222,7 +1248,7 @@ public:
int at(const K &key) const int at(const K &key) const
{ {
Hasher::hash_t hash = database.do_hash(key); Hasher::hash_t hash = database.do_hash(key);
int i = database.do_lookup(key, hash); int i = database.do_lookup_no_rehash(key, hash);
if (i < 0) if (i < 0)
throw std::out_of_range("idict::at()"); throw std::out_of_range("idict::at()");
return i + offset; return i + offset;
@ -1231,7 +1257,7 @@ public:
int at(const K &key, int defval) const int at(const K &key, int defval) const
{ {
Hasher::hash_t hash = database.do_hash(key); Hasher::hash_t hash = database.do_hash(key);
int i = database.do_lookup(key, hash); int i = database.do_lookup_no_rehash(key, hash);
if (i < 0) if (i < 0)
return defval; return defval;
return i + offset; return i + offset;
@ -1240,7 +1266,7 @@ public:
int count(const K &key) const int count(const K &key) const
{ {
Hasher::hash_t hash = database.do_hash(key); Hasher::hash_t hash = database.do_hash(key);
int i = database.do_lookup(key, hash); int i = database.do_lookup_no_rehash(key, hash);
return i < 0 ? 0 : 1; return i < 0 ? 0 : 1;
} }