#=======================================================================
# Makefile for riscv-tests/isa
#-----------------------------------------------------------------------

act_dir := .
src_dir := $(act_dir)/src
ref_dir := $(act_dir)/references
work_dir := $(WORK)
work_dir_isa := $(work_dir)/rv$(XLEN)i_m/$(RISCV_DEVICE)

include $(act_dir)/Makefrag
ifneq ($(RISCV_TEST),)
	target_tests = $(RISCV_TEST).elf
	target_tests_nosim = $(empty)
endif

default: all

#--------------------------------------------------------------------
# Build rules
#--------------------------------------------------------------------

vpath %.S $(act_dir)

INCLUDE=$(TARGETDIR)/$(RISCV_TARGET)/device/rv$(XLEN)i_m/$(RISCV_DEVICE)/Makefile.include
ifeq ($(wildcard $(INCLUDE)),)
    $(error Cannot find '$(INCLUDE)`. Check that RISCV_TARGET and RISCV_DEVICE are set correctly.)
endif
-include $(INCLUDE)

#------------------------------------------------------------
# Build and run assembly tests

%.log: %.elf
	$(V) echo "Execute $(@)"
	$(V) $(RUN_TARGET)


define compile_template

$(work_dir_isa)/%.elf: $(src_dir)/%.S
	$(V) echo "Compile $$(@)"
	@mkdir -p $$(@D)
	$(V) $(COMPILE_TARGET)

.PRECIOUS: $(work_dir_isa)/%.elf

endef

target_elf = $(foreach e,$(target_tests),$(work_dir_isa)/$(e))
target_elf_nosim = $(foreach e,$(addsuffix .elf, $(target_tests_nosim)),$(work_dir_isa)/$(e))
combined_elf = $(target_elf_nosim) $(target_elf)
target_log = $(patsubst %.elf,%.log,$(target_elf))

ifdef target_tests_nosim 
compile: copy 
# now copy must be performed before compile, 
# allowing us to copy over outputs if they won't simulate on spike correctly.
endif

copy:
	@mkdir -p $(work_dir_isa)
	$(info !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
	$(info <<<<<<<<<<<<<<<<<<<<<<<<<<<< COPYING REFERENCES WITHOUT SIMULATING >>>>>>>>>>>>>>>>>>>>>>>>>>>>)
	$(info !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
	$(V) echo "Copying References without simulating for the following tests: $(target_tests_nosim)"
	$(V) for test in $(target_tests_nosim); do grep -o '^[^#]*' $(ref_dir)/$$test.reference_output > $(work_dir_isa)/$$test.signature.output; done

compile: $(combined_elf)
run: $(target_log) 
# note that run doesnt use the combined elf so it doesnt run the nosim tests.

#------------------------------------------------------------
# Clean up

clean:
	rm -rf $(work_dir)