Fix JSON output case statements (#6733).

This commit is contained in:
Wilson Snyder 2025-12-26 22:43:06 -05:00
parent 7a2b20cff3
commit 2318adabd3
6 changed files with 566 additions and 449 deletions

View File

@ -95,6 +95,7 @@ Verilator 5.043 devel
* Fix X handling in UDPs (#6722) (#6723). [Michael Bikovitsky]
* Fix `--prof-exec` using `--lib-create`. [Geza Lore]
* Fix fork scheduling semantics (#6730). [Artur Bieniek, Antmicro Ltd.]
* Fix JSON output case statements (#6733).
* Fix internal fault when cross-class calling with DPI (#6735) (#6742). [Matthew Ballance]
* Fix write variable placement for global constraints (#6740) (#6750) (#6797). [Yilou Wang]
* Fix JSON dump missing output ports (#6751) (#6831). [Oleh Maksymenko]

View File

@ -949,6 +949,7 @@ protected:
static void dumpJsonNum(std::ostream& os, const std::string& name, int64_t val);
static void dumpJsonBool(std::ostream& os, const std::string& name, bool val);
static void dumpJsonBoolIf(std::ostream& os, const std::string& name, bool val);
static void dumpJsonStr(std::ostream& os, const std::string& name, const std::string& val);
static void dumpJsonPtr(std::ostream& os, const std::string& name, const AstNode* const valp);

View File

@ -381,6 +381,8 @@ public:
addItemsp(itemsp);
}
ASTGEN_MEMBERS_AstCase;
void dump(std::ostream& str) const override;
void dumpJson(std::ostream& str) const override;
int instrCount() const override { return INSTR_COUNT_BRANCH; }
string verilogKwd() const override { return casez() ? "casez" : casex() ? "casex" : "case"; }
bool sameNode(const AstNode* samep) const override {

View File

@ -41,6 +41,9 @@ void AstNode::dumpJsonNum(std::ostream& os, const std::string& name, int64_t val
void AstNode::dumpJsonBool(std::ostream& os, const std::string& name, bool val) {
os << ",\"" << name << "\":" << (val ? "true" : "false");
}
void AstNode::dumpJsonBoolIf(std::ostream& os, const std::string& name, bool val) {
if (val) dumpJsonBool(os, name, val);
}
void AstNode::dumpJsonStr(std::ostream& os, const std::string& name, const std::string& val) {
os << ",\"" << name << "\":\"" << V3OutFormatter::quoteNameControls(val) << '"';
}
@ -54,6 +57,7 @@ void AstNode::dumpJsonPtr(std::ostream& os, const std::string& name, const AstNo
// Shorthands for dumping fields that use func name as key
#define dumpJsonNumFunc(os, func) dumpJsonNum(os, #func, func())
#define dumpJsonBoolFunc(os, func) dumpJsonBool(os, #func, func())
#define dumpJsonBoolFuncIf(os, func) dumpJsonBoolIf(os, #func, func())
#define dumpJsonStrFunc(os, func) dumpJsonStr(os, #func, func())
#define dumpJsonPtrFunc(os, func) dumpJsonPtr(os, #func, func())
@ -374,6 +378,20 @@ void AstCReset::dumpJson(std::ostream& str) const {
dumpJsonGen(str);
}
void AstCase::dump(std::ostream& str) const {
this->AstNode::dump(str);
str << " " << verilogKwd();
}
void AstCase::dumpJson(std::ostream& str) const {
dumpJsonStr(str, "kwd", verilogKwd());
dumpJsonBoolIf(str, "full", fullPragma());
dumpJsonBoolIf(str, "parallel", parallelPragma());
dumpJsonBoolIf(str, "unique", uniquePragma());
dumpJsonBoolIf(str, "unique0", unique0Pragma());
dumpJsonBoolIf(str, "priority", priorityPragma());
dumpJsonGen(str);
}
AstVar* AstClocking::ensureEventp(bool childDType) {
if (!eventp()) {
AstVar* const evp
@ -1797,7 +1815,7 @@ void AstClass::dump(std::ostream& str) const {
}
void AstClass::dumpJson(std::ostream& str) const {
// dumpJsonNumFunc(str, declTokenNum); // Not dumped as adding token changes whole file
if (isCovergroup()) dumpJsonBoolFunc(str, isCovergroup);
dumpJsonBoolFuncIf(str, isCovergroup);
dumpJsonBoolFunc(str, isExtended);
dumpJsonBoolFunc(str, isInterfaceClass);
dumpJsonBoolFunc(str, isVirtual);
@ -2539,8 +2557,8 @@ void AstPatMember::dump(std::ostream& str) const {
if (isDefault()) str << " [DEFAULT]";
}
void AstPatMember::dumpJson(std::ostream& str) const {
if (isConcat()) dumpJsonBoolFunc(str, isConcat);
if (isDefault()) dumpJsonBoolFunc(str, isDefault);
dumpJsonBoolFuncIf(str, isConcat);
dumpJsonBoolFuncIf(str, isDefault);
dumpJsonGen(str);
}
void AstNodeTriop::dump(std::ostream& str) const { this->AstNodeExpr::dump(str); }
@ -2996,8 +3014,8 @@ void AstNodeFTask::dumpJson(std::ostream& str) const {
dumpJsonBoolFunc(str, dpiOpenParent);
dumpJsonBoolFunc(str, isExternDef);
dumpJsonBoolFunc(str, isExternProto);
if (isVirtual()) dumpJsonBoolFunc(str, isVirtual);
if (needProcess()) dumpJsonBoolFunc(str, needProcess);
dumpJsonBoolFuncIf(str, isVirtual);
dumpJsonBoolFuncIf(str, needProcess);
dumpJsonBoolFunc(str, prototype);
dumpJsonBoolFunc(str, recursive);
dumpJsonBoolFunc(str, taskPublic);

View File

@ -141,4 +141,16 @@ module Test(/*AUTOARG*/
cover_concurrent_stmt: cover property(prop) $display("pass");
restrict property (prop);
always_ff @(posedge clk) begin
unique0 casez(in)
1: $display("1a");
default: $display("1b");
endcase
priority casez(1'b1)
in[0]: $display("2a");
default: $display("2b");
endcase
end
endmodule

File diff suppressed because it is too large Load Diff