mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-11-04 13:29:12 +00:00 
			
		
		
		
	Use unextend lambda
This commit is contained in:
		
							parent
							
								
									b69512a5b9
								
							
						
					
					
						commit
						6a9205280f
					
				
					 1 changed files with 17 additions and 18 deletions
				
			
		| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
pattern xilinx_dsp
 | 
					pattern xilinx_dsp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					state <std::function<SigSpec(const SigSpec&, bool)>> unextend
 | 
				
			||||||
state <SigBit> clock
 | 
					state <SigBit> clock
 | 
				
			||||||
state <SigSpec> sigA sigffAmuxY sigB sigffBmuxY sigC sigD sigffDmuxY sigM sigP
 | 
					state <SigSpec> sigA sigffAmuxY sigB sigffBmuxY sigC sigD sigffDmuxY sigM sigP
 | 
				
			||||||
state <IdString> postAddAB postAddMuxAB
 | 
					state <IdString> postAddAB postAddMuxAB
 | 
				
			||||||
| 
						 | 
					@ -10,29 +11,26 @@ match dsp
 | 
				
			||||||
	select dsp->type.in(\DSP48E1)
 | 
						select dsp->type.in(\DSP48E1)
 | 
				
			||||||
endmatch
 | 
					endmatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
code sigA sigffAmuxY sigB sigffBmuxY sigD sigM
 | 
					code unextend sigA sigffAmuxY sigB sigffBmuxY sigC sigD sigffDmuxY sigM
 | 
				
			||||||
	sigA = port(dsp, \A);
 | 
						unextend = [](const SigSpec &sig, bool keep_sign) {
 | 
				
			||||||
		int i;
 | 
							int i;
 | 
				
			||||||
	for (i = GetSize(sigA)-1; i > 0; i--)
 | 
							for (i = GetSize(sig)-1; i > 0; i--)
 | 
				
			||||||
		if (sigA[i] != sigA[i-1])
 | 
								if (sig[i] != sig[i-1])
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
		// Do not remove non-const sign bit
 | 
							// Do not remove non-const sign bit
 | 
				
			||||||
	if (sigA[i].wire)
 | 
							if (!keep_sign && sig[i].wire)
 | 
				
			||||||
			++i;
 | 
								++i;
 | 
				
			||||||
	sigA.remove(i, GetSize(sigA)-i);
 | 
							return sig.extract(0, i);
 | 
				
			||||||
	sigB = port(dsp, \B);
 | 
						};
 | 
				
			||||||
	for (i = GetSize(sigB)-1; i > 0; i--)
 | 
						sigA = unextend(port(dsp, \A), false);
 | 
				
			||||||
		if (sigB[i] != sigB[i-1])
 | 
						sigB = unextend(port(dsp, \B), false);
 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
	// Do not remove non-const sign bit
 | 
					 | 
				
			||||||
	if (sigB[i].wire)
 | 
					 | 
				
			||||||
		++i;
 | 
					 | 
				
			||||||
	sigB.remove(i, GetSize(sigB)-i);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sigC = dsp->connections_.at(\C, SigSpec());
 | 
				
			||||||
	sigD = dsp->connections_.at(\D, SigSpec());
 | 
						sigD = dsp->connections_.at(\D, SigSpec());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SigSpec P = port(dsp, \P);
 | 
						SigSpec P = port(dsp, \P);
 | 
				
			||||||
	// Only care about those bits that are used
 | 
						// Only care about those bits that are used
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
	for (i = 0; i < GetSize(P); i++) {
 | 
						for (i = 0; i < GetSize(P); i++) {
 | 
				
			||||||
		if (nusers(P[i]) <= 1)
 | 
							if (nusers(P[i]) <= 1)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					@ -44,6 +42,7 @@ code sigA sigffAmuxY sigB sigffBmuxY sigD sigM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sigffAmuxY = SigSpec();
 | 
						sigffAmuxY = SigSpec();
 | 
				
			||||||
	sigffBmuxY = SigSpec();
 | 
						sigffBmuxY = SigSpec();
 | 
				
			||||||
 | 
						sigffDmuxY = SigSpec();
 | 
				
			||||||
endcode
 | 
					endcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
match ffAD
 | 
					match ffAD
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue