Fix block names of nested do..while loops (#4728)

This commit is contained in:
Ryszard Rozak 2023-11-30 14:32:12 +01:00 committed by GitHub
parent 1fe591ae20
commit d1ee9827a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 9 deletions

View File

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

View File

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