aboutsummaryrefslogtreecommitdiffstats
path: root/passes/sat/sim.cc
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2022-03-11 11:19:53 +0100
committerMiodrag Milanovic <mmicko@gmail.com>2022-03-11 11:19:53 +0100
commit357336339a3d7f4100d44c508cd5fe5255b53218 (patch)
tree0f5ca0d8f2bf3489cfd57cdbdc97ee8f5fc7e13f /passes/sat/sim.cc
parent295b0d1899a6224405c28d81e52b62f32ea34b08 (diff)
downloadyosys-357336339a3d7f4100d44c508cd5fe5255b53218.tar.gz
yosys-357336339a3d7f4100d44c508cd5fe5255b53218.tar.bz2
yosys-357336339a3d7f4100d44c508cd5fe5255b53218.zip
Proper write of memory data
Diffstat (limited to 'passes/sat/sim.cc')
-rw-r--r--passes/sat/sim.cc27
1 files changed, 13 insertions, 14 deletions
diff --git a/passes/sat/sim.cc b/passes/sat/sim.cc
index 823456e94..e49f895f7 100644
--- a/passes/sat/sim.cc
+++ b/passes/sat/sim.cc
@@ -326,6 +326,16 @@ struct SimInstance
return did_something;
}
+ void set_memory_state(IdString memid, Const addr, Const data)
+ {
+ auto &state = mem_database[memid];
+
+ int offset = (addr.as_int() - state.mem->start_offset) * state.mem->width;
+ for (int i = 0; i < GetSize(data); i++)
+ if (0 <= i+offset && i+offset < GetSize(data))
+ state.data.bits[i+offset] = data.bits[i];
+ }
+
void update_cell(Cell *cell)
{
if (ff_database.count(cell))
@@ -1230,11 +1240,6 @@ struct SimWorker : SimShared
int curr_cycle = 0;
std::vector<std::string> parts;
size_t len = 0;
- dict<IdString, Mem*> mem_dict;
- for (auto &mem : top->memories) {
- mem.narrow();
- mem_dict[mem.memid] = &mem;
- }
while (!f.eof())
{
std::string line;
@@ -1298,15 +1303,9 @@ struct SimWorker : SimShared
if (!c->is_mem_cell())
log_error("Cell %s is not memory cell in module %s\n",log_id(escaped_s),log_id(topmod));
- Mem *mem = mem_dict[c->parameters.at(ID::MEMID).decode_string()];
- mem->clear_inits();
- MemInit minit;
- minit.addr = Const::from_string(parts[1].substr(1,parts[1].size()-2));
- minit.data = Const::from_string(parts[2]);
- log("[%s] = %s\n",log_signal(minit.addr), log_signal(minit.data));
- minit.en = Const(State::S1, mem->width);
- mem->inits.push_back(minit);
- mem->emit();
+ Const addr = Const::from_string(parts[1].substr(1,parts[1].size()-2));
+ Const data = Const::from_string(parts[2]);
+ top->set_memory_state(c->parameters.at(ID::MEMID).decode_string(), addr, data);
}
break;
}