replaceEquivCellBefore non-liberty port

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2021-11-18 10:56:07 -07:00
parent fc3143609d
commit c787060a9a
1 changed files with 25 additions and 23 deletions

View File

@ -4080,30 +4080,32 @@ Sta::replaceEquivCellBefore(Instance *inst,
while (pin_iter->hasNext()) { while (pin_iter->hasNext()) {
Pin *pin = pin_iter->next(); Pin *pin = pin_iter->next();
LibertyPort *port = network_->libertyPort(pin); LibertyPort *port = network_->libertyPort(pin);
if (port->direction()->isAnyInput()) { if (port) {
Vertex *vertex = graph_->pinLoadVertex(pin); if (port->direction()->isAnyInput()) {
replaceCellPinInvalidate(port, vertex, to_cell); Vertex *vertex = graph_->pinLoadVertex(pin);
replaceCellPinInvalidate(port, vertex, to_cell);
// Replace the timing arc sets in the graph edges. // Replace the timing arc sets in the graph edges.
VertexOutEdgeIterator edge_iter(vertex, graph_); VertexOutEdgeIterator edge_iter(vertex, graph_);
while (edge_iter.hasNext()) { while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next(); Edge *edge = edge_iter.next();
Vertex *to_vertex = edge->to(graph_); Vertex *to_vertex = edge->to(graph_);
if (network_->instance(to_vertex->pin()) == inst) { if (network_->instance(to_vertex->pin()) == inst) {
TimingArcSet *from_set = edge->timingArcSet(); TimingArcSet *from_set = edge->timingArcSet();
// Find corresponding timing arc set. // Find corresponding timing arc set.
TimingArcSet *to_set = to_cell->findTimingArcSet(from_set); TimingArcSet *to_set = to_cell->findTimingArcSet(from_set);
if (to_set) if (to_set)
edge->setTimingArcSet(to_set); edge->setTimingArcSet(to_set);
else else
report_->critical(264, "corresponding timing arc set not found in equiv cells"); report_->critical(264, "corresponding timing arc set not found in equiv cells");
} }
} }
} }
else { else {
// Force delay calculation on output pins. // Force delay calculation on output pins.
Vertex *vertex = graph_->pinDrvrVertex(pin); Vertex *vertex = graph_->pinDrvrVertex(pin);
graph_delay_calc_->delayInvalid(vertex); graph_delay_calc_->delayInvalid(vertex);
}
} }
} }
delete pin_iter; delete pin_iter;