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()}; } //============================================================================