diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index 0afe2a3c0..b07468e12 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -257,9 +257,34 @@ RTLIL::Const::Const(const std::string &str) tag = backing_tag::string; } +RTLIL::Const::Const(long long val) // default width 32 +{ + flags = RTLIL::CONST_FLAG_NONE; + char bytes[] = { + (char)(val >> 24), (char)(val >> 16), (char)(val >> 8), (char)val + }; + new ((void*)&str_) std::string(bytes, 4); + tag = backing_tag::string; +} + RTLIL::Const::Const(long long val, int width) { flags = RTLIL::CONST_FLAG_NONE; + if ((width & 7) == 0) { + new ((void*)&str_) std::string(); + tag = backing_tag::string; + std::string& str = get_str(); + int bytes = width >> 3; + signed char sign_byte = val < 0 ? -1 : 0; + str.resize(bytes, sign_byte); + bytes = std::min(bytes, sizeof(val)); + for (int i = 0; i < bytes; i++) { + str[str.size() - 1 - i] = val; + val = val >> 8; + } + return; + } + new ((void*)&bits_) bitvectype(); tag = backing_tag::bits; bitvectype& bv = get_bits(); diff --git a/kernel/rtlil.h b/kernel/rtlil.h index 0691ac2a6..6bb6f1fe1 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -843,7 +843,8 @@ private: public: Const() : flags(RTLIL::CONST_FLAG_NONE), tag(backing_tag::bits), bits_(std::vector()) {} Const(const std::string &str); - Const(long long val, int width = 32); + Const(long long val); // default width is 32 + Const(long long val, int width); Const(RTLIL::State bit, int width = 1); Const(std::vector bits) : flags(RTLIL::CONST_FLAG_NONE), tag(backing_tag::bits), bits_(std::move(bits)) {} Const(const std::vector &bits); diff --git a/tests/unit/kernel/rtlilTest.cc b/tests/unit/kernel/rtlilTest.cc index a9b7c3ada..0b7fbfd37 100644 --- a/tests/unit/kernel/rtlilTest.cc +++ b/tests/unit/kernel/rtlilTest.cc @@ -88,6 +88,31 @@ namespace RTLIL { EXPECT_TRUE(cs1.is_bits()); } + { + Const c(0x12345678); + EXPECT_TRUE(c.is_str()); + EXPECT_EQ(c.as_int(), 0x12345678); + } + + { + Const c(0xab, 8); + EXPECT_TRUE(c.is_str()); + EXPECT_EQ(c.as_int(), 0xab); + } + + { + Const c(0x12345678, 80); + EXPECT_TRUE(c.is_str()); + EXPECT_EQ(c.as_int(), 0x12345678); + EXPECT_EQ(c[79], S0); + } + + { + Const c(-1, 80); + EXPECT_TRUE(c.is_str()); + EXPECT_EQ(c.as_int(), -1); + EXPECT_EQ(c[79], S1); + } } TEST_F(KernelRtlilTest, ConstConstIteratorWorks) {