mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 04:28:18 +00:00
Use unextend lambda
This commit is contained in:
parent
b69512a5b9
commit
6a9205280f
|
@ -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…
Reference in a new issue