diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 82357bc71..03da35ba1 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -505,18 +505,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) {