aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/hashmap.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/hashmap.h')
-rw-r--r--kernel/hashmap.h31
1 files changed, 25 insertions, 6 deletions
diff --git a/kernel/hashmap.h b/kernel/hashmap.h
index 91df68a71..729b4916c 100644
--- a/kernel/hashmap.h
+++ b/kernel/hashmap.h
@@ -23,6 +23,8 @@
#include <string>
#include <vector>
+#define YOSYS_HASHTABLE_SIZE_FACTOR 3
+
inline unsigned int mkhash(unsigned int a, unsigned int b) {
return ((a << 5) + a) ^ b;
}
@@ -81,8 +83,19 @@ struct hash_ptr_ops {
}
};
+struct hash_obj_ops {
+ bool cmp(const void *a, const void *b) const {
+ return a == b;
+ }
+ template<typename T>
+ unsigned int hash(const T *a) const {
+ return a->name.hash();
+ }
+};
+
inline int hashtable_size(int old_size)
{
+ // prime numbers, approx. in powers of two
if (old_size < 53) return 53;
if (old_size < 113) return 113;
if (old_size < 251) return 251;
@@ -144,7 +157,9 @@ class dict
entries.clear();
counter = other.size();
- int new_size = hashtable_size(counter);
+ int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * counter);
+ hashtable.resize(new_size);
+ new_size = new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1;
entries.reserve(new_size);
for (auto &it : other)
@@ -165,7 +180,6 @@ class dict
{
free_list = -1;
- hashtable.resize(entries.size());
for (auto &h : hashtable)
h = -1;
@@ -221,7 +235,9 @@ class dict
if (free_list < 0)
{
int i = entries.size();
- entries.resize(hashtable_size(i));
+ int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * entries.size());
+ hashtable.resize(new_size);
+ entries.resize(new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1);
entries[i].udata = value;
entries[i].set_next_used(0);
counter++;
@@ -473,7 +489,9 @@ class pool
entries.clear();
counter = other.size();
- int new_size = hashtable_size(counter);
+ int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * counter);
+ hashtable.resize(new_size);
+ new_size = new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1;
entries.reserve(new_size);
for (auto &it : other)
@@ -494,7 +512,6 @@ class pool
{
free_list = -1;
- hashtable.resize(entries.size());
for (auto &h : hashtable)
h = -1;
@@ -550,7 +567,9 @@ class pool
if (free_list < 0)
{
int i = entries.size();
- entries.resize(hashtable_size(i));
+ int new_size = hashtable_size(YOSYS_HASHTABLE_SIZE_FACTOR * entries.size());
+ hashtable.resize(new_size);
+ entries.resize(new_size / YOSYS_HASHTABLE_SIZE_FACTOR + 1);
entries[i].key = key;
entries[i].set_next_used(0);
counter++;