opt_mem: Add reset/init value support.
authorMarcelina Kościelnicka <mwk@0x04.net>
Tue, 25 May 2021 16:49:17 +0000 (18:49 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Tue, 25 May 2021 18:06:00 +0000 (20:06 +0200)
passes/opt/opt_mem.cc

index 0409fb736f4b989e7c8c42bedf05564d024325db..2788648ec9af439c7c4a718ead716cc60d0d3636 100644 (file)
@@ -51,6 +51,8 @@ struct OptMemPass : public Pass {
 
                int total_count = 0;
                for (auto module : design->selected_modules()) {
+                       SigMap sigmap(module);
+                       FfInitVals initvals(&sigmap, module);
                        for (auto &mem : Mem::get_selected_memories(module)) {
                                bool changed = false;
                                for (auto &port : mem.wr_ports) {
@@ -65,6 +67,16 @@ struct OptMemPass : public Pass {
                                }
 
                                if (mem.wr_ports.empty() && mem.inits.empty()) {
+                                       // The whole memory array will contain
+                                       // only State::Sx, but the embedded read
+                                       // registers could have reset or init values.
+                                       // They will probably be optimized away by
+                                       // opt_dff later.
+                                       for (int i = 0; i < GetSize(mem.rd_ports); i++) {
+                                               mem.extract_rdff(i, &initvals);
+                                               auto &port = mem.rd_ports[i];
+                                               module->connect(port.data, Const(State::Sx, GetSize(port.data)));
+                                       }
                                        mem.remove();
                                        total_count++;
                                }