Reland and fix "Fix wide enum names" (#8344) (#8362) (#8365) (#8366)

This commit is contained in:
Marco Bartoli
2026-09-16 17:47:51 -04:00
committed by GitHub
parent 9f66980355
commit 08cadc034d
23 changed files with 910 additions and 158 deletions
+35
View File
@@ -645,6 +645,41 @@ string V3Number::displayPad(size_t fmtsize, char pad, bool left, const string& i
return left ? (in + padding) : (padding + in);
}
string V3Number::displayedEnumName(const AstEnumItem* itemp) {
const string name = VIdProtect::protect(itemp->prettyName());
return VString::isIdentifier(name) && !std::isdigit(static_cast<unsigned char>(name[0]))
? name
: "\\" + name + " ";
}
string V3Number::displayedEnumName(const AstEnumDType* dtypep) const VL_MT_STABLE {
V3Number value{this, dtypep->width()};
value.opAssign(*this);
for (const AstEnumItem* itemp = dtypep->itemsp(); itemp;
itemp = VN_AS(itemp->nextp(), EnumItem)) {
const AstConst* const constp = VN_AS(itemp->valuep(), Const);
if (!constp->num().isAnyXZ() && value.isCaseEq(constp->num()))
return displayedEnumName(itemp);
}
return "";
}
string V3Number::displayedEnum(const AstSFormatArg* argp,
const string& vformat) const VL_MT_STABLE {
const AstEnumDType* const dtypep = VN_AS(argp->dtypep()->skipRefToEnump(), EnumDType);
V3Number value{this, dtypep->width()};
value.opAssign(*this);
const VFormatAttr numericAttr
= dtypep->isSigned() ? VFormatAttr::SIGNED : VFormatAttr::UNSIGNED;
const char fmt = std::tolower(vformat.back());
if (fmt != 'p' && fmt != 's') return value.displayed(argp, vformat, numericAttr);
string name = value.displayedEnumName(dtypep);
if (name.empty()) name = value.displayed(argp, fmt == 'p' ? vformat : "%0d", numericAttr);
V3Number nameNum{this};
nameNum.setString(name);
return nameNum.displayed(argp, vformat, VFormatAttr::COMPLEX);
}
string V3Number::displayed(const AstNode* nodep, const string& vformat,
const VFormatAttr& formatAttr) const VL_MT_STABLE {
return displayed(nodep->fileline(), vformat, formatAttr);