@@ -572,7 +572,6 @@ void RepairHold::repairEndHold(sta::Vertex* end_vertex,
572572 sta::PinSeq load_pins;
573573 Slacks slacks;
574574 mergeInit (slacks);
575- float excluded_cap = 0.0 ;
576575 bool loads_have_out_port = false ;
577576 sta::VertexOutEdgeIterator edge_iter (path_vertex, graph_);
578577 while (edge_iter.hasNext ()) {
@@ -590,11 +589,6 @@ void RepairHold::repairEndHold(sta::Vertex* end_vertex,
590589 && network_->isTopLevelPort (load_pin)) {
591590 loads_have_out_port = true ;
592591 }
593- } else {
594- sta::LibertyPort* load_port = network_->libertyPort (load_pin);
595- if (load_port) {
596- excluded_cap += load_port->capacitance ();
597- }
598592 }
599593 }
600594 }
@@ -611,9 +605,18 @@ void RepairHold::repairEndHold(sta::Vertex* end_vertex,
611605 delayAsString (slacks[fall_index_][max_index_], sta_),
612606 load_pins.size ());
613607 sta::Scene* corner = sta_->cmdScene ();
614- float load_cap
615- = graph_delay_calc_->loadCap (end_vertex->pin (), corner, max_)
616- - excluded_cap;
608+ // Compute load cap as the sum of the pin capacitances that the
609+ // inserted hold buffer will drive. Using loadCap on the driver pin
610+ // would include the full original-net parasitics which are absent
611+ // on the post-split net, causing the guard below to over-reject
612+ // valid insertions.
613+ float load_cap = 0.0 ;
614+ for (const sta::Pin* load_pin : load_pins) {
615+ sta::LibertyPort* load_port = network_->libertyPort (load_pin);
616+ if (load_port) {
617+ load_cap += load_port->capacitance ();
618+ }
619+ }
617620 sta::ArcDelay buffer_delays[sta::RiseFall::index_count];
618621 sta::Slew buffer_slews[sta::RiseFall::index_count];
619622 resizer_->bufferDelays (buffer_cell,
0 commit comments