@@ -139,6 +139,8 @@ struct SimInstance
139
139
dict<SigBit, pool<Cell*>> upd_cells;
140
140
dict<SigBit, pool<Wire*>> upd_outports;
141
141
142
+ dict<SigBit, SigBit> in_parent_drivers;
143
+
142
144
pool<SigBit> dirty_bits;
143
145
pool<Cell*> dirty_cells;
144
146
pool<IdString> dirty_memories;
@@ -218,6 +220,12 @@ struct SimInstance
218
220
dirty_bits.insert (sig[i]);
219
221
}
220
222
}
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
+ }
221
229
}
222
230
223
231
memories = Mem::get_all_memories (module);
@@ -372,6 +380,22 @@ struct SimInstance
372
380
return did_something;
373
381
}
374
382
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
+
375
399
void set_memory_state (IdString memid, Const addr, Const data)
376
400
{
377
401
set_memory_state (memid, addr.as_int (), data);
@@ -1760,7 +1784,7 @@ struct SimWorker : SimShared
1760
1784
log (" yw: set %s to %s\n " , signal .path .str ().c_str (), log_const (value));
1761
1785
1762
1786
if (found_path.wire != nullptr ) {
1763
- found_path.instance ->set_state (
1787
+ found_path.instance ->set_state_parent_drivers (
1764
1788
SigChunk (found_path.wire , signal .offset , signal .width ),
1765
1789
value);
1766
1790
} else if (!found_path.memid .empty ()) {
0 commit comments