merge OR OpenSTA PR 211, 213 with tweeks

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-12-11 16:31:21 -08:00
parent bbffa9b493
commit fc1a7499ea
2 changed files with 29 additions and 19 deletions

View File

@ -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
@ -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();
}
}
@ -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",

View File

@ -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,