mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	Add specialized hash() for type dict and use a dict instead of a std::map for techmap_cache and techmap_do_cache.
				
					
				
			This commit is contained in:
		
							parent
							
								
									437f3fb342
								
							
						
					
					
						commit
						2fb4931e5b
					
				
					 3 changed files with 25 additions and 10 deletions
				
			
		|  | @ -19,6 +19,12 @@ | ||||||
| 
 | 
 | ||||||
| namespace hashlib { | 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_trigger = 2; | ||||||
| const int hashtable_size_factor = 3; | 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...>> { | template<typename... T> struct hash_ops<std::tuple<T...>> { | ||||||
| 	static inline bool cmp(std::tuple<T...> a, std::tuple<T...> b) { | 	static inline bool cmp(std::tuple<T...> a, std::tuple<T...> b) { | ||||||
| 		return a == b; | 		return a == b; | ||||||
|  | @ -191,11 +211,6 @@ inline int hashtable_size(int min_size) | ||||||
| 	throw std::length_error("hash table exceeded maximum 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> | template<typename K, typename T, typename OPS> | ||||||
| class dict | class dict | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -150,7 +150,7 @@ namespace RTLIL | ||||||
| 			if (!p[0]) | 			if (!p[0]) | ||||||
| 				return 0; | 				return 0; | ||||||
| 
 | 
 | ||||||
| 			log_assert(p[0] == '$' || p[0] == '\\'); | 			log_assert(p[0] == '$' || p[0] == '\\' || strncmp(p, "_TECHMAP_", strlen("_TECHMAP_")) == 0); | ||||||
| 			log_assert(p[1] != 0); | 			log_assert(p[1] != 0); | ||||||
| 
 | 
 | ||||||
| 			auto it = global_id_index_.find((char*)p); | 			auto it = global_id_index_.find((char*)p); | ||||||
|  |  | ||||||
|  | @ -63,8 +63,8 @@ void apply_prefix(IdString prefix, RTLIL::SigSpec &sig, RTLIL::Module *module) | ||||||
| struct TechmapWorker | struct TechmapWorker | ||||||
| { | { | ||||||
| 	dict<IdString, void(*)(RTLIL::Module*, RTLIL::Cell*)> simplemap_mappers; | 	dict<IdString, void(*)(RTLIL::Module*, RTLIL::Cell*)> simplemap_mappers; | ||||||
| 	std::map<std::pair<IdString, std::map<IdString, RTLIL::Const>>, RTLIL::Module*> techmap_cache; | 	dict<std::pair<IdString, dict<IdString, RTLIL::Const>>, RTLIL::Module*> techmap_cache; | ||||||
| 	std::map<RTLIL::Module*, bool> techmap_do_cache; | 	dict<RTLIL::Module*, bool> techmap_do_cache; | ||||||
| 	std::set<RTLIL::Module*, IdString::compare_ptr_by_name<RTLIL::Module>> module_queue; | 	std::set<RTLIL::Module*, IdString::compare_ptr_by_name<RTLIL::Module>> module_queue; | ||||||
| 	dict<Module*, SigMap> sigmaps; | 	dict<Module*, SigMap> sigmaps; | ||||||
| 
 | 
 | ||||||
|  | @ -568,7 +568,7 @@ struct TechmapWorker | ||||||
| 			{ | 			{ | ||||||
| 				IdString derived_name = tpl_name; | 				IdString derived_name = tpl_name; | ||||||
| 				RTLIL::Module *tpl = map->module(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)) | 				if (tpl->get_blackbox_attribute(ignore_wb)) | ||||||
| 					continue; | 					continue; | ||||||
|  | @ -778,7 +778,7 @@ struct TechmapWorker | ||||||
| 			use_wrapper_tpl:; | 			use_wrapper_tpl:; | ||||||
| 					// do not register techmap_wrap modules with techmap_cache
 | 					// do not register techmap_wrap modules with techmap_cache
 | ||||||
| 				} else { | 				} 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) { | 					if (techmap_cache.count(key) > 0) { | ||||||
| 						tpl = techmap_cache[key]; | 						tpl = techmap_cache[key]; | ||||||
| 					} else { | 					} else { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue