mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	share: Cleanup and additional testing
Fixes a typo and adds another test case that triggers the fallback behavior as the existing tests all trigger the new optimization.
This commit is contained in:
		
							parent
							
								
									7593b5b224
								
							
						
					
					
						commit
						4b273a4ae9
					
				
					 3 changed files with 36 additions and 9 deletions
				
			
		|  | @ -1013,10 +1013,10 @@ struct ShareWorker | ||||||
| 		return bits; | 		return bits; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bool onesided_restrict_activiation_patterns( | 	bool onesided_restrict_activation_patterns( | ||||||
| 			pool<ssc_pair_t> &activation_patterns, const pool<std::pair<SigBit, State>> &other_bits) | 			pool<ssc_pair_t> &activation_patterns, const pool<std::pair<SigBit, State>> &other_bits) | ||||||
| 	{ | 	{ | ||||||
| 		pool<ssc_pair_t> new_activiation_patterns; | 		pool<ssc_pair_t> new_activation_patterns; | ||||||
| 
 | 
 | ||||||
| 		bool simplified = false; | 		bool simplified = false; | ||||||
| 
 | 
 | ||||||
|  | @ -1032,22 +1032,22 @@ struct ShareWorker | ||||||
| 					simplified = true; | 					simplified = true; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			new_activiation_patterns.emplace(std::move(new_pair)); | 			new_activation_patterns.emplace(std::move(new_pair)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		activation_patterns = std::move(new_activiation_patterns); | 		activation_patterns = std::move(new_activation_patterns); | ||||||
| 		return simplified; | 		return simplified; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Only valid if the patterns on their own (i.e. without considering their input cone) are mutually exclusive!
 | 	// Only valid if the patterns on their own (i.e. without considering their input cone) are mutually exclusive!
 | ||||||
| 	bool restrict_activiation_patterns(pool<ssc_pair_t> &activation_patterns, pool<ssc_pair_t> &other_activation_patterns) | 	bool restrict_activation_patterns(pool<ssc_pair_t> &activation_patterns, pool<ssc_pair_t> &other_activation_patterns) | ||||||
| 	{ | 	{ | ||||||
| 		pool<std::pair<SigBit, State>> bits = pattern_bits(activation_patterns); | 		pool<std::pair<SigBit, State>> bits = pattern_bits(activation_patterns); | ||||||
| 		pool<std::pair<SigBit, State>> other_bits = pattern_bits(other_activation_patterns); | 		pool<std::pair<SigBit, State>> other_bits = pattern_bits(other_activation_patterns); | ||||||
| 
 | 
 | ||||||
| 		bool simplified = false; | 		bool simplified = false; | ||||||
| 		simplified |= onesided_restrict_activiation_patterns(activation_patterns, other_bits); | 		simplified |= onesided_restrict_activation_patterns(activation_patterns, other_bits); | ||||||
| 		simplified |= onesided_restrict_activiation_patterns(other_activation_patterns, bits); | 		simplified |= onesided_restrict_activation_patterns(other_activation_patterns, bits); | ||||||
| 
 | 
 | ||||||
| 		optimize_activation_patterns(activation_patterns); | 		optimize_activation_patterns(activation_patterns); | ||||||
| 		optimize_activation_patterns(other_activation_patterns); | 		optimize_activation_patterns(other_activation_patterns); | ||||||
|  | @ -1401,7 +1401,7 @@ struct ShareWorker | ||||||
| 				} else { | 				} else { | ||||||
| 					log("      According to the SAT solver this pair of cells can be shared. (Pattern only case)\n"); | 					log("      According to the SAT solver this pair of cells can be shared. (Pattern only case)\n"); | ||||||
| 
 | 
 | ||||||
| 					if (restrict_activiation_patterns(optimized_cell_activation_patterns, optimized_other_cell_activation_patterns)) { | 					if (restrict_activation_patterns(optimized_cell_activation_patterns, optimized_other_cell_activation_patterns)) { | ||||||
| 						for (auto &p : optimized_cell_activation_patterns) | 						for (auto &p : optimized_cell_activation_patterns) | ||||||
| 							log("      Simplified activation pattern for cell %s: %s = %s\n", log_id(cell), log_signal(p.first), log_signal(p.second)); | 							log("      Simplified activation pattern for cell %s: %s = %s\n", log_id(cell), log_signal(p.first), log_signal(p.second)); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -30,3 +30,26 @@ module test_2( | ||||||
| 	end | 	end | ||||||
| endmodule | endmodule | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | module test_3( | ||||||
|  | 	input [3:0] s, | ||||||
|  | 	input [7:0] a, b, c, | ||||||
|  | 	output reg [7:0] y0, | ||||||
|  | 	output reg [7:0] y1, | ||||||
|  | 	output reg [7:0] y2, | ||||||
|  | 	output reg [7:0] y3, | ||||||
|  | ); | ||||||
|  | 	wire is_onehot = s & (s - 1); | ||||||
|  | 
 | ||||||
|  | 	always @* begin | ||||||
|  | 		y0 <= 0; | ||||||
|  | 		y1 <= 0; | ||||||
|  | 		y2 <= 0; | ||||||
|  | 		y3 <= 0; | ||||||
|  | 		if (s < 3) y0 <= b / c; | ||||||
|  | 		if (3 <= s && s < 6) y1 <= c / b; | ||||||
|  | 		if (6 <= s && s < 9) y2 <= a / b; | ||||||
|  | 		if (9 <= s && s < 12) y3 <= b / a; | ||||||
|  | 	end | ||||||
|  | endmodule | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -3,11 +3,13 @@ proc;; | ||||||
| 
 | 
 | ||||||
| copy test_1 gold_1 | copy test_1 gold_1 | ||||||
| copy test_2 gold_2 | copy test_2 gold_2 | ||||||
| share test_1 test_2;; | copy test_3 gold_3 | ||||||
|  | share test_1 test_2 test_3;; | ||||||
| 
 | 
 | ||||||
| select -assert-count 1 test_1/t:$mul | select -assert-count 1 test_1/t:$mul | ||||||
| select -assert-count 1 test_2/t:$mul | select -assert-count 1 test_2/t:$mul | ||||||
| select -assert-count 1 test_2/t:$div | select -assert-count 1 test_2/t:$div | ||||||
|  | select -assert-count 1 test_3/t:$div | ||||||
| 
 | 
 | ||||||
| miter -equiv -flatten -make_outputs -make_outcmp gold_1 test_1 miter_1 | miter -equiv -flatten -make_outputs -make_outcmp gold_1 test_1 miter_1 | ||||||
| sat -verify -prove trigger 0 -show-inputs -show-outputs miter_1 | sat -verify -prove trigger 0 -show-inputs -show-outputs miter_1 | ||||||
|  | @ -15,3 +17,5 @@ sat -verify -prove trigger 0 -show-inputs -show-outputs miter_1 | ||||||
| miter -equiv -flatten -make_outputs -make_outcmp gold_2 test_2 miter_2 | miter -equiv -flatten -make_outputs -make_outcmp gold_2 test_2 miter_2 | ||||||
| sat -verify -prove trigger 0 -show-inputs -show-outputs miter_2 | sat -verify -prove trigger 0 -show-inputs -show-outputs miter_2 | ||||||
| 
 | 
 | ||||||
|  | miter -equiv -flatten -make_outputs -make_outcmp gold_3 test_3 miter_3 | ||||||
|  | sat -verify -prove trigger 0 -show-inputs -show-outputs miter_3 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue