opt_mem: Remove write ports with const-0 EN.

Fixes #2765.
This commit is contained in:
Marcelina Kościelnicka 2021-05-22 20:27:51 +02:00
parent 039f4f48d5
commit a23d9409e7
2 changed files with 46 additions and 0 deletions

View File

@ -52,6 +52,18 @@ struct OptMemPass : public Pass {
int total_count = 0;
for (auto module : design->selected_modules()) {
for (auto &mem : Mem::get_selected_memories(module)) {
bool changed = false;
for (auto &port : mem.wr_ports) {
if (port.en.is_fully_zero()) {
port.removed = true;
changed = true;
total_count++;
}
}
if (changed) {
mem.emit();
}
if (mem.wr_ports.empty() && mem.inits.empty()) {
mem.remove();
total_count++;

34
tests/opt/bug2765.ys Normal file
View File

@ -0,0 +1,34 @@
read_verilog << EOT
module top(...);
input clk;
input [3:0] wa;
input [15:0] wd;
input [3:0] ra;
output [15:0] rd;
reg [15:0] mem[0:15];
integer i;
reg x;
always @(posedge clk) begin
for (i = 0; i < 2; i = i + 1) begin
x = i == 1;
if (x)
mem[wa] <= wd;
end
end
assign rd = mem[ra];
endmodule
EOT
proc
opt
select -assert-count 2 t:$memwr
opt_mem
select -assert-count 1 t:$memwr