mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	Support CEM
This commit is contained in:
		
							parent
							
								
									80aec0f006
								
							
						
					
					
						commit
						e67e4a5ed6
					
				
					 2 changed files with 33 additions and 9 deletions
				
			
		|  | @ -39,6 +39,7 @@ void pack_xilinx_dsp(dict<SigBit, Cell*> &bit_to_driver, xilinx_dsp_pm &pm) | |||
| 	log("ffB:        %s\n", log_id(st.ffB, "--")); | ||||
| 	log("dsp:        %s\n", log_id(st.dsp, "--")); | ||||
| 	log("ffM:        %s\n", log_id(st.ffM, "--")); | ||||
| 	log("ffMmux:     %s\n", log_id(st.ffMmux, "--")); | ||||
| 	log("postAdd:    %s\n", log_id(st.postAdd, "--")); | ||||
| 	log("postAddMux: %s\n", log_id(st.postAddMux, "--")); | ||||
| 	log("ffP:        %s\n", log_id(st.ffP, "--")); | ||||
|  | @ -111,11 +112,12 @@ void pack_xilinx_dsp(dict<SigBit, Cell*> &bit_to_driver, xilinx_dsp_pm &pm) | |||
| 			SigSpec Q = st.ffM->getPort("\\Q"); | ||||
| 			P.replace(pm.sigmap(D), Q); | ||||
| 			cell->setParam("\\MREG", State::S1); | ||||
| 			if (st.ffM->type == "$dff") | ||||
| 			if (st.ffMmux) { | ||||
| 				cell->setPort("\\CEM", st.ffMmux->getPort("\\S")); | ||||
| 				pm.autoremove(st.ffMmux); | ||||
| 			} | ||||
| 			else | ||||
| 				cell->setPort("\\CEM", State::S1); | ||||
| 			//else if (st.ffP->type == "$dffe")
 | ||||
| 			//	cell->setPort("\\CEM", st.ffM->getPort("\\EN"));
 | ||||
| 			else log_abort(); | ||||
| 			pm.autoremove(st.ffM); | ||||
| 		} | ||||
| 		if (st.ffP) { | ||||
|  |  | |||
|  | @ -2,9 +2,8 @@ pattern xilinx_dsp | |||
| 
 | ||||
| state <SigBit> clock | ||||
| state <std::set<SigBit>> sigAset sigBset | ||||
| state <SigSpec> sigC sigM sigMused sigP sigPused | ||||
| state <Cell*> postAdd postAddMux | ||||
| state <IdString> postAddAB postAddMuxAB | ||||
| state <SigSpec> sigC sigM sigP sigPused | ||||
| state <IdString> ffMmuxAB postAddAB postAddMuxAB | ||||
| 
 | ||||
| match dsp | ||||
| 	select dsp->type.in(\DSP48E1) | ||||
|  | @ -70,22 +69,40 @@ code clock | |||
| 	} | ||||
| endcode | ||||
| 
 | ||||
| match ffMmux | ||||
| 	select ffMmux->type.in($mux) | ||||
| 	select nusers(port(ffMmux, \Y)) == 2 | ||||
| 	filter GetSize(port(ffMmux, \Y)) <= GetSize(sigM) | ||||
| 	choice <IdString> AB {\A, \B} | ||||
| 	filter port(ffMmux, AB) == sigM.extract(0, GetSize(port(ffMmux, \Y))) | ||||
| 	filter nusers(sigM.extract_end(GetSize(port(ffMmux, AB)))) <= 1 | ||||
| 	set ffMmuxAB AB | ||||
| 	optional | ||||
| endmatch | ||||
| 
 | ||||
| code sigM | ||||
| 	if (ffMmux) | ||||
| 		sigM = port(ffMmux, \Y); | ||||
| endcode | ||||
| 
 | ||||
| match ffM | ||||
| 	if param(dsp, \MREG).as_int() == 0 | ||||
| 	select ffM->type.in($dff) | ||||
| 	// DSP48E1 does not support clock inversion | ||||
| 	select param(ffM, \CLK_POLARITY).as_bool() | ||||
| 	select nusers(port(ffM, \D)) == 2 | ||||
| 	//index <SigSpec> port(ffM, \D) === sigM.extract(0, GetSize(port(ffM, \D))) // TODO: Why doesn't this work!?! | ||||
| 	filter GetSize(port(ffM, \D)) <= GetSize(sigM) | ||||
| 	filter port(ffM, \D) == sigM.extract(0, GetSize(port(ffM, \D))) | ||||
| 	filter nusers(sigM.extract_end(GetSize(port(ffM, \D)))) <= 1 | ||||
| 	// Check ffMmux (when present) is a $dff enable mux | ||||
| 	filter !ffMmux || port(ffM, \Q) == port(ffMmux, ffMmuxAB == \A ? \B : \A) | ||||
| 	optional | ||||
| endmatch | ||||
| 
 | ||||
| code clock sigM sigP | ||||
| 	if (ffM) { | ||||
| 		sigM = port(ffM, \Q); | ||||
| 
 | ||||
| 		for (auto b : sigM) | ||||
| 			if (b.wire->get_bool_attribute(\keep)) | ||||
| 				reject; | ||||
|  | @ -97,6 +114,9 @@ code clock sigM sigP | |||
| 
 | ||||
| 		clock = c; | ||||
| 	} | ||||
| 	// Cannot have ffMmux enable mux without ffM | ||||
| 	else if (ffMmux) | ||||
| 		reject; | ||||
| 
 | ||||
| 	sigP = sigM; | ||||
| endcode | ||||
|  | @ -108,7 +128,9 @@ match postAdd | |||
| 	select postAdd->type.in($add) | ||||
| 	select param(postAdd, \A_SIGNED).as_bool() && param(postAdd, \B_SIGNED).as_bool() | ||||
| 	choice <IdString> AB {\A, \B} | ||||
| 	select nusers(port(postAdd, AB)) == 2 | ||||
| 	select nusers(port(postAdd, AB)) <= 3 | ||||
| 	filter ffMmux || nusers(port(postAdd, AB)) == 2 | ||||
| 	filter !ffMmux || nusers(port(postAdd, AB)) == 3 | ||||
| 	filter GetSize(port(postAdd, AB)) <= GetSize(sigP) | ||||
| 	filter port(postAdd, AB) == sigP.extract(0, GetSize(port(postAdd, AB))) | ||||
| 	filter nusers(sigP.extract_end(GetSize(port(postAdd, AB)))) <= 1 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue