issue 322 revisited

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2025-11-06 12:34:53 -07:00
parent 37b3043843
commit 351b8287a7
2 changed files with 26 additions and 11 deletions

View File

@ -565,14 +565,23 @@ TimingArc::~TimingArc()
string string
TimingArc::to_string() const TimingArc::to_string() const
{ {
string str = set_->from()->name(); if (set_->role()->isWire()) {
str += " "; string str = "wire ";
str += from_rf_->to_string(); str += from_rf_->to_string();
str += " -> "; str += " -> ";
str += set_->to()->name(); str += to_rf_->to_string();
str += " "; return str;
str += to_rf_->to_string(); }
return str; else {
string str = set_->from()->name();
str += " ";
str += from_rf_->to_string();
str += " -> ";
str += set_->to()->name();
str += " ";
str += to_rf_->to_string();
return str;
}
} }
GateTimingModel * GateTimingModel *

View File

@ -394,7 +394,7 @@ PathEnumFaninVisitor::visitEdge(const Pin *from_pin,
bool bool
PathEnumFaninVisitor::visitFromToPath(const Pin *, PathEnumFaninVisitor::visitFromToPath(const Pin *,
Vertex *from_vertex, Vertex *from_vertex,
const RiseFall *, const RiseFall *from_rf,
Tag *, Tag *,
Path *from_path, Path *from_path,
const Arrival &, const Arrival &,
@ -410,6 +410,7 @@ PathEnumFaninVisitor::visitFromToPath(const Pin *,
{ {
// These paths fanin to before_div_ so we know to_vertex matches. // These paths fanin to before_div_ so we know to_vertex matches.
if ((!unique_pins_ || from_vertex != prev_vertex_) if ((!unique_pins_ || from_vertex != prev_vertex_)
&& (!unique_edges_ || from_rf != prev_arc_->fromEdge()->asRiseFall())
&& arc != prev_arc_ && arc != prev_arc_
&& Tag::matchNoCrpr(to_tag, before_div_tag_) && Tag::matchNoCrpr(to_tag, before_div_tag_)
// Ignore paths that only differ by crpr from same vertex/edge. // Ignore paths that only differ by crpr from same vertex/edge.
@ -449,9 +450,14 @@ PathEnumFaninVisitor::insertUniqueEdgeDiv(Diversion *div)
const Vertex *div_vertex = div_path->vertex(this); const Vertex *div_vertex = div_path->vertex(this);
const RiseFall *div_rf = div_path->transition(this); const RiseFall *div_rf = div_path->transition(this);
auto itr = unique_edge_divs_.find({div_vertex, div_rf}); auto itr = unique_edge_divs_.find({div_vertex, div_rf});
if (itr == unique_edge_divs_.end() if (itr == unique_edge_divs_.end())
|| delayGreater(div_slack, itr->second->pathEnd()->slack(this), this)) unique_edge_divs_[{div_vertex, div_rf}] = div;
else if (delayGreater(div_slack, itr->second->pathEnd()->slack(this), this)) {
deleteDiversionPathEnd(itr->second);
itr->second = div; itr->second = div;
}
else
deleteDiversionPathEnd(div);
} }
void void