Fix more MT issues arising from pruneCrprArrival

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
This commit is contained in:
dsengupta0628 2026-03-04 00:02:57 +00:00
parent 16c2678e51
commit fa9d1b13c9
1 changed files with 10 additions and 3 deletions

View File

@ -1449,9 +1449,16 @@ ArrivalVisitor::pruneCrprArrivals()
Arrival arrival = tag_bldr_->arrival(path_index);
// Latch D->Q path uses enable min so crpr clk path min/max
// does not match the path min/max.
if (delayGreater(max_arrival_max_crpr, arrival, min_max, this)
&& clk_info_no_crpr->crprClkPath(this)->minMax(this)
== clk_info->crprClkPath(this)->minMax(this)) {
// Use crprClkPathRaw() rather than crprClkPath() to avoid going
// through Path::vertexPath(), which can transiently return nullptr
// during a concurrent setVertexArrivals() tag-group transition.
// The min/max is a property of the tag (tag_index_), which is
// stable for the lifetime of the ClkInfo object.
const Path *crpr_clk_path_no_crpr = clk_info_no_crpr->crprClkPathRaw();
if (crpr_clk_path_no_crpr
&& delayGreater(max_arrival_max_crpr, arrival, min_max, this)
&& crpr_clk_path_no_crpr->minMax(this)
== clk_info->crprClkPathRaw()->minMax(this)) {
debugPrint(debug_, "search", 3, " pruned %s",
tag->to_string(this).c_str());
path_itr = path_index_map.erase(path_itr);