Internals: Add user#Or functions. No functional change.

This commit is contained in:
Wilson Snyder 2026-01-24 18:10:59 -05:00
parent 4ff57514c8
commit ad5005f8f5
3 changed files with 15 additions and 11 deletions

View File

@ -654,8 +654,9 @@ public:
void user1p(void* userp) { user1u(VNUser{userp}); } void user1p(void* userp) { user1u(VNUser{userp}); }
void user1(int val) { user1u(VNUser{val}); } void user1(int val) { user1u(VNUser{val}); }
int user1() const { return user1u().toInt(); } int user1() const { return user1u().toInt(); }
int user1Inc(int val = 1) { int v = user1(); user1(v + val); return v; } int user1Inc(int val = 1) { const int v = user1(); user1(v + val); return v; }
int user1SetOnce() { int v = user1(); if (!v) user1(1); return v; } // Better for cache than user1Inc() int user1Or(int val) { const int v = user1(); user1(v | val); return v; }
int user1SetOnce() { const int v = user1(); if (!v) user1(1); return v; } // Better for cache than user1Inc()
static void user1ClearTree() { VNUser1InUse::clear(); } // Clear userp()'s across the entire tree static void user1ClearTree() { VNUser1InUse::clear(); } // Clear userp()'s across the entire tree
VNUser user2u() const VL_MT_STABLE { VNUser user2u() const VL_MT_STABLE {
@ -668,8 +669,9 @@ public:
void user2p(void* userp) { user2u(VNUser{userp}); } void user2p(void* userp) { user2u(VNUser{userp}); }
void user2(int val) { user2u(VNUser{val}); } void user2(int val) { user2u(VNUser{val}); }
int user2() const { return user2u().toInt(); } int user2() const { return user2u().toInt(); }
int user2Inc(int val = 1) { int v = user2(); user2(v + val); return v; } int user2Inc(int val = 1) { const int v = user2(); user2(v + val); return v; }
int user2SetOnce() { int v = user2(); if (!v) user2(1); return v; } // Better for cache than user2Inc() int user2Or(int val) { const int v = user2(); user2(v | val); return v; }
int user2SetOnce() { const int v = user2(); if (!v) user2(1); return v; } // Better for cache than user2Inc()
static void user2ClearTree() { VNUser2InUse::clear(); } // Clear userp()'s across the entire tree static void user2ClearTree() { VNUser2InUse::clear(); } // Clear userp()'s across the entire tree
VNUser user3u() const VL_MT_STABLE { VNUser user3u() const VL_MT_STABLE {
@ -682,8 +684,9 @@ public:
void user3p(void* userp) { user3u(VNUser{userp}); } void user3p(void* userp) { user3u(VNUser{userp}); }
void user3(int val) { user3u(VNUser{val}); } void user3(int val) { user3u(VNUser{val}); }
int user3() const { return user3u().toInt(); } int user3() const { return user3u().toInt(); }
int user3Inc(int val = 1) { int v = user3(); user3(v + val); return v; } int user3Inc(int val = 1) { const int v = user3(); user3(v + val); return v; }
int user3SetOnce() { int v = user3(); if (!v) user3(1); return v; } // Better for cache than user3Inc() int user3Or(int val) { const int v = user3(); user3(v | val); return v; }
int user3SetOnce() { const int v = user3(); if (!v) user3(1); return v; } // Better for cache than user3Inc()
static void user3ClearTree() { VNUser3InUse::clear(); } // Clear userp()'s across the entire tree static void user3ClearTree() { VNUser3InUse::clear(); } // Clear userp()'s across the entire tree
VNUser user4u() const VL_MT_STABLE { VNUser user4u() const VL_MT_STABLE {
@ -696,8 +699,9 @@ public:
void user4p(void* userp) { user4u(VNUser{userp}); } void user4p(void* userp) { user4u(VNUser{userp}); }
void user4(int val) { user4u(VNUser{val}); } void user4(int val) { user4u(VNUser{val}); }
int user4() const { return user4u().toInt(); } int user4() const { return user4u().toInt(); }
int user4Inc(int val = 1) { int v = user4(); user4(v + val); return v; } int user4Or(int val) { const int v = user4(); user4(v | val); return v; }
int user4SetOnce() { int v = user4(); if (!v) user4(1); return v; } // Better for cache than user4Inc() int user4Inc(int val = 1) { const int v = user4(); user4(v + val); return v; }
int user4SetOnce() { const int v = user4(); if (!v) user4(1); return v; } // Better for cache than user4Inc()
static void user4ClearTree() { VNUser4InUse::clear(); } // Clear userp()'s across the entire tree static void user4ClearTree() { VNUser4InUse::clear(); } // Clear userp()'s across the entire tree
// clang-format on // clang-format on

View File

@ -214,7 +214,7 @@ class OrderGraphBuilder final : public VNVisitor {
// Variable is produced // Variable is produced
if (gen) { if (gen) {
// Update VarUsage // Update VarUsage
varscp->user2(varscp->user2() | VU_GEN); varscp->user2Or(VU_GEN);
// Add edges for produced variables // Add edges for produced variables
if (m_inPost) { if (m_inPost) {
if (!varscp->varp()->ignorePostWrite()) { if (!varscp->varp()->ignorePostWrite()) {
@ -253,7 +253,7 @@ class OrderGraphBuilder final : public VNVisitor {
// Variable is consumed // Variable is consumed
if (con) { if (con) {
// Update VarUsage // Update VarUsage
varscp->user2(varscp->user2() | VU_CON); varscp->user2Or(VU_CON);
// Add edges // Add edges
if (m_inPost) { if (m_inPost) {
// Combinational logic // Combinational logic

View File

@ -100,7 +100,7 @@ enum PropagationType : uint8_t {
}; };
// Add timing flag to a node // Add timing flag to a node
static void addFlags(AstNode* const nodep, uint8_t flags) { nodep->user2(nodep->user2() | flags); } static void addFlags(AstNode* const nodep, uint8_t flags) { nodep->user2Or(flags); }
// Check if a node has ALL of the expected flags set // Check if a node has ALL of the expected flags set
static bool hasFlags(AstNode* const nodep, uint8_t flags) { return !(~nodep->user2() & flags); } static bool hasFlags(AstNode* const nodep, uint8_t flags) { return !(~nodep->user2() & flags); }