From: Miodrag Milanovic Date: Fri, 11 Mar 2022 10:19:53 +0000 (+0100) Subject: Proper write of memory data X-Git-Tag: yosys-0.16~52^2~4 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=357336339a3d7f4100d44c508cd5fe5255b53218;p=yosys.git Proper write of memory data --- 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 parts; size_t len = 0; - dict 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; }