Merge branch 'master' into gc_arrivals

This commit is contained in:
James Cherry 2021-09-17 19:35:59 -07:00
commit 24e5b5bed2
5 changed files with 32 additions and 24 deletions

View File

@ -343,12 +343,14 @@ Graph::makeWireEdge(Pin *from_pin,
Vertex *from_vertex, *from_bidirect_drvr_vertex; Vertex *from_vertex, *from_bidirect_drvr_vertex;
pinVertices(from_pin, from_vertex, from_bidirect_drvr_vertex); pinVertices(from_pin, from_vertex, from_bidirect_drvr_vertex);
Vertex *to_vertex = pinLoadVertex(to_pin); Vertex *to_vertex = pinLoadVertex(to_pin);
if (from_vertex && to_vertex) {
// From and/or to can be bidirect, but edge is always from driver to load. // From and/or to can be bidirect, but edge is always from driver to load.
if (from_bidirect_drvr_vertex) if (from_bidirect_drvr_vertex)
makeEdge(from_bidirect_drvr_vertex, to_vertex, arc_set); makeEdge(from_bidirect_drvr_vertex, to_vertex, arc_set);
else else
makeEdge(from_vertex, to_vertex, arc_set); makeEdge(from_vertex, to_vertex, arc_set);
} }
}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////

View File

@ -897,6 +897,8 @@ public:
// loops until the arrivals converge. // loops until the arrivals converge.
// If full=false update arrivals incrementally. // If full=false update arrivals incrementally.
// If full=true update all arrivals from scratch. // 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); void updateTiming(bool full);
// Invalidate all delay calculations. Arrivals also invalidated. // Invalidate all delay calculations. Arrivals also invalidated.
void delaysInvalid(); void delaysInvalid();

View File

@ -521,7 +521,9 @@ Network::isLoad(const Pin *pin) const
const Instance *inst = instance(pin); const Instance *inst = instance(pin);
return (isLeaf(inst) && dir->isAnyInput()) return (isLeaf(inst) && dir->isAnyInput())
// isTopLevelPort(pin) // isTopLevelPort(pin)
|| (isTopInstance(inst) && dir->isAnyOutput()); || (isTopInstance(inst) && dir->isAnyOutput())
// Black box unknown ports are treated as loads.
|| dir->isUnknown();
} }
bool bool

View File

@ -4135,6 +4135,7 @@ Sta::connectPinAfter(Pin *pin)
else { else {
Vertex *vertex, *bidir_drvr_vertex; Vertex *vertex, *bidir_drvr_vertex;
graph_->pinVertices(pin, vertex, bidir_drvr_vertex); graph_->pinVertices(pin, vertex, bidir_drvr_vertex);
if (vertex) {
search_->arrivalInvalid(vertex); search_->arrivalInvalid(vertex);
search_->requiredInvalid(vertex); search_->requiredInvalid(vertex);
if (bidir_drvr_vertex) { if (bidir_drvr_vertex) {
@ -4155,6 +4156,7 @@ Sta::connectPinAfter(Pin *pin)
} }
} }
} }
}
sdc_->connectPinAfter(pin); sdc_->connectPinAfter(pin);
sim_->connectPinAfter(pin); sim_->connectPinAfter(pin);
} }

View File

@ -2058,7 +2058,7 @@ VerilogReader::makeBlackBoxNamedPorts(Cell *cell,
Port *port = (size == 1) Port *port = (size == 1)
? network_->makePort(cell, port_name) ? network_->makePort(cell, port_name)
: network_->makeBusPort(cell, port_name, 0, size - 1); : network_->makeBusPort(cell, port_name, 0, size - 1);
network_->setDirection(port, PortDirection::bidirect()); network_->setDirection(port, PortDirection::unknown());
} }
} }
@ -2077,7 +2077,7 @@ VerilogReader::makeBlackBoxOrderedPorts(Cell *cell,
? network_->makePort(cell, port_name) ? network_->makePort(cell, port_name)
: network_->makeBusPort(cell, port_name, size - 1, 0); : network_->makeBusPort(cell, port_name, size - 1, 0);
stringDelete(port_name); stringDelete(port_name);
network_->setDirection(port, PortDirection::bidirect()); network_->setDirection(port, PortDirection::unknown());
port_index++; port_index++;
} }
} }