Fix stable name generation in V3Fork (#4615) (#4624)

This commit is contained in:
Krzysztof Boroński 2023-10-27 21:08:02 +02:00 committed by GitHub
parent e6135981a5
commit 89743aae5d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 25 additions and 18 deletions

View File

@ -67,17 +67,20 @@ private:
AstNode* const m_procp; // Procedure/block associated with that dynscope
std::set<AstVar*> m_captures; // Variables to be moved into the dynscope
ForkDynScopeInstance m_instance; // Nodes to be injected into the AST to create the dynscope
const size_t m_class_id; // Dynscope class ID
const size_t m_id; // Dynscope ID
public:
ForkDynScopeFrame(AstNodeModule* modp, AstNode* procp)
ForkDynScopeFrame(AstNodeModule* modp, AstNode* procp, size_t class_id, size_t id)
: m_modp{modp}
, m_procp{procp} {}
, m_procp{procp}
, m_class_id{class_id}
, m_id{id} {}
ForkDynScopeInstance& createInstancePrototype() {
UASSERT_OBJ(!m_instance.initialized(), m_procp, "Dynamic scope already instantiated.");
m_instance.m_classp
= new AstClass{m_procp->fileline(), generateDynScopeClassName(m_procp)};
m_instance.m_classp = new AstClass{m_procp->fileline(), generateDynScopeClassName()};
m_instance.m_refDTypep
= new AstClassRefDType{m_procp->fileline(), m_instance.m_classp, nullptr};
v3Global.rootp()->typeTablep()->addTypesp(m_instance.m_refDTypep);
@ -203,7 +206,7 @@ private:
AstBegin* const beginp = new AstBegin{
forkp->fileline(),
"_Vwrapped_" + (forkp->name().empty() ? cvtToHex(forkp) : forkp->name()),
"_Vwrapped_" + (forkp->name().empty() ? "" : forkp->name() + "_") + cvtToStr(m_id),
m_instance.m_handlep, false, true};
forkHandle.relink(beginp);
@ -223,14 +226,11 @@ private:
m_modp->addStmtsp(m_instance.m_classp);
}
static string generateDynScopeClassName(const AstNode* fromp) {
string n = "__VDynScope__" + (!fromp->name().empty() ? (fromp->name() + "__") : "ANON__")
+ cvtToHex(fromp);
return n;
}
string generateDynScopeClassName() { return "__VDynScope_" + cvtToStr(m_class_id); }
static string generateDynScopeHandleName(const AstNode* fromp) {
return "__VDynScope_" + (fromp->name().empty() ? cvtToHex(fromp) : fromp->name());
string generateDynScopeHandleName(const AstNode* fromp) {
return "__VDynScope_" + (!fromp->name().empty() ? (fromp->name() + "_") : "ANON_")
+ cvtToStr(m_id);
}
AstNode* getProcStmts() {
@ -270,6 +270,8 @@ private:
int m_forkDepth = 0; // Number of asynchronous forks we are currently under
bool m_afterTimingControl = false; // A timing control might've be executed in the current
// process
size_t m_id; // Unique ID for a frame
size_t m_class_id; // Unique ID for a frame class
// METHODS
@ -286,7 +288,8 @@ private:
}
ForkDynScopeFrame* pushDynScopeFrame(AstNode* procp) {
ForkDynScopeFrame* const framep = new ForkDynScopeFrame{m_modp, procp};
ForkDynScopeFrame* const framep
= new ForkDynScopeFrame{m_modp, procp, m_class_id++, m_id++};
auto r = m_frames.emplace(std::make_pair(procp, framep));
UASSERT_OBJ(r.second, m_modp, "Procedure already contains a frame");
return framep;
@ -336,6 +339,7 @@ private:
void visit(AstNodeModule* nodep) override {
VL_RESTORER(m_modp);
if (!VN_IS(nodep, Class)) m_modp = nodep;
m_id = 0;
iterateChildren(nodep);
}
void visit(AstNodeFTask* nodep) override {
@ -463,6 +467,7 @@ private:
AstVar* m_capturedVarsp = nullptr; // Local copies of captured variables
std::set<AstVar*> m_forkLocalsp; // Variables local to a given fork
AstArg* m_capturedVarRefsp = nullptr; // References to captured variables (as args)
size_t m_id = 0; // Unique ID for a task
// METHODS
@ -492,8 +497,8 @@ private:
}
string generateTaskName(AstNode* fromp, const string& kind) {
return "__V" + kind + (!fromp->name().empty() ? (fromp->name() + "__") : "UNNAMED__")
+ cvtToHex(fromp);
return "__V" + kind + "_" + (!fromp->name().empty() ? (fromp->name() + "__") : "_")
+ cvtToStr(m_id++);
}
void visitTaskifiable(AstNode* nodep) {
@ -527,16 +532,16 @@ private:
if (AstBegin* beginp = VN_CAST(nodep, Begin)) {
UASSERT(beginp->stmtsp(), "No stmtsp\n");
const string taskName = generateTaskName(beginp, "__FORK_BEGIN_");
const string taskName = generateTaskName(beginp, "fork_begin");
taskp
= makeTask(beginp->fileline(), beginp->stmtsp()->unlinkFrBackWithNext(), taskName);
beginp->unlinkFrBack(&handle);
VL_DO_DANGLING(beginp->deleteTree(), beginp);
} else if (AstNodeStmt* stmtp = VN_CAST(nodep, NodeStmt)) {
const string taskName = generateTaskName(stmtp, "__FORK_STMT_");
const string taskName = generateTaskName(stmtp, "fork_stmt");
taskp = makeTask(stmtp->fileline(), stmtp->unlinkFrBack(&handle), taskName);
} else if (AstFork* forkp = VN_CAST(nodep, Fork)) {
const string taskName = generateTaskName(forkp, "__FORK_NESTED_");
const string taskName = generateTaskName(forkp, "fork_nested");
taskp = makeTask(forkp->fileline(), forkp->unlinkFrBack(&handle), taskName);
}
@ -614,7 +619,9 @@ private:
void visit(AstThisRef* nodep) override { return; }
void visit(AstNodeModule* nodep) override {
VL_RESTORER(m_modp);
VL_RESTORER(m_id);
m_modp = nodep;
m_id = 0;
iterateChildren(nodep);
}
void visit(AstNode* nodep) override {