diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..21346c7 --- /dev/null +++ b/Makefile @@ -0,0 +1,127 @@ +CC = gcc +CFLAGS = -std=c89 -pedantic -Wall -Werror -O2 + +IV = iverilog + +IVFLAGS = -Iinclude/ -DSIMULATION +# The macroassembly header file is somewhat different thing, but I don't know +# what place would be more suitable for it than include/ dir +MACROASM_FLAGS := -Iinclude/ -E + +# It made sense to just list all of those in this variable +# and then prepend stack_machine_ to each element +STACK_MACHINE_TESTS := \ + store \ + load_store \ + multiinstructions_load_store \ + add \ + sub \ + div \ + mul + +# Add other tests here if You need +TESTS := \ + self \ + intercon \ + div \ + vga \ + $(addprefix stack_machine_,$(STACK_MACHINE_TESTS)) + +# For each of these Makefile will attempt to generate VGAdump.ppm +# and compare it to VGAdump_expected.ppm inside that test's directory +TESTS_WITH_VGA := vga + +# Short C programs +TOOLS := VGAdump2ppm + +ifdef DEBUG +IVFLAGS += -DDEBUG +DBG&SAVE = tee "$(1)" +else +DBG&SAVE = cat > "$(1)" # putting cat through pipe - what an animal cruelty! +endif + +TEST_TARGETS := $(addprefix test_,$(TESTS)) +VGA_TEST_TARGETS := $(addprefix test_,$(TESTS_WITH_VGA)) + +TEST_LOGS := $(foreach TEST,$(TESTS),tests/$(TEST)/report.log) + +TOOLS_TARGETS := $(addprefix tools/,$(TOOLS)) + +GENERATED_MEM_FILES := $(shell find tests/ -name "*.s.tcl") +GENERATED_MEM_FILES := $(basename $(basename $(GENERATED_MEM_FILES))) +GENERATED_MEM_FILES += $(basename $(shell find tests/ -name "*.memv")) +GENERATED_MEM_FILES := $(addsuffix .mem,$(GENERATED_MEM_FILES)) + +# TODO: check if this function can be changed to use $(shell grep ...) +FILE_LINES = `grep -E '^[[:space:]]*[^[:space:]/]' -c $(1)` + +test : $(TEST_TARGETS) + +tests/%.mem : tests/%.memv + $(IV) $(MACROASM_FLAGS) $^ -o $@ + +tests/%.mem : tests/%.s.tcl tclasm.tcl + $< > $@ + +tests/self/test.vvp : tests/self/operations.mem tests/self/test.v \ + models/slave.v models/master.v include/messages.vh + $(IV) $(IVFLAGS) -s self_test \ + -DMASTER_OPERATIONS_COUNT=$(call FILE_LINES,$<) \ + $(filter %.v,$^) -o $@ + +tests/intercon/test.vvp : tests/intercon/operations.mem tests/intercon/test.v \ + models/slave.v models/master.v design/intercon.v \ + include/messages.vh + $(IV) $(IVFLAGS) -s intercon_test \ + -DMASTER_OPERATIONS_COUNT=$(call FILE_LINES,$<) \ + $(filter %.v,$^) -o $@ + +tests/div/test.vvp : tests/div/test.v design/div.v include/messages.vh + $(IV) $(IVFLAGS) -s div_test $(filter %.v,$^) -o $@ + +tests/vga/test.vvp : tests/vga/test.v design/vga.v models/vga_display.v \ + include/messages.vh + $(IV) $(IVFLAGS) -s vga_test $^ -o $@ + +tests/stack_machine_%/test.vvp : tests/stack_machine_%/instructions.mem \ + tests/stack_machine_%/words_to_verify.mem \ + tests/stack_machine_%/test.v models/slave.v \ + design/stack_machine.v design/div.v include/messages.vh + $(IV) $(IVFLAGS) -s stack_machine_test \ + -DINSTRUCTIONS_COUNT=$(call FILE_LINES,$<) \ + -DWORDS_TO_VERIFY_COUNT=$(call FILE_LINES,$(filter %fy.mem,$^)) \ + $(filter %.v,$^) -o $@ + + +$(foreach TEST,$(TESTS_WITH_VGA),tests/$(TEST)/report.log) \ +$(foreach TEST,$(TESTS_WITH_VGA),tests/$(TEST)/VGAdump.ppm) : design/font.mem + +tests/%/VGAdump.mem tests/%/report.log : tests/%/test.vvp + cd $(dir $<) && vvp $(notdir $<) | $(call DBG&SAVE,report.log) + +tests/%/VGAdump.ppm : tests/%/VGAdump.mem tools/VGAdump2ppm + grep -v // < $< | ./tools/VGAdump2ppm > $@ + +$(VGA_TEST_TARGETS) : test_% : tests/%/VGAdump_expected.ppm tests/%/VGAdump.ppm +$(TEST_TARGETS) : test_% : tests/%/report.log + if grep error $<; then false; fi + if [ "$(filter $@,$(VGA_TEST_TARGETS))" != "" ]; then \ + diff $(dir $<)VGAdump.ppm $(dir $<)VGAdump_expected.ppm; \ + fi + +tools : $(TOOLS_TARGETS) + +$(TOOLS_TARGETS) : tools/% : tools/%.c + $(CC) $(CFLAGS) $^ -o $@ + +clean : + -find tests/ -name "*.vvp" -delete + -find tests/ -name "*.log" -delete + -find tests/ -name "VGAdump.mem" -delete + -find tests/ -name "VGAdump.ppm" -delete + -rm $(GENERATED_MEM_FILES) + -rm tests + -rm $(TOOLS_TARGETS) + +.PHONY : tools test $(TEST_TARGETS) |