kernel/mem: Use delayed removal for inits as well.
authorMarcelina Kościelnicka <mwk@0x04.net>
Mon, 12 Jul 2021 15:10:40 +0000 (17:10 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Mon, 12 Jul 2021 16:28:20 +0000 (18:28 +0200)
kernel/mem.cc
kernel/mem.h

index 8d77c36431ec52cd9dfa6b18165a5a2667cc54b3..96f71428de6ec4f028d5883a0fd45c755e2f3bb3 100644 (file)
@@ -76,6 +76,17 @@ void Mem::emit() {
                        wr_left.push_back(i);
                }
        }
+       std::vector<int> init_left;
+       for (int i = 0; i < GetSize(inits); i++) {
+               auto &init = inits[i];
+               if (init.removed) {
+                       if (init.cell) {
+                               module->remove(init.cell);
+                       }
+               } else {
+                       init_left.push_back(i);
+               }
+       }
        for (int i = 0; i < GetSize(rd_left); i++)
                if (i != rd_left[i])
                        std::swap(rd_ports[i], rd_ports[rd_left[i]]);
@@ -84,6 +95,10 @@ void Mem::emit() {
                if (i != wr_left[i])
                        std::swap(wr_ports[i], wr_ports[wr_left[i]]);
        wr_ports.resize(GetSize(wr_left));
+       for (int i = 0; i < GetSize(init_left); i++)
+               if (i != init_left[i])
+                       std::swap(inits[i], inits[init_left[i]]);
+       inits.resize(GetSize(init_left));
 
        // for future: handle transparency mask here
 
@@ -264,14 +279,14 @@ void Mem::emit() {
 
 void Mem::clear_inits() {
        for (auto &init : inits)
-               if (init.cell)
-                       module->remove(init.cell);
-       inits.clear();
+               init.removed = true;
 }
 
 Const Mem::get_init_data() const {
        Const init_data(State::Sx, width * size);
        for (auto &init : inits) {
+               if (init.removed)
+                       continue;
                int offset = (init.addr.as_int() - start_offset) * width;
                for (int i = 0; i < GetSize(init.data); i++)
                        if (0 <= i+offset && i+offset < GetSize(init_data))
index c4575167c4fc5021073f01d8f8e5def6bbf35249..6ea18f26f1a8d294415188ddf2da5aef875ae11e 100644 (file)
@@ -65,10 +65,11 @@ struct MemWr : RTLIL::AttrObject {
 };
 
 struct MemInit : RTLIL::AttrObject {
+       bool removed;
        Cell *cell;
        Const addr;
        Const data;
-       MemInit() : cell(nullptr) {}
+       MemInit() : removed(false), cell(nullptr) {}
 };
 
 struct Mem : RTLIL::AttrObject {