|  | pattern ql_bram_asymmetric_wider_read | 
|  |  | 
|  | state <SigSpec> mem_wr_data | 
|  | state <SigSpec> mem_wr_en | 
|  | state <SigSpec> mem_wr_addr | 
|  | state <SigSpec> mem_rd_data | 
|  | state <SigSpec> mem_rd_addr | 
|  | state <SigSpec> mux_ab | 
|  | state <SigSpec> mux_s | 
|  | state <SigSpec> mux_ba | 
|  | state <SigSpec> mux_input | 
|  | state <SigSpec> wr_data_shift_a | 
|  | state <SigSpec> wr_data_shift_b | 
|  | state <SigSpec> wr_en_and_a | 
|  | state <SigSpec> wr_en_and_b | 
|  | state <SigSpec> wr_en_and_y | 
|  | state <SigSpec> wr_en_shift_a | 
|  | state <SigSpec> wr_en_shift_b | 
|  | state <SigSpec> wr_en_shift_y | 
|  |  | 
|  | match mem | 
|  | select mem->type == ($mem_v2) | 
|  | // 2 because it is a primary output connected to one cell (rq port or $shiftx cell) | 
|  | select nusers(port(mem, \WR_DATA)) == 2 | 
|  | set mem_wr_data port(mem, \WR_DATA) | 
|  | set mem_wr_en port(mem, \WR_EN) | 
|  | set mem_wr_addr port(mem, \WR_ADDR) | 
|  | set mem_rd_data port(mem, \RD_DATA) | 
|  | set mem_rd_addr port(mem, \RD_ADDR) | 
|  | endmatch | 
|  |  | 
|  | match wr_en_and | 
|  | select wr_en_and->type == ($and) | 
|  | set wr_en_and_a port(wr_en_and, \A) | 
|  | set wr_en_and_b port(wr_en_and, \B) | 
|  | set wr_en_and_y port(wr_en_and, \Y) | 
|  | endmatch | 
|  |  | 
|  | match wr_en_shift | 
|  | select wr_en_shift->type.in($shl) | 
|  | set wr_en_shift_a port(wr_en_shift, \A) | 
|  | set wr_en_shift_b port(wr_en_shift, \B) | 
|  | set wr_en_shift_y port(wr_en_shift, \Y) | 
|  | endmatch | 
|  |  | 
|  | match mux | 
|  | select mux->type == ($mux) | 
|  | choice <IdString> AB {\A, \B} | 
|  | define <IdString> BA (AB == \A ? \B : \A) | 
|  | index <SigSpec> port(mux, \Y) === mem_wr_en | 
|  | index <SigSpec> port(mux, AB) === wr_en_shift_y | 
|  | set mux_ab port(mux, AB) | 
|  | set mux_s port(mux, \S) | 
|  | set mux_ba port(mux, BA) | 
|  | endmatch | 
|  |  | 
|  | match wr_data_shift | 
|  | select wr_data_shift->type.in($shl) | 
|  | index <SigSpec> port(wr_data_shift, \Y) === mem_wr_data | 
|  | set wr_data_shift_a port(wr_data_shift, \A) | 
|  | set wr_data_shift_b port(wr_data_shift, \B) | 
|  | endmatch | 
|  |  | 
|  | code | 
|  | accept; | 
|  | endcode |