@@ -402,28 +402,33 @@ void RepairDesign::repairDesign(
402402 }
403403 }
404404 if (slew_viol) {
405- PinSet* drivers = network_->drivers (vertex->pin ());
406- for (const Pin* drvr_pin : *drivers) {
407- debugPrint (logger_,
408- RSZ,
409- " repair_design" ,
410- 2 ,
411- " last pass: drvr {} has slew {} vs. limit {}" ,
412- sdc_network_->pathName (drvr_pin),
413- delayAsString (actual, this , 3 ),
414- delayAsString (limit, this , 3 ));
415- repairDriver (graph_->pinDrvrVertex (drvr_pin),
416- true /* check_slew */ ,
417- false /* check_cap */ ,
418- false /* check_fanout */ ,
419- 0 /* max_length */ ,
420- true /* resize_driver */ ,
421- corner,
422- repaired_net_count2,
423- slew_violations2,
424- cap_violations,
425- fanout_violations,
426- length_violations);
405+ PinSet* drivers_ptr = network_->drivers (vertex->pin ());
406+ if (drivers_ptr) {
407+ // Copy PinSet because repairDriver() can invalidate the
408+ // drivers_ptr by invalidating net_drvr_pin_map_ cache.
409+ PinSet drivers = *drivers_ptr;
410+ for (const Pin* drvr_pin : drivers) {
411+ debugPrint (logger_,
412+ RSZ,
413+ " repair_design" ,
414+ 2 ,
415+ " last pass: drvr {} has slew {} vs. limit {}" ,
416+ sdc_network_->pathName (drvr_pin),
417+ delayAsString (actual, this , 3 ),
418+ delayAsString (limit, this , 3 ));
419+ repairDriver (graph_->pinDrvrVertex (drvr_pin),
420+ true /* check_slew */ ,
421+ false /* check_cap */ ,
422+ false /* check_fanout */ ,
423+ 0 /* max_length */ ,
424+ true /* resize_driver */ ,
425+ corner,
426+ repaired_net_count2,
427+ slew_violations2,
428+ cap_violations,
429+ fanout_violations,
430+ length_violations);
431+ }
427432 }
428433 }
429434 }
@@ -1014,13 +1019,7 @@ void RepairDesign::repairDriver(Vertex* drvr,
10141019 int & length_violations)
10151020{
10161021 Pin* drvr_pin = drvr->pin ();
1017- // hier fix
1018- // clang-format off
1019- Net* net = network_->isTopLevelPort (drvr_pin)
1020- ? db_network_->dbToSta (
1021- db_network_->flatNet (network_->term (drvr_pin)))
1022- : db_network_->dbToSta (db_network_->flatNet (drvr_pin));
1023- // clang-format on
1022+ Net* net = db_network_->findFlatNet (drvr_pin);
10241023 if (!net) {
10251024 return ;
10261025 }
0 commit comments