From cb1186aac52a5797e2f5f4ccde3f47b34f4bc7d6 Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Fri, 29 Aug 2025 04:40:22 +0000 Subject: [PATCH] Make Const::as_string work without reducing packed bits to vector --- kernel/rtlil.cc | 19 +++++++++---------- tests/unit/kernel/rtlilTest.cc | 7 +++++++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index f2ac1dee8..7a65a6db6 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -542,18 +542,17 @@ std::optional RTLIL::Const::as_int_compress(bool is_signed) const std::string RTLIL::Const::as_string(const char* any) const { - bitvectorize_internal(); - bitvectype& bv = get_bits(); + int sz = size(); std::string ret; - ret.reserve(bv.size()); - for (size_t i = bv.size(); i > 0; i--) - switch (bv[i-1]) { - case S0: ret += "0"; break; - case S1: ret += "1"; break; - case Sx: ret += "x"; break; - case Sz: ret += "z"; break; + ret.reserve(sz); + for (int i = sz - 1; i >= 0; --i) + switch ((*this)[i]) { + case S0: ret.push_back('0'); break; + case S1: ret.push_back('1'); break; + case Sx: ret.push_back('x'); break; + case Sz: ret.push_back('z'); break; case Sa: ret += any; break; - case Sm: ret += "m"; break; + case Sm: ret.push_back('m'); break; } return ret; } diff --git a/tests/unit/kernel/rtlilTest.cc b/tests/unit/kernel/rtlilTest.cc index 4d8736ea3..366d022de 100644 --- a/tests/unit/kernel/rtlilTest.cc +++ b/tests/unit/kernel/rtlilTest.cc @@ -124,6 +124,13 @@ namespace RTLIL { EXPECT_TRUE(c.as_bool()); EXPECT_TRUE(c.is_str()); } + + { + Const c(0x2, 8); + EXPECT_TRUE(c.is_str()); + EXPECT_EQ(c.as_string(), "00000010"); + EXPECT_TRUE(c.is_str()); + } } TEST_F(KernelRtlilTest, ConstConstIteratorWorks) {