Fix block names of nested do..while loops (#4728)
This commit is contained in:
parent
1fe591ae20
commit
d1ee9827a0
|
|
@ -142,18 +142,18 @@ class LinkJumpVisitor final : public VNVisitor {
|
||||||
return labelp;
|
return labelp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void addPrefixToBlocksRecurse(AstNode* nodep) {
|
void addPrefixToBlocksRecurse(const std::string& prefix, AstNode* const nodep) {
|
||||||
// Add do_while_ prefix to blocks
|
// Add a prefix to blocks
|
||||||
// Used to not have blocks with duplicated names
|
// Used to not have blocks with duplicated names
|
||||||
if (AstBegin* const beginp = VN_CAST(nodep, Begin)) {
|
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->op1p()) addPrefixToBlocksRecurse(prefix, nodep->op1p());
|
||||||
if (nodep->op2p()) addPrefixToBlocksRecurse(nodep->op2p());
|
if (nodep->op2p()) addPrefixToBlocksRecurse(prefix, nodep->op2p());
|
||||||
if (nodep->op3p()) addPrefixToBlocksRecurse(nodep->op3p());
|
if (nodep->op3p()) addPrefixToBlocksRecurse(prefix, nodep->op3p());
|
||||||
if (nodep->op4p()) addPrefixToBlocksRecurse(nodep->op4p());
|
if (nodep->op4p()) addPrefixToBlocksRecurse(prefix, nodep->op4p());
|
||||||
if (nodep->nextp()) addPrefixToBlocksRecurse(nodep->nextp());
|
if (nodep->nextp()) addPrefixToBlocksRecurse(prefix, nodep->nextp());
|
||||||
}
|
}
|
||||||
|
|
||||||
// VISITORS
|
// VISITORS
|
||||||
|
|
@ -240,7 +240,8 @@ class LinkJumpVisitor final : public VNVisitor {
|
||||||
VL_DO_DANGLING(nodep->deleteTree(), nodep);
|
VL_DO_DANGLING(nodep->deleteTree(), nodep);
|
||||||
if (bodyp) {
|
if (bodyp) {
|
||||||
AstNode* const copiedBodyp = bodyp->cloneTree(false);
|
AstNode* const copiedBodyp = bodyp->cloneTree(false);
|
||||||
addPrefixToBlocksRecurse(copiedBodyp);
|
addPrefixToBlocksRecurse("__Vdo_while1_", copiedBodyp);
|
||||||
|
addPrefixToBlocksRecurse("__Vdo_while2_", bodyp);
|
||||||
whilep->addHereThisAsNext(copiedBodyp);
|
whilep->addHereThisAsNext(copiedBodyp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,15 @@ module t (/*AUTOARG*/);
|
||||||
end while (a < 0);
|
end while (a < 0);
|
||||||
if (a != 5) $stop;
|
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");
|
$write("*-* All Finished *-*\n");
|
||||||
$finish;
|
$finish;
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue