aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/mem.cc
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2021-07-12 17:10:40 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2021-07-12 18:28:20 +0200
commit0565c642a0c5a1b1f7b98ab681bc24226b739f9a (patch)
tree1d9fabe1465e1bf87a87212f27e09c44faa690d2 /kernel/mem.cc
parent6d7d9ab077a7eac125ed6eb0170437216e64efcf (diff)
downloadyosys-0565c642a0c5a1b1f7b98ab681bc24226b739f9a.tar.gz
yosys-0565c642a0c5a1b1f7b98ab681bc24226b739f9a.tar.bz2
yosys-0565c642a0c5a1b1f7b98ab681bc24226b739f9a.zip
kernel/mem: Use delayed removal for inits as well.
Diffstat (limited to 'kernel/mem.cc')
-rw-r--r--kernel/mem.cc21
1 files changed, 18 insertions, 3 deletions
diff --git a/kernel/mem.cc b/kernel/mem.cc
index 8d77c3643..96f71428d 100644
--- a/kernel/mem.cc
+++ b/kernel/mem.cc
@@ -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))