From 97838325cd3248ac153cce23fdd09332f02e0982 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Sun, 1 Mar 2026 12:44:59 +0000 Subject: [PATCH] Fix scheduling non-determinism (#7120 partial) (#7162) --- src/V3Sched.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/V3Sched.cpp b/src/V3Sched.cpp index bef68595f..7795c51b5 100644 --- a/src/V3Sched.cpp +++ b/src/V3Sched.cpp @@ -827,10 +827,18 @@ std::unordered_map cloneMapWithNewTriggerReferences(const std::unordered_map& map, AstVarScope* vscp) { AstTopScope* const topScopep = v3Global.rootp()->topScopep(); - // Copy map - std::unordered_map newMap{map}; + // Label global SenTrees by the order they are in the Ast + const VNUser1InUse user1InUse; + int n = 0; + for (AstNode* nodep = topScopep->senTreesp(); nodep; nodep = nodep->nextp()) nodep->user1(++n); + // Sort map by key order for determinism + using Pair = std::pair; + std::vector pairs{map.begin(), map.end()}; + std::sort(pairs.begin(), pairs.end(), [](const Pair& a, const Pair& b) { // + return a.first->user1() < b.first->user1(); + }); // Replace references in each mapped value with a reference to the given vscp - for (auto& pair : newMap) { + for (Pair& pair : pairs) { pair.second = pair.second->cloneTree(false); pair.second->foreach([&](AstVarRef* refp) { UASSERT_OBJ(refp->access() == VAccess::READ, refp, "Should be read ref"); @@ -839,7 +847,8 @@ cloneMapWithNewTriggerReferences(const std::unordered_mapaddSenTreesp(pair.second); } - return newMap; + // Convert back to map + return std::unordered_map{pairs.begin(), pairs.end()}; } //============================================================================