mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	rtlil: speed up SigSpec::sort_and_unify()
std::set<> internally is often a red-black tree which is fairly expensive to create but fast to lookup. In the case of sort_and_unify(), a set<> is constructed as a temporary object to attempt to speed up lookups. Being a temporarily, however, the cost of creation far outweights the lookup improvement and is a net performance loss. Instead, sort the vector<> that already exists and then apply std::unique().
This commit is contained in:
		
							parent
							
								
									89dc40f162
								
							
						
					
					
						commit
						0265d7b100
					
				
					 1 changed files with 11 additions and 1 deletions
				
			
		|  | @ -2573,8 +2573,18 @@ void RTLIL::SigSpec::sort() | ||||||
| 
 | 
 | ||||||
| void RTLIL::SigSpec::sort_and_unify() | void RTLIL::SigSpec::sort_and_unify() | ||||||
| { | { | ||||||
|  | 	unpack(); | ||||||
| 	cover("kernel.rtlil.sigspec.sort_and_unify"); | 	cover("kernel.rtlil.sigspec.sort_and_unify"); | ||||||
| 	*this = this->to_sigbit_set(); | 
 | ||||||
|  | 	// A copy of the bits vector is used to prevent duplicating the logic from
 | ||||||
|  | 	// SigSpec::SigSpec(std::vector<SigBit>).  This incurrs an extra copy but
 | ||||||
|  | 	// that isn't showing up as significant in profiles.
 | ||||||
|  | 	std::vector<SigBit> unique_bits = bits_; | ||||||
|  | 	std::sort(unique_bits.begin(), unique_bits.end()); | ||||||
|  | 	auto last = std::unique(unique_bits.begin(), unique_bits.end()); | ||||||
|  | 	unique_bits.erase(last, unique_bits.end()); | ||||||
|  | 
 | ||||||
|  | 	*this = unique_bits; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void RTLIL::SigSpec::replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with) | void RTLIL::SigSpec::replace(const RTLIL::SigSpec &pattern, const RTLIL::SigSpec &with) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue