bulletproofing against incremental updates with missing liberty
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
5a765a7606
commit
41706e0db6
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue