aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/hashlib.h
diff options
context:
space:
mode:
authorAlberto Gonzalez <boqwxp@airmail.cc>2020-04-14 18:09:05 +0000
committerAlberto Gonzalez <boqwxp@airmail.cc>2020-05-14 20:06:53 +0000
commit2fb4931e5be2c2a0c80ffbca73ad74ebb8c9032f (patch)
tree04317d2d2c2ce5594d466fc38b5a138aa7c61314 /kernel/hashlib.h
parent437f3fb342f91d0c1a1a923c92312301a03cb07d (diff)
downloadyosys-2fb4931e5be2c2a0c80ffbca73ad74ebb8c9032f.tar.gz
yosys-2fb4931e5be2c2a0c80ffbca73ad74ebb8c9032f.tar.bz2
yosys-2fb4931e5be2c2a0c80ffbca73ad74ebb8c9032f.zip
Add specialized `hash()` for type `dict` and use a `dict` instead of a `std::map` for `techmap_cache` and `techmap_do_cache`.
Diffstat (limited to 'kernel/hashlib.h')
-rw-r--r--kernel/hashlib.h25
1 files changed, 20 insertions, 5 deletions
diff --git a/kernel/hashlib.h b/kernel/hashlib.h
index 592d6e577..cdbad87c4 100644
--- a/kernel/hashlib.h
+++ b/kernel/hashlib.h
@@ -19,6 +19,12 @@
namespace hashlib {
+template<typename T> struct hash_ops;
+template<typename K, typename T, typename OPS = hash_ops<K>> class dict;
+template<typename K, int offset = 0, typename OPS = hash_ops<K>> class idict;
+template<typename K, typename OPS = hash_ops<K>> class pool;
+template<typename K, typename OPS = hash_ops<K>> class mfp;
+
const int hashtable_size_trigger = 2;
const int hashtable_size_factor = 3;
@@ -100,6 +106,20 @@ template<typename P, typename Q> struct hash_ops<std::pair<P, Q>> {
}
};
+template<typename P, typename Q> struct hash_ops<dict<P, Q>> {
+ static inline bool cmp(dict<P, Q> a, dict<P, Q> b) {
+ return a == b;
+ }
+ static inline unsigned int hash(dict<P, Q> a) {
+ unsigned int h = mkhash_init;
+ for (auto &it : a) {
+ h = mkhash(h, hash_ops<P>::hash(it.first));
+ h = mkhash(h, hash_ops<Q>::hash(it.second));
+ }
+ return h;
+ }
+};
+
template<typename... T> struct hash_ops<std::tuple<T...>> {
static inline bool cmp(std::tuple<T...> a, std::tuple<T...> b) {
return a == b;
@@ -191,11 +211,6 @@ inline int hashtable_size(int min_size)
throw std::length_error("hash table exceeded maximum size.");
}
-template<typename K, typename T, typename OPS = hash_ops<K>> class dict;
-template<typename K, int offset = 0, typename OPS = hash_ops<K>> class idict;
-template<typename K, typename OPS = hash_ops<K>> class pool;
-template<typename K, typename OPS = hash_ops<K>> class mfp;
-
template<typename K, typename T, typename OPS>
class dict
{