diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index bded0b9a..da5da08b 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -1513,6 +1513,7 @@ protected: bool infer_latches); void delayCalcPreamble(); void delaysInvalidFrom(const Port *port); + void delaysInvalidFromFanin(const Port *port); void deleteEdge(Edge *edge); void netParasiticCaps(Net *net, const RiseFall *rf, diff --git a/search/Sta.cc b/search/Sta.cc index 435b8867..61f9a274 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -3967,7 +3967,7 @@ Sta::setPortExtPinCap(const Port *port, for (const MinMax *mm : min_max->range()) sdc->setPortExtPinCap(port, rf1, mm, cap); } - delaysInvalidFrom(port); + delaysInvalidFromFanin(port); } void @@ -4022,7 +4022,7 @@ Sta::setPortExtWireCap(const Port *port, for (const MinMax *mm : min_max->range()) sdc->setPortExtWireCap(port, rf1, mm, cap); } - delaysInvalidFrom(port); + delaysInvalidFromFanin(port); } void @@ -4040,7 +4040,7 @@ Sta::setPortExtFanout(const Port *port, { for (const MinMax *mm : min_max->range()) sdc->setPortExtFanout(port, mm, fanout); - delaysInvalidFrom(port); + delaysInvalidFromFanin(port); } void @@ -5025,6 +5025,20 @@ Sta::delaysInvalidFrom(Vertex *vertex) graph_delay_calc_->delayInvalid(vertex); } +void +Sta::delaysInvalidFromFanin(const Port *port) +{ + if (graph_) { + Instance *top_inst = network_->topInstance(); + Pin *pin = network_->findPin(top_inst, port); + Vertex *vertex, *bidirect_drvr_vertex; + graph_->pinVertices(pin, vertex, bidirect_drvr_vertex); + delaysInvalidFromFanin(vertex); + if (bidirect_drvr_vertex) + delaysInvalidFromFanin(bidirect_drvr_vertex); + } +} + void Sta::delaysInvalidFromFanin(const Pin *pin) {