mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-06 01:24:10 +00:00
51 lines
1.2 KiB
Plaintext
51 lines
1.2 KiB
Plaintext
pattern ql_dsp_macc
|
|
|
|
state <IdString> add_ba
|
|
state <IdString> mux_ab
|
|
|
|
state <int> mul_nusers
|
|
state <int> add_nusers
|
|
state <int> mux_nusers
|
|
state <int> ff_d_nusers
|
|
state <int> ff_q_nusers
|
|
|
|
match mul
|
|
select mul->type.in($mul)
|
|
select nusers(port(mul, \Y)) <= 3
|
|
set mul_nusers nusers(port(mul, \Y))
|
|
endmatch
|
|
|
|
match add
|
|
select add->type.in($add, $sub)
|
|
choice <IdString> AB {\A, \B}
|
|
define <IdString> BA (AB == \A ? \B : \A)
|
|
index <SigSpec> port(add, AB) === port(mul, \Y)
|
|
select nusers(port(add, \Y)) <= 3
|
|
set add_nusers nusers(port(add, \Y))
|
|
set add_ba BA
|
|
endmatch
|
|
|
|
match mux
|
|
select mux->type.in($mux)
|
|
choice <IdString> AB {\A, \B}
|
|
define <IdString> BA (AB == \A ? \B : \A)
|
|
index <SigSpec> port(mux, AB) === port(mul, \Y)
|
|
index <SigSpec> port(mux, BA) === port(add, \Y)
|
|
select nusers(port(mux, \Y)) <= 3
|
|
set mux_nusers nusers(port(mux, \Y))
|
|
set mux_ab AB
|
|
optional
|
|
endmatch
|
|
|
|
match ff
|
|
select ff->type.in($dff, $adff, $dffe, $adffe)
|
|
index <SigSpec> port(ff, \D) === (mux == nullptr ? port(add, \Y) : port(mux, \Y))
|
|
index <SigSpec> port(ff, \Q) === port(add, add_ba)
|
|
set ff_d_nusers nusers(port(ff, \D))
|
|
set ff_q_nusers nusers(port(ff, \Q))
|
|
endmatch
|
|
|
|
code
|
|
accept;
|
|
endcode
|