From feedf62f8d773252a9e070776ef581483d4c6a6d Mon Sep 17 00:00:00 2001 From: Thorsten de Buhr Date: Mon, 31 Aug 2026 16:16:11 +0200 Subject: [PATCH] [svdconv] Correct enum combo width warning Report the actual field width and the six-bit combo limit instead of the incorrect 256-element maximum. Add integration coverage for the six- and seven-bit boundary. --- .../SVDGenerator/src/SfdData_SingleItems.cpp | 6 +- .../data/enumComboWidth/EnumComboWidth.svd | 75 +++++++++++++++++++ .../test/integtests/src/SvdConvIntegTests.cpp | 50 +++++++++++++ 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd diff --git a/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp b/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp index 53fa787e3..68481d1d0 100644 --- a/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp +++ b/tools/svdconv/SVDGenerator/src/SfdData_SingleItems.cpp @@ -954,7 +954,11 @@ bool SfdData::CreateFieldItem(SvdField* field) if(bitWidth > MAX_BITWIDTH_FOR_COMBO && firstContHasChilds) { string msg = "Enumerated values list for field '"; msg += field->GetNameCalculated(); - msg += "' exceeds maximum of 256 elements. List will not be generated."; + msg += "' will not be generated: field width "; + msg += to_string(bitWidth); + msg += " exceeds the maximum of "; + msg += to_string(MAX_BITWIDTH_FOR_COMBO); + msg += " bits."; LogMsg("M227", MSG(msg), field->GetLineNumber()); } diff --git a/tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd b/tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd new file mode 100644 index 000000000..e8c1695d2 --- /dev/null +++ b/tools/svdconv/test/data/enumComboWidth/EnumComboWidth.svd @@ -0,0 +1,75 @@ + + + + EnumComboWidth + 1.0 + Test the SFD combo field width limit + 8 + 32 + 0x20 + 0x0 + 0xFFFFFFFF + + + CM4 + r0p0 + little + false + 4 + 16 + + + + + TEST + Test peripheral + Enum Combo Width + 0x40000000 + + 0x0 + 0x4 + registers + + + + CTRL + Test control register + 0x0 + 0x20 + read-only + 0x0 + + + SIX_BIT + Six bit field + 0 + 6 + + + ONE + Value one + 1 + + + + + SEVEN_BIT + Seven bit field + 8 + 7 + + + NINE + Value nine + 9 + + + + + + + + + diff --git a/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp b/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp index a038befa1..95ae6d7e0 100644 --- a/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp +++ b/tools/svdconv/test/integtests/src/SvdConvIntegTests.cpp @@ -252,3 +252,53 @@ TEST_F(SvdConvIntegTests, CheckPosMaskDimFields) { EXPECT_EQ(string::npos, buf.find("#define TIM_DATA_PIN_Pos")); EXPECT_EQ(string::npos, buf.find("#define TIM_DATA_PIN_Msk")); } + +TEST_F(SvdConvIntegTests, CheckEnumComboWidthLimit) { + const string& inFile = SvdConvIntegTestEnv::localtestdata_dir + "/enumComboWidth/EnumComboWidth.svd"; + const string testOut = SvdConvIntegTestEnv::testoutput_dir + "/enumComboWidth"; + ASSERT_TRUE(RteFsUtils::Exists(inFile)); + + Arguments args("SVDConv.exe", inFile); + args.add({ "-o", testOut, "--generate=sfd", "--create-folder" }); + + SvdConv svdConv; + EXPECT_EQ(1, svdConv.Check(args, args, nullptr)); + + const auto msgs = ErrLog::Get()->GetLogMessages(); + size_t m227Count = 0; + string allMessages; + for(const auto& msg : msgs) { + allMessages += msg; + if(msg.find("M227") != string::npos) { + ++m227Count; + } + } + EXPECT_EQ(1U, m227Count); + EXPECT_NE(string::npos, allMessages.find("field 'SEVEN_BIT'")); + EXPECT_NE(string::npos, allMessages.find("field width 7")); + EXPECT_NE(string::npos, allMessages.find("maximum of 6 bits")); + + const string testOutSfd = testOut + "/EnumComboWidth.sfd"; + ASSERT_TRUE(RteFsUtils::Exists(testOutSfd)); + + string buf; + RteFsUtils::ReadFile(testOutSfd, buf); + ASSERT_FALSE(buf.empty()); + + const auto sixBitField = buf.find("SFDITEM_FIELD__TEST_CTRL_SIX_BIT"); + const auto sevenBitField = buf.find("SFDITEM_FIELD__TEST_CTRL_SEVEN_BIT"); + ASSERT_NE(string::npos, sixBitField); + ASSERT_NE(string::npos, sevenBitField); + ASSERT_LT(sixBitField, sevenBitField); + + const auto sixBitCombo = buf.find("// ", sixBitField); + EXPECT_NE(string::npos, sixBitCombo); + EXPECT_LT(sixBitCombo, sevenBitField); + const auto sixBitLastValue = buf.find("// <63=>", sixBitCombo); + EXPECT_NE(string::npos, sixBitLastValue); + EXPECT_LT(sixBitLastValue, sevenBitField); + + const auto sevenBitEdit = buf.find("// ", sevenBitField); + EXPECT_NE(string::npos, sevenBitEdit); + EXPECT_EQ(string::npos, buf.find("// ", sevenBitField)); +}