From d1ee9827a00a4b415ddbaeeea4ebe6bb478ae095 Mon Sep 17 00:00:00 2001 From: Ryszard Rozak Date: Thu, 30 Nov 2023 14:32:12 +0100 Subject: [PATCH] Fix block names of nested do..while loops (#4728) --- src/V3LinkJump.cpp | 19 ++++++++++--------- test_regress/t/t_do_while.v | 9 +++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/V3LinkJump.cpp b/src/V3LinkJump.cpp index 235ffd7c5..bc3a2109f 100644 --- a/src/V3LinkJump.cpp +++ b/src/V3LinkJump.cpp @@ -142,18 +142,18 @@ class LinkJumpVisitor final : public VNVisitor { return labelp; } } - void addPrefixToBlocksRecurse(AstNode* nodep) { - // Add do_while_ prefix to blocks + void addPrefixToBlocksRecurse(const std::string& prefix, AstNode* const nodep) { + // Add a prefix to blocks // Used to not have blocks with duplicated names if (AstBegin* const beginp = VN_CAST(nodep, Begin)) { - if (beginp->name() != "") beginp->name("__Vdo_while_" + beginp->name()); + if (beginp->name() != "") beginp->name(prefix + beginp->name()); } - if (nodep->op1p()) addPrefixToBlocksRecurse(nodep->op1p()); - if (nodep->op2p()) addPrefixToBlocksRecurse(nodep->op2p()); - if (nodep->op3p()) addPrefixToBlocksRecurse(nodep->op3p()); - if (nodep->op4p()) addPrefixToBlocksRecurse(nodep->op4p()); - if (nodep->nextp()) addPrefixToBlocksRecurse(nodep->nextp()); + if (nodep->op1p()) addPrefixToBlocksRecurse(prefix, nodep->op1p()); + if (nodep->op2p()) addPrefixToBlocksRecurse(prefix, nodep->op2p()); + if (nodep->op3p()) addPrefixToBlocksRecurse(prefix, nodep->op3p()); + if (nodep->op4p()) addPrefixToBlocksRecurse(prefix, nodep->op4p()); + if (nodep->nextp()) addPrefixToBlocksRecurse(prefix, nodep->nextp()); } // VISITORS @@ -240,7 +240,8 @@ class LinkJumpVisitor final : public VNVisitor { VL_DO_DANGLING(nodep->deleteTree(), nodep); if (bodyp) { AstNode* const copiedBodyp = bodyp->cloneTree(false); - addPrefixToBlocksRecurse(copiedBodyp); + addPrefixToBlocksRecurse("__Vdo_while1_", copiedBodyp); + addPrefixToBlocksRecurse("__Vdo_while2_", bodyp); whilep->addHereThisAsNext(copiedBodyp); } } diff --git a/test_regress/t/t_do_while.v b/test_regress/t/t_do_while.v index 9423853f4..cf52f432d 100644 --- a/test_regress/t/t_do_while.v +++ b/test_regress/t/t_do_while.v @@ -52,6 +52,15 @@ module t (/*AUTOARG*/); end while (a < 0); if (a != 5) $stop; + a = 1; + do begin + do begin + int x = 1; + a += x; + end while (a < 3); + end while (a < 5); + if (a != 5) $stop; + $write("*-* All Finished *-*\n"); $finish; end