mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	zinit: fix review comments from @mwkmwkmwk
This commit is contained in:
		
							parent
							
								
									091297b9ee
								
							
						
					
					
						commit
						c6afce7638
					
				
					 2 changed files with 37 additions and 9 deletions
				
			
		|  | @ -117,7 +117,7 @@ struct ZinitPass : public Pass { | ||||||
| 						const auto &d = initbits.at(sig_q[i]); | 						const auto &d = initbits.at(sig_q[i]); | ||||||
| 						initval.bits.push_back(d.first); | 						initval.bits.push_back(d.first); | ||||||
| 						const auto &b = d.second; | 						const auto &b = d.second; | ||||||
| 						b.wire->attributes.at(ID::init)[b.offset]; | 						b.wire->attributes.at(ID::init)[b.offset] = State::Sx; | ||||||
| 					} else | 					} else | ||||||
| 						initval.bits.push_back(all_mode ? State::S0 : State::Sx); | 						initval.bits.push_back(all_mode ? State::S0 : State::Sx); | ||||||
| 				} | 				} | ||||||
|  | @ -126,11 +126,11 @@ struct ZinitPass : public Pass { | ||||||
| 				initwire->attributes[ID::init] = initval; | 				initwire->attributes[ID::init] = initval; | ||||||
| 
 | 
 | ||||||
| 				for (int i = 0; i < GetSize(initwire); i++) | 				for (int i = 0; i < GetSize(initwire); i++) | ||||||
| 					if (initval.bits.at(i) == State::S1) | 					if (initval[i] == State::S1) | ||||||
| 					{ | 					{ | ||||||
| 						sig_d[i] = module->NotGate(NEW_ID, sig_d[i]); | 						sig_d[i] = module->NotGate(NEW_ID, sig_d[i]); | ||||||
| 						module->addNotGate(NEW_ID, SigSpec(initwire, i), sig_q[i]); | 						module->addNotGate(NEW_ID, SigSpec(initwire, i), sig_q[i]); | ||||||
| 						initwire->attributes[ID::init].bits.at(i) = State::S0; | 						initwire->attributes[ID::init][i] = State::S0; | ||||||
| 					} | 					} | ||||||
| 					else | 					else | ||||||
| 					{ | 					{ | ||||||
|  | @ -145,8 +145,9 @@ struct ZinitPass : public Pass { | ||||||
| 
 | 
 | ||||||
| 				if (cell->type == ID($adff)) { | 				if (cell->type == ID($adff)) { | ||||||
| 					auto val = cell->getParam(ID::ARST_VALUE); | 					auto val = cell->getParam(ID::ARST_VALUE); | ||||||
| 					for (auto &b : val) | 					for (int i = 0; i < GetSize(initwire); i++) | ||||||
| 						b = (b == State::S1 ? State::S0 : State::S1); | 						if (initval[i] == State::S1) | ||||||
|  | 							val[i] = (val[i] == State::S1 ? State::S0 : State::S1); | ||||||
| 					cell->setParam(ID::ARST_VALUE, std::move(val)); | 					cell->setParam(ID::ARST_VALUE, std::move(val)); | ||||||
| 				} | 				} | ||||||
| 				else if (cell->type.in(ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_), | 				else if (cell->type.in(ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_), | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| read_verilog -icells <<EOT | read_verilog -icells <<EOT | ||||||
| module top(input C, R, input [1:0] D, (* init = {12{1'b1}} *) output [11:0] Q); | module top(input C, R, input [1:0] D, (* init = {2'b10, 2'b01, 1'b1, {8{1'b1}}} *) output [12:0] Q); | ||||||
| 
 | 
 | ||||||
| (* init = 1'b1 *) | (* init = 1'b1 *) | ||||||
| wire unused; | wire unused; | ||||||
|  | @ -13,11 +13,38 @@ $_DFF_PN1_ dff5 (.C(C), .D(D[0]), .R(R), .Q(Q[5])); | ||||||
| $_DFF_PP0_ dff6 (.C(C), .D(D[0]), .R(R), .Q(Q[6])); | $_DFF_PP0_ dff6 (.C(C), .D(D[0]), .R(R), .Q(Q[6])); | ||||||
| $_DFF_PP1_ dff7 (.C(C), .D(D[0]), .R(R), .Q(Q[7])); | $_DFF_PP1_ dff7 (.C(C), .D(D[0]), .R(R), .Q(Q[7])); | ||||||
| 
 | 
 | ||||||
| $adff #(.WIDTH(2), .CLK_POLARITY(1), .ARST_POLARITY(1'b0), .ARST_VALUE(2'd2)) dff8 (.CLK(C), .ARST(R), .D(D), .Q(Q[9:8])); | $adff #(.WIDTH(2), .CLK_POLARITY(1), .ARST_POLARITY(1'b0), .ARST_VALUE(2'b10)) dff8 (.CLK(C), .ARST(R), .D(D), .Q(Q[10:9])); | ||||||
| $adff #(.WIDTH(2), .CLK_POLARITY(0), .ARST_POLARITY(1'b1), .ARST_VALUE(2'd1)) dff9 (.CLK(C), .ARST(R), .D(D), .Q(Q[11:10])); | $adff #(.WIDTH(2), .CLK_POLARITY(0), .ARST_POLARITY(1'b1), .ARST_VALUE(2'b01)) dff9 (.CLK(C), .ARST(R), .D(D), .Q(Q[12:11])); | ||||||
| endmodule | endmodule | ||||||
| EOT | EOT | ||||||
| equiv_opt -map +/simcells.v -multiclock zinit | equiv_opt -assert -map +/simcells.v -multiclock zinit | ||||||
| design -load postopt | design -load postopt | ||||||
| 
 | 
 | ||||||
|  | select -assert-count 20 t:$_NOT_ | ||||||
| select -assert-count 1 w:unused a:init %i | select -assert-count 1 w:unused a:init %i | ||||||
|  | select -assert-count 1 w:Q a:init=13'bxxxx1xxxxxxxx %i | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | design -reset | ||||||
|  | read_verilog -icells <<EOT | ||||||
|  | module top(input C, R, input [1:0] D, (* init = {2'bx0, 2'b0x, 1'b1, {8{1'b0}}} *) output [12:0] Q); | ||||||
|  | 
 | ||||||
|  | (* init = 1'b1 *) | ||||||
|  | wire unused; | ||||||
|  | 
 | ||||||
|  | $_DFF_NN0_ dff0 (.C(C), .D(D[0]), .R(R), .Q(Q[0])); | ||||||
|  | $_DFF_NN1_ dff1 (.C(C), .D(D[0]), .R(R), .Q(Q[1])); | ||||||
|  | $_DFF_NP0_ dff2 (.C(C), .D(D[0]), .R(R), .Q(Q[2])); | ||||||
|  | $_DFF_NP1_ dff3 (.C(C), .D(D[0]), .R(R), .Q(Q[3])); | ||||||
|  | $_DFF_PN0_ dff4 (.C(C), .D(D[0]), .R(R), .Q(Q[4])); | ||||||
|  | $_DFF_PN1_ dff5 (.C(C), .D(D[0]), .R(R), .Q(Q[5])); | ||||||
|  | $_DFF_PP0_ dff6 (.C(C), .D(D[0]), .R(R), .Q(Q[6])); | ||||||
|  | $_DFF_PP1_ dff7 (.C(C), .D(D[0]), .R(R), .Q(Q[7])); | ||||||
|  | 
 | ||||||
|  | $adff #(.WIDTH(2), .CLK_POLARITY(1), .ARST_POLARITY(1'b0), .ARST_VALUE(2'b10)) dff8 (.CLK(C), .ARST(R), .D(D), .Q(Q[10:9])); | ||||||
|  | $adff #(.WIDTH(2), .CLK_POLARITY(0), .ARST_POLARITY(1'b1), .ARST_VALUE(2'b01)) dff9 (.CLK(C), .ARST(R), .D(D), .Q(Q[12:11])); | ||||||
|  | endmodule | ||||||
|  | EOT | ||||||
|  | select -assert-count 0 t:$_NOT_ | ||||||
|  | select -assert-count 1 w:unused a:init %i | ||||||
|  | select -assert-count 1 w:Q a:init=13'bx00x100000000 %i | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue