| pattern ql_bram_asymmetric_wider_write |
| |
| state <SigSpec> mem_rd_data |
| state <SigSpec> mem_rd_addr |
| state <SigSpec> mem_wr_data |
| state <SigSpec> mem_wr_addr |
| state <SigSpec> mem_wr_en |
| state <SigSpec> rd_data_shift_y |
| state <SigSpec> rd_data_ff_q |
| state <SigSpec> rd_data_ff_en |
| state <SigSpec> rd_data_ff_clk |
| state <SigSpec> wr_addr_ff_d |
| state <SigSpec> wr_en_mux_s |
| state <SigSpec> rd_addr_and_a |
| state <SigSpec> rd_addr_and_b |
| |
| 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, \RD_DATA)) == 2 |
| set mem_rd_data port(mem, \RD_DATA) |
| set mem_rd_addr port(mem, \RD_ADDR) |
| set mem_wr_data port(mem, \WR_DATA) |
| set mem_wr_addr port(mem, \WR_ADDR) |
| set mem_wr_en port(mem, \WR_EN) |
| endmatch |
| |
| match rd_data_shift |
| select rd_data_shift->type.in($shiftx) |
| index <SigSpec> port(rd_data_shift, \A) === mem_rd_data |
| set rd_data_shift_y port(rd_data_shift, \Y) |
| endmatch |
| |
| match rd_data_ff |
| select rd_data_ff->type.in($dffe) |
| select nusers(port(rd_data_ff, \D)) == 2 |
| index <SigSpec> port(rd_data_ff, \D) === rd_data_shift_y |
| set rd_data_ff_q port(rd_data_ff, \Q) |
| set rd_data_ff_en port(rd_data_ff, \EN) |
| set rd_data_ff_clk port(rd_data_ff, \CLK) |
| endmatch |
| |
| match wr_addr_ff |
| select wr_addr_ff->type.in($dff) |
| select nusers(port(wr_addr_ff, \Q)) == 2 |
| index <SigSpec> port(wr_addr_ff, \Q) === mem_wr_addr |
| set wr_addr_ff_d port(wr_addr_ff, \D) |
| optional |
| endmatch |
| |
| match wr_en_mux |
| select wr_en_mux->type.in($mux) |
| index <SigSpec> port(wr_en_mux, \Y) === mem_wr_en[0] |
| set wr_en_mux_s port(wr_en_mux, \S) |
| endmatch |
| |
| match rd_addr_and |
| select rd_addr_and->type.in($and) |
| set rd_addr_and_a port(rd_addr_and, \A) |
| set rd_addr_and_b port(rd_addr_and, \B) |
| endmatch |
| |
| code |
| accept; |
| endcode |