|  | # -*- Makefile -*- | 
|  | # 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) | 
|  | TEST_UTILS ?= ../../../test-utils/test-utils.tcl | 
|  |  | 
|  | define test_tpl = | 
|  | $(1): $(1)/ok | 
|  | @set +e; \ | 
|  | $$($(1)_verify); \ | 
|  | if [ $$$$? -eq 0 ]; then \ | 
|  | printf "Test %-18s \e[32mPASSED\e[0m @ %s\n" $(1) $(CURDIR); \ | 
|  | touch $$<; \ | 
|  | true; \ | 
|  | else \ | 
|  | printf "Test %-18s \e[31;1mFAILED\e[0m @ %s\n" $(1) $(CURDIR); \ | 
|  | false; \ | 
|  | fi | 
|  |  | 
|  | $(1)/ok: $(1)/$(1).v | 
|  | @set +e; \ | 
|  | cd $(1); \ | 
|  | echo "source $(TEST_UTILS)" > run-$(1).tcl ;\ | 
|  | echo "source $(1).tcl" >> run-$(1).tcl ;\ | 
|  | DESIGN_TOP=$(1) TEST_OUTPUT_PREFIX=./ \ | 
|  | yosys -c "run-$(1).tcl" -q -q -l $(1).log; \ | 
|  | RETVAL=$$$$?; \ | 
|  | rm -f run-$(1).tcl; \ | 
|  | if [ ! -z "$$($(1)_negative)" ] && [ $$($(1)_negative) -eq 1 ]; then \ | 
|  | if [ $$$$RETVAL -ne 0 ]; then \ | 
|  | printf "Negative test %-18s \e[32mPASSED\e[0m @ %s\n" $(1) $(CURDIR); \ | 
|  | true; \ | 
|  | else \ | 
|  | printf "Negative test %-18s \e[31;1mFAILED\e[0m @ %s\n" $(1) $(CURDIR); \ | 
|  | 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)_[0-9].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 |