mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Added $dffe cell type
This commit is contained in:
		
							parent
							
								
									fad9cec47b
								
							
						
					
					
						commit
						f1764b4fe9
					
				
					 4 changed files with 54 additions and 1 deletions
				
			
		|  | @ -752,6 +752,17 @@ namespace { | |||
| 				return; | ||||
| 			} | ||||
| 
 | ||||
| 			if (cell->type == "$dffe") { | ||||
| 				param_bool("\\CLK_POLARITY"); | ||||
| 				param_bool("\\EN_POLARITY"); | ||||
| 				port("\\CLK", 1); | ||||
| 				port("\\EN", 1); | ||||
| 				port("\\D", param("\\WIDTH")); | ||||
| 				port("\\Q", param("\\WIDTH")); | ||||
| 				check_expected(); | ||||
| 				return; | ||||
| 			} | ||||
| 
 | ||||
| 			if (cell->type == "$dffsr") { | ||||
| 				param_bool("\\CLK_POLARITY"); | ||||
| 				param_bool("\\SET_POLARITY"); | ||||
|  |  | |||
|  | @ -302,6 +302,28 @@ static void simplemap_dff(RTLIL::Module *module, RTLIL::Cell *cell) | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void simplemap_dffe(RTLIL::Module *module, RTLIL::Cell *cell) | ||||
| { | ||||
| 	int width = cell->parameters.at("\\WIDTH").as_int(); | ||||
| 	char clk_pol = cell->parameters.at("\\CLK_POLARITY").as_bool() ? 'P' : 'N'; | ||||
| 	char en_pol = cell->parameters.at("\\EN_POLARITY").as_bool() ? 'P' : 'N'; | ||||
| 
 | ||||
| 	RTLIL::SigSpec sig_clk = cell->getPort("\\CLK"); | ||||
| 	RTLIL::SigSpec sig_en = cell->getPort("\\EN"); | ||||
| 	RTLIL::SigSpec sig_d = cell->getPort("\\D"); | ||||
| 	RTLIL::SigSpec sig_q = cell->getPort("\\Q"); | ||||
| 
 | ||||
| 	std::string gate_type = stringf("$_DFFE_%c%c_", clk_pol, en_pol); | ||||
| 
 | ||||
| 	for (int i = 0; i < width; i++) { | ||||
| 		RTLIL::Cell *gate = module->addCell(NEW_ID, gate_type); | ||||
| 		gate->setPort("\\C", sig_clk); | ||||
| 		gate->setPort("\\E", sig_en); | ||||
| 		gate->setPort("\\D", sig_d[i]); | ||||
| 		gate->setPort("\\Q", sig_q[i]); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void simplemap_dffsr(RTLIL::Module *module, RTLIL::Cell *cell) | ||||
| { | ||||
| 	int width = cell->parameters.at("\\WIDTH").as_int(); | ||||
|  | @ -399,6 +421,7 @@ void simplemap_get_mappers(std::map<RTLIL::IdString, void(*)(RTLIL::Module*, RTL | |||
| 	mappers["$concat"]      = simplemap_concat; | ||||
| 	mappers["$sr"]          = simplemap_sr; | ||||
| 	mappers["$dff"]         = simplemap_dff; | ||||
| 	mappers["$dffe"]        = simplemap_dffe; | ||||
| 	mappers["$dffsr"]       = simplemap_dffsr; | ||||
| 	mappers["$adff"]        = simplemap_adff; | ||||
| 	mappers["$dlatch"]      = simplemap_dlatch; | ||||
|  |  | |||
|  | @ -1216,6 +1216,25 @@ end | |||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| // -------------------------------------------------------- | ||||
| 
 | ||||
| module \$dffe (CLK, EN, D, Q); | ||||
| 
 | ||||
| parameter WIDTH = 0; | ||||
| parameter CLK_POLARITY = 1'b1; | ||||
| parameter EN_POLARITY = 1'b1; | ||||
| 
 | ||||
| input CLK, EN; | ||||
| input [WIDTH-1:0] D; | ||||
| output reg [WIDTH-1:0] Q; | ||||
| wire pos_clk = CLK == CLK_POLARITY; | ||||
| 
 | ||||
| always @(posedge pos_clk) begin | ||||
| 	if (EN == EN_POLARITY) Q <= D; | ||||
| end | ||||
| 
 | ||||
| endmodule | ||||
| 
 | ||||
| // -------------------------------------------------------- | ||||
| `ifndef SIMLIB_NOSR | ||||
| 
 | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ module _90_simplemap_various; | |||
| endmodule | ||||
| 
 | ||||
| (* techmap_simplemap *) | ||||
| (* techmap_celltype = "$sr $dff $adff $dffsr $dlatch" *) | ||||
| (* techmap_celltype = "$sr $dff $dffe $adff $dffsr $dlatch" *) | ||||
| module _90_simplemap_registers; | ||||
| endmodule | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue