CC ?= cc
VERILATOR ?= verilator
BUILD ?= build

BUILD_DIR := $(abspath $(BUILD))
SOURCE_DIR := $(CURDIR)
RTL := ../rtl/axil_spi.sv ../rtl/spi_master_mode0.sv
MODEL_DIR := $(BUILD_DIR)/obj
C_CHECKS := -std=c11 -ffreestanding -Wall -Wextra -Wconversion -Werror

.PHONY: test

test: $(BUILD_DIR)/spi_loopback.o $(MODEL_DIR)/Vaxil_spi
	"$(MODEL_DIR)/Vaxil_spi"

$(BUILD_DIR)/axil_spi.o: axil_spi.c axil_spi.h axil_spi_regs.h
	mkdir -p "$(BUILD_DIR)"
	$(CC) $(CPPFLAGS) $(CFLAGS) $(C_CHECKS) -c $< -o "$@"

$(BUILD_DIR)/spi_loopback.o: spi_loopback.c axil_spi.h
	mkdir -p "$(BUILD_DIR)"
	$(CC) $(CPPFLAGS) $(CFLAGS) $(C_CHECKS) -c $< -o "$@"

$(MODEL_DIR)/Vaxil_spi: test_axil_spi.cpp $(RTL) $(BUILD_DIR)/axil_spi.o
	rm -f "$@"
	$(VERILATOR) --cc --exe --build --top-module axil_spi -Wall \
		--Mdir "$(MODEL_DIR)" -CFLAGS "-I$(SOURCE_DIR)" \
		-LDFLAGS "$(BUILD_DIR)/axil_spi.o" \
		$(RTL) "$(SOURCE_DIR)/test_axil_spi.cpp"
