Skip to content

Commit

Permalink
merge OR OpenSTA PR 211, 213 with tweeks
Browse files Browse the repository at this point in the history
Signed-off-by: James Cherry <[email protected]>
  • Loading branch information
jjcherry56 committed Dec 12, 2024
1 parent bbffa9b commit fc1a749
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 19 deletions.
44 changes: 27 additions & 17 deletions search/Crpr.cc
Original file line number Diff line number Diff line change
Expand Up @@ -46,20 +46,20 @@ CheckCrpr::CheckCrpr(StaState *sta) :
{
}

PathVertex *
void
CheckCrpr::clkPathPrev(const PathVertex *path,
PathVertex &tmp)
PathVertex &prev)

{
Vertex *vertex = path->vertex(this);
int arrival_index;
bool exists;
path->arrivalIndex(arrival_index, exists);
tmp = clkPathPrev(vertex, arrival_index);
if (tmp.isNull())
return nullptr;
PathVertexRep *prevs = graph_->prevPaths(vertex);
if (prevs)
prev.init(prevs[arrival_index], this);
else
return &tmp;
criticalError(2200, "missing prev paths");
}

PathVertex
Expand All @@ -70,7 +70,7 @@ CheckCrpr::clkPathPrev(Vertex *vertex,
if (prevs)
return PathVertex(prevs[arrival_index], this);
else {
criticalError(248, "missing prev paths");
criticalError(2201, "missing prev paths");
return PathVertex();
}
}
Expand Down Expand Up @@ -251,20 +251,30 @@ CheckCrpr::findCrpr(const PathVertex *src_clk_path,
}
const PathVertex *src_clk_path2 = src_clk_path1;
const PathVertex *tgt_clk_path2 = tgt_clk_path1;
PathVertex tmp1, tmp2;
PathVertex src_prev, tgt_prev;
// src_clk_path and tgt_clk_path are now in the same (gen)clk src path.
// Use the vertex levels to back up the deeper path to see if they
// overlap.
while (src_clk_path2 && tgt_clk_path2
&& src_clk_path2->pin(this) != tgt_clk_path2->pin(this)) {
Level src_level = src_clk_path2->vertex(this)->level();
Level tgt_level = tgt_clk_path2->vertex(this)->level();
if (src_level >= tgt_level)
src_clk_path2 = clkPathPrev(src_clk_path2, tmp1);
if (tgt_level >= src_level)
tgt_clk_path2 = clkPathPrev(tgt_clk_path2, tmp2);
int src_level = src_clk_path2->vertex(this)->level();
int tgt_level = tgt_clk_path2->vertex(this)->level();
while (src_clk_path2->pin(this) != tgt_clk_path2->pin(this)) {
int level_diff = src_level - tgt_level;
if (level_diff >= 0) {
clkPathPrev(src_clk_path2, src_prev);
if (src_prev.isNull())
break;
src_clk_path2 = &src_prev;
src_level = src_clk_path2->vertex(this)->level();
}
if (level_diff <= 0) {
clkPathPrev(tgt_clk_path2, tgt_prev);
if (tgt_prev.isNull())
break;
tgt_clk_path2 = &tgt_prev;
tgt_level = tgt_clk_path2->vertex(this)->level();
}
}
if (src_clk_path2 && tgt_clk_path2
if (!src_clk_path2->isNull() && !tgt_clk_path2->isNull()
&& (src_clk_path2->transition(this) == tgt_clk_path2->transition(this)
|| same_pin)) {
debugPrint(debug_, "crpr", 2, "crpr pin %s",
Expand Down
4 changes: 2 additions & 2 deletions search/Crpr.hh
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ public:
int arrival_index);

private:
PathVertex *clkPathPrev(const PathVertex *path,
PathVertex &tmp);
void clkPathPrev(const PathVertex *path,
PathVertex &prev);
Arrival otherMinMaxArrival(const PathVertex *path);
void checkCrpr1(const Path *src_path,
const PathVertex *tgt_clk_path,
Expand Down

0 comments on commit fc1a749

Please sign in to comment.