# =====================================================================
# Hardware Makefile - Maze Chase Game (DE1-SoC)
#
# Mirrors lab3/lab3-hw/Makefile but with the new peripheral / source
# files.  Run `make project` first to bootstrap Quartus, then `make
# qsys`, `make quartus`, `make rbf`, etc.
# =====================================================================
SYSTEM   = soc_system

TCL      = $(SYSTEM).tcl
QSYS     = $(SYSTEM).qsys
SOPCINFO = $(SYSTEM).sopcinfo
QIP      = $(SYSTEM)/synthesis/$(SYSTEM).qip
HPS_PIN_TCL = $(SYSTEM)/synthesis/submodules/hps_sdram_p0_pin_assignments.tcl
HPS_PIN_MAP = hps_sdram_p0_all_pins.txt
QPF      = $(SYSTEM).qpf
QSF      = $(SYSTEM).qsf
SDC      = $(SYSTEM).sdc
SRF      = $(SYSTEM).srf

BOARD_INFO = $(SYSTEM)_board_info.xml
DTS = $(SYSTEM).dts
DTB = $(SYSTEM).dtb

SOF = output_files/$(SYSTEM).sof
RBF = output_files/$(SYSTEM).rbf

# ROM init files - regenerated by gen_mif.py.
ROM_FILES = maze.mif maze.hex \
            evader.mif evader.hex \
            ghost0.mif ghost0.hex \
            ghost1.mif ghost1.hex \
            maze_data.h

TARFILES = Makefile \
	$(TCL) \
	$(QSYS) \
	$(SYSTEM)_top.sv \
	$(BOARD_INFO) \
	$(SRF) \
	game_peripheral.sv \
	game_peripheral_hw.tcl \
	gen_mif.py \
	$(ROM_FILES)

TARFILE = final_project-hw.tar.gz

# ---------------------------------------------------------------------
# ROM data generation
# ---------------------------------------------------------------------
.PHONY: roms
roms: $(ROM_FILES)

$(ROM_FILES): gen_mif.py
	python3 gen_mif.py

# ---------------------------------------------------------------------
# project
# ---------------------------------------------------------------------
.PHONY: project
project: $(QPF) $(QSF) $(SDC)

$(QPF) $(QSF) $(SDC) : $(TCL) $(HPS_PIN_TCL)
	quartus_sh -t $(TCL)
	quartus_map $(SYSTEM)
	quartus_sta -t $(HPS_PIN_TCL) $(SYSTEM)

# ---------------------------------------------------------------------
# qsys
# ---------------------------------------------------------------------
.PHONY: qsys
qsys: $(SOPCINFO)

$(SOPCINFO) $(QIP) $(HPS_PIN_TCL) $(SYSTEM)/ : $(QSYS) $(ROM_FILES)
	rm -rf $(SOPCINFO) $(SYSTEM)/
	qsys-generate $(QSYS) --synthesis=VERILOG

# ---------------------------------------------------------------------
# quartus
# ---------------------------------------------------------------------
.PHONY: quartus
quartus: $(SOF)

$(SOF) $(HPS_PIN_MAP) : $(QIP) $(QPF) $(QSF) $(HPS_PIN_TCL)
	quartus_sh --flow compile $(QPF)

# ---------------------------------------------------------------------
# rbf - converts .sof to .rbf for SD-card-based programming
# ---------------------------------------------------------------------
.PHONY: rbf
rbf: $(RBF)

$(RBF): $(SOF)
	quartus_cpf -c $(SOF) $(RBF)

# ---------------------------------------------------------------------
# dtb
# ---------------------------------------------------------------------
.PHONY: dtb
dtb: $(DTB)

$(DTB): $(DTS)
	@which dtc || (echo "dtc not found.  Did you run embedded_command_shell.sh?"; exit 1)
	dtc -I dts -O dtb -o $(DTB) $(DTS)

$(DTS) : $(SOPCINFO) $(BOARD_INFO)
	@which sopc2dts || (echo "sopc2dts not found.  Did you run embedded_command_shell.sh?"; exit 1)
	sopc2dts --input $(SOPCINFO) \
		--output $(DTS) \
		--type dts \
		--board $(BOARD_INFO) \
		--clocks

# ---------------------------------------------------------------------
# tar
# ---------------------------------------------------------------------
.phony: tar
tar: $(TARFILE)

$(TARFILE): $(TARFILES)
	tar zcfC $(TARFILE) .. $(TARFILES:%=final_project-hw/%)

# ---------------------------------------------------------------------
# clean
# ---------------------------------------------------------------------
.PHONY: clean quartus-clean qsys-clean project-clean dtb-clean rom-clean
clean: quartus-clean qsys-clean project-clean dtb-clean rom-clean

project-clean:
	rm -rf $(QPF) $(QSF) $(SDC)

qsys-clean:
	rm -rf $(SOPCINFO) $(QIP) $(SYSTEM)/ .qsys_edit \
	hps_isw_handoff/ hps_sdram_p0_summary.csv

quartus-clean:
	rm -rf $(SOF) $(RBF) output_files db incremental_db $(SYSTEM).qdf \
	c5_pin_model_dump.txt $(HPS_PIN_MAP)

dtb-clean:
	rm -rf $(DTS) $(DTB)

rom-clean:
	rm -f $(ROM_FILES)
