mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-30 19:22:31 +00:00 
			
		
		
		
	Fix WREDUCE on FF not fixing ARST_VALUE parameter.
Adds test case that fails without code change. Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									d55790909c
								
							
						
					
					
						commit
						25680f6a07
					
				
					 3 changed files with 37 additions and 0 deletions
				
			
		|  | @ -195,6 +195,19 @@ struct WreduceWorker | |||
| 		for (auto bit : sig_q) | ||||
| 			work_queue_bits.insert(bit); | ||||
| 
 | ||||
| 		// Narrow ARST_VALUE parameter to new size.
 | ||||
| 		//
 | ||||
| 		// Note: This works because earlier loop only removes signals from
 | ||||
| 		// the upper bits of the DFF.
 | ||||
| 		if(cell->parameters.count("\\ARST_VALUE") > 0) { | ||||
| 			RTLIL::Const old_arst_value = cell->parameters.at("\\ARST_VALUE"); | ||||
| 			std::vector<RTLIL::State> new_arst_value(GetSize(sig_q)); | ||||
| 			for(int i = 0; i < GetSize(sig_q); ++i) { | ||||
| 				new_arst_value[i] = old_arst_value[i]; | ||||
| 			} | ||||
| 			cell->parameters["\\ARST_VALUE"] = RTLIL::Const(new_arst_value); | ||||
| 		} | ||||
| 
 | ||||
| 		cell->setPort("\\D", sig_d); | ||||
| 		cell->setPort("\\Q", sig_q); | ||||
| 		cell->fixup_parameters(); | ||||
|  |  | |||
							
								
								
									
										21
									
								
								tests/opt/opt_ff.v
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								tests/opt/opt_ff.v
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| module top( | ||||
|     input clk, | ||||
|     input rst, | ||||
|     input [2:0] a, | ||||
|     output [1:0] b | ||||
| ); | ||||
|     reg [2:0] b_reg; | ||||
|     initial begin | ||||
|         b_reg <= 3'b0; | ||||
|     end | ||||
| 
 | ||||
|     assign b = b_reg[1:0]; | ||||
|     always @(posedge clk or posedge rst) begin | ||||
|         if(rst) begin | ||||
|             b_reg <= 3'b0; | ||||
|         end else begin | ||||
|             b_reg <= a; | ||||
|         end | ||||
|     end | ||||
| endmodule | ||||
| 
 | ||||
							
								
								
									
										3
									
								
								tests/opt/opt_ff.ys
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								tests/opt/opt_ff.ys
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| read_verilog opt_ff.v | ||||
| synth_ice40 | ||||
| ice40_unlut | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue