mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	ast: fixes #1710; do not generate RTLIL for unreachable ternary
This commit is contained in:
		
							parent
							
								
									825b96fdcf
								
							
						
					
					
						commit
						5bba9c3640
					
				
					 2 changed files with 52 additions and 9 deletions
				
			
		|  | @ -1338,6 +1338,18 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) | |||
| 				detectSignWidth(width_hint, sign_hint); | ||||
| 
 | ||||
| 			RTLIL::SigSpec cond = children[0]->genRTLIL(); | ||||
| 			RTLIL::SigSpec sig; | ||||
| 			if (cond.is_fully_const()) { | ||||
| 				if (cond.as_bool()) { | ||||
| 					sig = children[1]->genRTLIL(width_hint, sign_hint); | ||||
| 					widthExtend(this, sig, sig.size(), children[1]->is_signed); | ||||
| 				} | ||||
| 				else { | ||||
| 					sig = children[2]->genRTLIL(width_hint, sign_hint); | ||||
| 					widthExtend(this, sig, sig.size(), children[2]->is_signed); | ||||
| 				} | ||||
| 			} | ||||
| 			else { | ||||
| 				RTLIL::SigSpec val1 = children[1]->genRTLIL(width_hint, sign_hint); | ||||
| 				RTLIL::SigSpec val2 = children[2]->genRTLIL(width_hint, sign_hint); | ||||
| 
 | ||||
|  | @ -1349,7 +1361,8 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint) | |||
| 				widthExtend(this, val1, width, is_signed); | ||||
| 				widthExtend(this, val2, width, is_signed); | ||||
| 
 | ||||
| 			RTLIL::SigSpec sig = mux2rtlil(this, cond, val1, val2); | ||||
| 				sig = mux2rtlil(this, cond, val1, val2); | ||||
| 			} | ||||
| 
 | ||||
| 			if (sig.size() < width_hint) | ||||
| 				sig.extend_u0(width_hint, sign_hint); | ||||
|  |  | |||
							
								
								
									
										30
									
								
								tests/various/bug1710.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								tests/various/bug1710.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | |||
| logger -werror "out of bounds" | ||||
| read_verilog <<EOT | ||||
| module Example; | ||||
| 
 | ||||
|     parameter FLAG = 1; | ||||
|     wire [3:0] inp; | ||||
| 
 | ||||
|     reg out1; | ||||
|     initial out1 = FLAG ? &inp[2:0] : &inp[4:0]; | ||||
| 
 | ||||
|     reg out2; | ||||
|     initial | ||||
|         if (FLAG) | ||||
|             out2 = &inp[2:0]; | ||||
|         else | ||||
|             out2 = &inp[4:0]; | ||||
| 
 | ||||
|     wire out3; | ||||
|     assign out3 = FLAG ? &inp[2:0] : &inp[4:0]; | ||||
| 
 | ||||
|     wire out4; | ||||
|     generate | ||||
|         if (FLAG) | ||||
|             assign out4 = &inp[2:0]; | ||||
|         else | ||||
|             assign out4 = &inp[4:0]; | ||||
|     endgenerate | ||||
| 
 | ||||
| endmodule | ||||
| EOT | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue