diff --git a/graph/Graph.cc b/graph/Graph.cc index 66cbc395..b9861d77 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -344,11 +344,13 @@ Graph::makeWireEdge(Pin *from_pin, Vertex *from_vertex, *from_bidirect_drvr_vertex; pinVertices(from_pin, from_vertex, from_bidirect_drvr_vertex); Vertex *to_vertex = pinLoadVertex(to_pin); - // From and/or to can be bidirect, but edge is always from driver to load. - if (from_bidirect_drvr_vertex) - makeEdge(from_bidirect_drvr_vertex, to_vertex, arc_set); - else - makeEdge(from_vertex, to_vertex, arc_set); + if (from_vertex && to_vertex) { + // From and/or to can be bidirect, but edge is always from driver to load. + if (from_bidirect_drvr_vertex) + makeEdge(from_bidirect_drvr_vertex, to_vertex, arc_set); + else + makeEdge(from_vertex, to_vertex, arc_set); + } } //////////////////////////////////////////////////////////////// diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index a165c4b7..d29a8c76 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -897,6 +897,8 @@ public: // loops until the arrivals converge. // If full=false update arrivals incrementally. // If full=true update all arrivals from scratch. + // There is rarely any reason to call updateTiming directly because + // arrival/required/slack functions implicitly update timing incrementally. void updateTiming(bool full); // Invalidate all delay calculations. Arrivals also invalidated. void delaysInvalid(); diff --git a/search/Sta.cc b/search/Sta.cc index 36bf3d3c..ec7ae374 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -4122,23 +4122,25 @@ Sta::connectPinAfter(Pin *pin) else { Vertex *vertex, *bidir_drvr_vertex; graph_->pinVertices(pin, vertex, bidir_drvr_vertex); - search_->arrivalInvalid(vertex); - search_->requiredInvalid(vertex); - if (bidir_drvr_vertex) { - search_->arrivalInvalid(bidir_drvr_vertex); - search_->requiredInvalid(bidir_drvr_vertex); - } + if (vertex) { + search_->arrivalInvalid(vertex); + search_->requiredInvalid(vertex); + if (bidir_drvr_vertex) { + search_->arrivalInvalid(bidir_drvr_vertex); + search_->requiredInvalid(bidir_drvr_vertex); + } - // Make interconnect edges from/to pin. - if (network_->isDriver(pin)) { - graph_->makeWireEdgesFromPin(pin); - connectDrvrPinAfter(bidir_drvr_vertex ? bidir_drvr_vertex : vertex); - } - // Note that a bidirect is both a driver and a load so this - // is NOT an else clause for the above "if". - if (network_->isLoad(pin)) { - graph_->makeWireEdgesToPin(pin); - connectLoadPinAfter(vertex); + // Make interconnect edges from/to pin. + if (network_->isDriver(pin)) { + graph_->makeWireEdgesFromPin(pin); + connectDrvrPinAfter(bidir_drvr_vertex ? bidir_drvr_vertex : vertex); + } + // Note that a bidirect is both a driver and a load so this + // is NOT an else clause for the above "if". + if (network_->isLoad(pin)) { + graph_->makeWireEdgesToPin(pin); + connectLoadPinAfter(vertex); + } } } }