Skip to content

Commit 1c667fa

Browse files
authored
Merge pull request #3672 from jix/yw-cosim-hierarchy-fixes
sim: For yw cosim, drive parent module's signals for input ports
2 parents 1cedad7 + 1698202 commit 1c667fa

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

passes/sat/sim.cc

+25-1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ struct SimInstance
139139
dict<SigBit, pool<Cell*>> upd_cells;
140140
dict<SigBit, pool<Wire*>> upd_outports;
141141

142+
dict<SigBit, SigBit> in_parent_drivers;
143+
142144
pool<SigBit> dirty_bits;
143145
pool<Cell*> dirty_cells;
144146
pool<IdString> dirty_memories;
@@ -218,6 +220,12 @@ struct SimInstance
218220
dirty_bits.insert(sig[i]);
219221
}
220222
}
223+
224+
if (wire->port_input && instance != nullptr && parent != nullptr) {
225+
for (int i = 0; i < GetSize(sig); i++) {
226+
in_parent_drivers.emplace(sig[i], parent->sigmap(instance->getPort(wire->name)[i]));
227+
}
228+
}
221229
}
222230

223231
memories = Mem::get_all_memories(module);
@@ -372,6 +380,22 @@ struct SimInstance
372380
return did_something;
373381
}
374382

383+
void set_state_parent_drivers(SigSpec sig, Const value)
384+
{
385+
sigmap.apply(sig);
386+
387+
for (int i = 0; i < GetSize(sig); i++) {
388+
auto sigbit = sig[i];
389+
auto sigval = value[i];
390+
391+
auto in_parent_driver = in_parent_drivers.find(sigbit);
392+
if (in_parent_driver == in_parent_drivers.end())
393+
set_state(sigbit, sigval);
394+
else
395+
parent->set_state_parent_drivers(in_parent_driver->second, sigval);
396+
}
397+
}
398+
375399
void set_memory_state(IdString memid, Const addr, Const data)
376400
{
377401
set_memory_state(memid, addr.as_int(), data);
@@ -1760,7 +1784,7 @@ struct SimWorker : SimShared
17601784
log("yw: set %s to %s\n", signal.path.str().c_str(), log_const(value));
17611785

17621786
if (found_path.wire != nullptr) {
1763-
found_path.instance->set_state(
1787+
found_path.instance->set_state_parent_drivers(
17641788
SigChunk(found_path.wire, signal.offset, signal.width),
17651789
value);
17661790
} else if (!found_path.memid.empty()) {

0 commit comments

Comments
 (0)