diff --git a/Makefile b/Makefile index 0888ae3b53c..f2e81b0c725 100644 --- a/Makefile +++ b/Makefile @@ -916,8 +916,8 @@ ystests: $(TARGETS) $(EXTRA_TARGETS) # Unit test unit-test: libyosys.so - @$(MAKE) -C $(UNITESTPATH) CXX="$(CXX)" CPPFLAGS="$(CPPFLAGS)" \ - CXXFLAGS="$(CXXFLAGS)" LIBS="$(LIBS)" ROOTPATH="$(CURDIR)" + @$(MAKE) -C $(UNITESTPATH) CXX="$(CXX)" CC="$(CC)" CPPFLAGS="$(CPPFLAGS)" \ + CXXFLAGS="$(CXXFLAGS)" LINKFLAGS="$(LINKFLAGS)" LIBS="$(LIBS)" ROOTPATH="$(CURDIR)" clean-unit-test: @$(MAKE) -C $(UNITESTPATH) clean diff --git a/kernel/rtlil.h b/kernel/rtlil.h index da57e01519b..783dcb4dd82 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -667,6 +667,8 @@ struct RTLIL::Const { short flags; private: + friend class KernelRtlilTest; + FRIEND_TEST(KernelRtlilTest, ConstStr); using bitvectype = std::vector; enum class backing_tag: bool { bits, string }; // Do not access the union or tag even in Const methods unless necessary diff --git a/kernel/yosys_common.h b/kernel/yosys_common.h index 56d2356b102..cd5d7e92d44 100644 --- a/kernel/yosys_common.h +++ b/kernel/yosys_common.h @@ -50,6 +50,8 @@ #include #include +#include + #ifdef WITH_PYTHON #include #endif diff --git a/tests/unit/Makefile b/tests/unit/Makefile index b4a752f8f47..4c2848ea28f 100644 --- a/tests/unit/Makefile +++ b/tests/unit/Makefile @@ -15,7 +15,7 @@ TESTS := $(addprefix $(BINTEST)/, $(basename $(ALLTESTFILE:%Test.cc=%Test.o))) all: prepare $(TESTS) run-tests $(BINTEST)/%: $(OBJTEST)/%.o - $(CXX) -L$(ROOTPATH) $(RPATH)=$(ROOTPATH) -o $@ $^ $(LIBS) \ + $(CXX) -L$(ROOTPATH) $(RPATH)=$(ROOTPATH) $(LINKFLAGS) -o $@ $^ $(LIBS) \ $(GTESTFLAG) $(EXTRAFLAGS) $(OBJTEST)/%.o: $(basename $(subst $(OBJTEST),.,%)).cc diff --git a/tests/unit/kernel/rtlilTest.cc b/tests/unit/kernel/rtlilTest.cc index d9eeed555ad..1d5ef3a833c 100644 --- a/tests/unit/kernel/rtlilTest.cc +++ b/tests/unit/kernel/rtlilTest.cc @@ -1,14 +1,79 @@ #include - -#include "kernel/yosys.h" #include "kernel/rtlil.h" YOSYS_NAMESPACE_BEGIN -TEST(KernelRtlilTest, getReferenceValid) -{ - //TODO: Implement rtlil test - EXPECT_EQ(33, 33); +namespace RTLIL { + + class KernelRtlilTest : public testing::Test {}; + + TEST_F(KernelRtlilTest, ConstAssignCompare) + { + Const c1; + Const c2; + c2 = c1; + Const c3(c2); + EXPECT_TRUE(c2 == c3); + EXPECT_FALSE(c2 < c3); + } + + TEST_F(KernelRtlilTest, ConstStr) { + // We have multiple distinct sections since it's annoying + // to list multiple testcases as friends of Const in kernel/rtlil.h + { + std::string foo = "foo"; + Const c1 = foo; + Const c2; + c2 = c1; + Const c3(c2); + EXPECT_TRUE(c1.is_str()); + EXPECT_TRUE(c2.is_str()); + EXPECT_TRUE(c3.is_str()); + } + + { + // A binary constant is bitvec backed + Const cb1(0, 10); + Const cb2(1, 10); + Const cb3(cb2); + std::vector v1 {false, true}; + std::vector v2 {State::S0, State::S1}; + Const cb4(v1); + Const cb5(v2); + EXPECT_TRUE(cb4 == cb5); + EXPECT_TRUE(cb1.is_bits()); + EXPECT_TRUE(cb2.is_bits()); + EXPECT_TRUE(cb3.is_bits()); + EXPECT_TRUE(cb4.is_bits()); + EXPECT_TRUE(cb5.is_bits()); + EXPECT_EQ(cb1.size(), 10); + EXPECT_EQ(cb2.size(), 10); + EXPECT_EQ(cb3.size(), 10); + } + + { + // A string constructed Const starts off packed + std::string foo = "foo"; + Const cs1 = foo; + EXPECT_TRUE(cs1.is_str()); + + // It can be iterated without mutating + int i = 0; + for (auto bit : cs1) { + i += bit; + } + EXPECT_EQ(i, 16); + EXPECT_TRUE(cs1.is_str()); + + // It can be mutated with the bits() view + // and decays into unpacked + for (auto& bit : cs1.bits()) { + bit = State::Sx; + } + EXPECT_TRUE(cs1.is_bits()); + } + + } } YOSYS_NAMESPACE_END