mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Speed up OptMergePass by 1.7x.
The main speedup comes from swithing from using a SHA1 hash to std::hash<std::string>. There is no need to use an expensive cryptographic hash for fingerprinting in this context.
This commit is contained in:
		
							parent
							
								
									7aa26b3a0b
								
							
						
					
					
						commit
						bce984fa60
					
				
					 3 changed files with 15 additions and 12 deletions
				
			
		|  | @ -56,7 +56,7 @@ struct CellTypes | ||||||
| 		setup_stdcells_mem(); | 		setup_stdcells_mem(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void setup_type(RTLIL::IdString type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs, bool is_evaluable = false) | 	void setup_type(const RTLIL::IdString& type, const pool<RTLIL::IdString> &inputs, const pool<RTLIL::IdString> &outputs, bool is_evaluable = false) | ||||||
| 	{ | 	{ | ||||||
| 		CellType ct = {type, inputs, outputs, is_evaluable}; | 		CellType ct = {type, inputs, outputs, is_evaluable}; | ||||||
| 		cell_types[ct.type] = ct; | 		cell_types[ct.type] = ct; | ||||||
|  | @ -298,24 +298,24 @@ struct CellTypes | ||||||
| 		cell_types.clear(); | 		cell_types.clear(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool cell_known(RTLIL::IdString type) const | 	bool cell_known(const RTLIL::IdString& type) const | ||||||
| 	{ | 	{ | ||||||
| 		return cell_types.count(type) != 0; | 		return cell_types.count(type) != 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool cell_output(RTLIL::IdString type, RTLIL::IdString port) const | 	bool cell_output(const RTLIL::IdString& type, const RTLIL::IdString& port) const | ||||||
| 	{ | 	{ | ||||||
| 		auto it = cell_types.find(type); | 		auto it = cell_types.find(type); | ||||||
| 		return it != cell_types.end() && it->second.outputs.count(port) != 0; | 		return it != cell_types.end() && it->second.outputs.count(port) != 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool cell_input(RTLIL::IdString type, RTLIL::IdString port) const | 	bool cell_input(const RTLIL::IdString& type, const RTLIL::IdString& port) const | ||||||
| 	{ | 	{ | ||||||
| 		auto it = cell_types.find(type); | 		auto it = cell_types.find(type); | ||||||
| 		return it != cell_types.end() && it->second.inputs.count(port) != 0; | 		return it != cell_types.end() && it->second.inputs.count(port) != 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool cell_evaluable(RTLIL::IdString type) const | 	bool cell_evaluable(const RTLIL::IdString& type) const | ||||||
| 	{ | 	{ | ||||||
| 		auto it = cell_types.find(type); | 		auto it = cell_types.find(type); | ||||||
| 		return it != cell_types.end() && it->second.is_evaluable; | 		return it != cell_types.end() && it->second.is_evaluable; | ||||||
|  |  | ||||||
|  | @ -308,10 +308,14 @@ namespace RTLIL | ||||||
| 		bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; } | 		bool operator!=(const char *rhs) const { return strcmp(c_str(), rhs) != 0; } | ||||||
| 
 | 
 | ||||||
| 		char operator[](size_t i) const { | 		char operator[](size_t i) const { | ||||||
| 			const char *p = c_str(); |                   const char *p = c_str(); | ||||||
|  | #ifndef NDEBUG | ||||||
| 			for (; i != 0; i--, p++) | 			for (; i != 0; i--, p++) | ||||||
| 				log_assert(*p != 0); | 				log_assert(*p != 0); | ||||||
| 			return *p; | 			return *p; | ||||||
|  | #else | ||||||
|  | 			return *(p + i); | ||||||
|  | #endif | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		std::string substr(size_t pos = 0, size_t len = std::string::npos) const { | 		std::string substr(size_t pos = 0, size_t len = std::string::npos) const { | ||||||
|  |  | ||||||
|  | @ -41,7 +41,7 @@ struct OptMergeWorker | ||||||
| 
 | 
 | ||||||
| 	CellTypes ct; | 	CellTypes ct; | ||||||
| 	int total_count; | 	int total_count; | ||||||
| 	SHA1 checksum; |         using FingerPrint = std::hash<std::string>::result_type; | ||||||
| 
 | 
 | ||||||
| 	static void sort_pmux_conn(dict<RTLIL::IdString, RTLIL::SigSpec> &conn) | 	static void sort_pmux_conn(dict<RTLIL::IdString, RTLIL::SigSpec> &conn) | ||||||
| 	{ | 	{ | ||||||
|  | @ -78,7 +78,7 @@ struct OptMergeWorker | ||||||
| 		return str; | 		return str; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	std::string hash_cell_parameters_and_connections(const RTLIL::Cell *cell) |         FingerPrint hash_cell_parameters_and_connections(const RTLIL::Cell *cell) | ||||||
| 	{ | 	{ | ||||||
| 		vector<string> hash_conn_strings; | 		vector<string> hash_conn_strings; | ||||||
| 		std::string hash_string = cell->type.str() + "\n"; | 		std::string hash_string = cell->type.str() + "\n"; | ||||||
|  | @ -149,8 +149,7 @@ struct OptMergeWorker | ||||||
| 		for (auto it : hash_conn_strings) | 		for (auto it : hash_conn_strings) | ||||||
| 			hash_string += it; | 			hash_string += it; | ||||||
| 
 | 
 | ||||||
| 		checksum.update(hash_string); | 		return std::hash<std::string>{}(hash_string); | ||||||
| 		return checksum.final(); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool compare_cell_parameters_and_connections(const RTLIL::Cell *cell1, const RTLIL::Cell *cell2) | 	bool compare_cell_parameters_and_connections(const RTLIL::Cell *cell1, const RTLIL::Cell *cell2) | ||||||
|  | @ -268,13 +267,13 @@ struct OptMergeWorker | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			did_something = false; | 			did_something = false; | ||||||
| 			dict<std::string, RTLIL::Cell*> sharemap; |                         std::unordered_map<FingerPrint, RTLIL::Cell*> sharemap; | ||||||
| 			for (auto cell : cells) | 			for (auto cell : cells) | ||||||
| 			{ | 			{ | ||||||
| 				if ((!mode_share_all && !ct.cell_known(cell->type)) || !cell->known()) | 				if ((!mode_share_all && !ct.cell_known(cell->type)) || !cell->known()) | ||||||
| 					continue; | 					continue; | ||||||
| 
 | 
 | ||||||
| 				auto hash = hash_cell_parameters_and_connections(cell); | 				FingerPrint hash = hash_cell_parameters_and_connections(cell); | ||||||
| 				auto r = sharemap.insert(std::make_pair(hash, cell)); | 				auto r = sharemap.insert(std::make_pair(hash, cell)); | ||||||
| 				if (!r.second) { | 				if (!r.second) { | ||||||
| 					if (compare_cell_parameters_and_connections(cell, r.first->second)) { | 					if (compare_cell_parameters_and_connections(cell, r.first->second)) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue