| 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 |