mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	Merge pull request #2326 from YosysHQ/mwk/peeopt-muldiv-sign
peepopt.muldiv: Add a signedness check.
This commit is contained in:
		
						commit
						16bb3fc8bb
					
				
					 2 changed files with 16 additions and 1 deletions
				
			
		|  | @ -1,16 +1,18 @@ | |||
| pattern muldiv | ||||
| 
 | ||||
| state <SigSpec> t x y | ||||
| state <bool> is_signed | ||||
| 
 | ||||
| match mul | ||||
| 	select mul->type == $mul | ||||
| 	select GetSize(port(mul, \A)) + GetSize(port(mul, \B)) <= GetSize(port(mul, \Y)) | ||||
| endmatch | ||||
| 
 | ||||
| code t x y | ||||
| code t x y is_signed | ||||
| 	t = port(mul, \Y); | ||||
| 	x = port(mul, \A); | ||||
| 	y = port(mul, \B); | ||||
| 	is_signed = param(mul, \A_SIGNED).as_bool(); | ||||
| 	branch; | ||||
| 	std::swap(x, y); | ||||
| endcode | ||||
|  | @ -19,6 +21,7 @@ match div | |||
| 	select div->type.in($div) | ||||
| 	index <SigSpec> port(div, \A) === t | ||||
| 	index <SigSpec> port(div, \B) === x | ||||
| 	filter param(div, \A_SIGNED).as_bool() == is_signed | ||||
| endmatch | ||||
| 
 | ||||
| code | ||||
|  |  | |||
							
								
								
									
										12
									
								
								tests/opt/bug2318.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								tests/opt/bug2318.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| read_verilog <<EOT | ||||
| module t(input [3:0] A, input [3:0] B, output signed [3:0] Y); | ||||
| 
 | ||||
| wire [7:0] P = A * B; | ||||
| wire signed [7:0] SP = P; | ||||
| wire signed [3:0] SB = B; | ||||
| assign Y = SP / SB; | ||||
| 
 | ||||
| endmodule | ||||
| EOT | ||||
| 
 | ||||
| equiv_opt -assert peepopt | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue