| # Each plugin shall have a directory named 'test' that contains test cases |
| # directories and a Makefile which includes this Makefile template. |
| # The test Makefile specifies which tests to execute and how to verify them. |
| # The test to execute should be explicitly specified in the TESTS variable. |
| # Each test needs a verification step define in the name_of_test_verify variable. |
| # A simple diff verification template have been defined in the template Makefile |
| # diff_test performs a simple diff and takes name of file and its extension |
| # Example of a test Makefile is given below: |
| # |
| # include $(shell pwd)/../../Makefile_test.common |
| # TESTS = test1 test2 |
| # test1_verify = $(call diff_test,test1,ext) && test $$(grep "PASS" test1/test1.txt | wc -l) -eq 2 |
| # test2_verify = $(call diff_test,test2,ext) |
| # |
| GTEST_DIR = ../../third_party/googletest/googletest |
| CXX = $(shell yosys-config --cxx) |
| CXXFLAGS = $(shell yosys-config --cxxflags) -I.. -I$(GTEST_DIR)/include |
| LDLIBS = $(shell yosys-config --ldlibs) -L$(GTEST_DIR)/build/lib -lgtest -lgtest_main -lpthread |
| LDFLAGS = $(shell yosys-config --ldflags) |
| |
| define test_tpl = |
| $(1): $(1)/ok |
| @echo "Verifying result of test $(1)" |
| @set +e; \ |
| $$($(1)_verify); \ |
| if [ $$$$? -eq 0 ]; then \ |
| echo "Test $(1) PASSED"; \ |
| touch $$<; \ |
| true; \ |
| else \ |
| echo "Test $(1) FAILED"; \ |
| false; \ |
| fi |
| |
| $(1)/ok: $(1)/$(1).v |
| @echo "Running test $(1)" |
| @set +e; \ |
| cd $(1); \ |
| DESIGN_TOP=$(1) \ |
| yosys -c $(1).tcl -q -l $(1).log; \ |
| RETVAL=$$$$?; \ |
| if [ ! -z "$$($(1)_negative)" ] && [ $$($(1)_negative) -eq 1 ]; then \ |
| if [ $$$$RETVAL -ne 0 ]; then \ |
| echo "Negative test $(1) PASSED"; \ |
| true; \ |
| else \ |
| echo "Negative test $(1) FAILED"; \ |
| false; \ |
| fi \ |
| else \ |
| if [ $$$$RETVAL -ne 0 ]; then \ |
| echo "Unexpected runtime error"; \ |
| false; \ |
| fi \ |
| fi |
| |
| endef |
| |
| define unit_test_tpl = |
| $(1): $(1)/$(1).test |
| @$$< |
| |
| $(1)/$(1).test: $(1)/$(1).test.o $$(GTEST_DIR)/build/lib/libgtest.a |
| @$(CXX) $(LDFLAGS) -o $$@ $$< $(LDLIBS) |
| |
| $(1)/$(1).test.o: $(1)/$(1).test.cc |
| @$(CXX) $(CXXFLAGS) $(LDFLAGS) -c $$< -o $$@ |
| |
| endef |
| |
| diff_test = diff $(1)/$(1).golden.$(2) $(1)/$(1).$(2) |
| |
| all: $(TESTS) $(UNIT_TESTS) |
| |
| $(GTEST_DIR)/build/lib/libgtest.a $(GTEST_DIR)/build/lib/libgtest_main.a: |
| @mkdir -p $(GTEST_DIR)/build |
| @cd $(GTEST_DIR)/build; \ |
| cmake ..; \ |
| make |
| |
| .PHONY: all clean $(TESTS) $(UNIT_TESTS) |
| |
| $(foreach test,$(TESTS),$(eval $(call test_tpl,$(test)))) |
| $(foreach test,$(UNIT_TESTS),$(eval $(call unit_test_tpl,$(test)))) |
| |
| clean: |
| @rm -rf $(foreach test,$(TESTS),$(test)/$(test).sdc $(test)/$(test).txt $(test)/$(test).eblif $(test)/$(test).json) |
| @rm -rf $(foreach test,$(UNIT_TESTS),$(test)/$(test).test.o $(test)/$(test).test.d $(test)/$(test).test) |
| @find . -name "ok" -or -name "*.log" | xargs rm -rf |