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;
}
};
+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;
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
{
struct TechmapWorker
{
dict<IdString, void(*)(RTLIL::Module*, RTLIL::Cell*)> simplemap_mappers;
- std::map<std::pair<IdString, std::map<IdString, RTLIL::Const>>, RTLIL::Module*> techmap_cache;
- std::map<RTLIL::Module*, bool> techmap_do_cache;
+ dict<std::pair<IdString, dict<IdString, RTLIL::Const>>, RTLIL::Module*> techmap_cache;
+ dict<RTLIL::Module*, bool> techmap_do_cache;
std::set<RTLIL::Module*, IdString::compare_ptr_by_name<RTLIL::Module>> module_queue;
dict<Module*, SigMap> sigmaps;
{
IdString derived_name = tpl_name;
RTLIL::Module *tpl = map->module(tpl_name);
- std::map<IdString, RTLIL::Const> parameters(cell->parameters.begin(), cell->parameters.end());
+ dict<IdString, RTLIL::Const> parameters(cell->parameters.begin(), cell->parameters.end());
if (tpl->get_blackbox_attribute(ignore_wb))
continue;
use_wrapper_tpl:;
// do not register techmap_wrap modules with techmap_cache
} else {
- std::pair<IdString, std::map<IdString, RTLIL::Const>> key(tpl_name, parameters);
+ std::pair<IdString, dict<IdString, RTLIL::Const>> key(tpl_name, parameters);
if (techmap_cache.count(key) > 0) {
tpl = techmap_cache[key];
} else {