#
# Makefile for simulation with ghdl
#
# To simulate the MyCPU computer and see the
# screen output of the MyCPU OS, please use
# the command line   # make NOWAVE=1 TIME=250ms
#
# To re-compile sources before simulation
# enter  # make clean
#
# Note: You need a very powerful computer for
#       this simulation. The simulation may
#       last up to one hour.
#

SRCPATH = ../../FPGA
CPLDPATH = ../../CPLD
TBPATH  = ..
UARTPATH= $(SRCPATH)/UART

ifeq '$(TIME)' ''
  TIME := 2ms
endif
ifeq '$(NOWAVE)' ''
  ifeq '$(WAVECMD)' ''
    ifeq '$(WAVEFILE)' ''
	  WAVEFILE := waves.vcd
	endif
	WAVECMD := --vcd=$(WAVEFILE)
  endif
endif

CPUSRC = \
	$(SRCPATH)/cpu_alu.vhd  \
	$(SRCPATH)/cpu_busif.vhd  \
	$(SRCPATH)/cpu_clk.vhd  \
	$(SRCPATH)/cpu_pc.vhd  \
	$(SRCPATH)/cpu_reg.vhd  \
	$(SRCPATH)/cpu_top.vhd  \
	$(SRCPATH)/cpu_uctrl.vhd \
	$(SRCPATH)/cpu_mcode_simu.vhd 
#	$(SRCPATH)/cpu_mcode.vhd

CPUSYSSRC = \
	$(SRCPATH)/mycpusys.vhd \
	$(SRCPATH)/ramblocks.vhd

COMPSRC = \
	$(SRCPATH)/comp_ide.vhd\
	$(SRCPATH)/comp_intctrl.vhd \
	$(SRCPATH)/comp_memunit.vhd \
	$(SRCPATH)/comp_mio.vhd \
	$(SRCPATH)/comp_flashprog.vhd

UNISIMSRC = \
	$(SRCPATH)/unisim/unisim_VPKG.vhd \
	$(SRCPATH)/unisim/RAMB16_S9.vhd

UARTSRC = \
	$(UARTPATH)/slib_clock_div.vhd \
	$(UARTPATH)/slib_counter.vhd \
	$(UARTPATH)/slib_edge_detect.vhd \
	$(UARTPATH)/slib_fifo.vhd \
	$(UARTPATH)/slib_input_filter.vhd \
	$(UARTPATH)/slib_input_sync.vhd	\
	$(UARTPATH)/slib_mv_filter.vhd \
	$(UARTPATH)/uart_16750.vhd \
	$(UARTPATH)/uart_baudgen.vhd \
	$(UARTPATH)/uart_interrupt.vhd \
	$(UARTPATH)/uart_receiver.vhd \
	$(UARTPATH)/uart_transmitter.vhd

CPLDSRC = \
	$(CPLDPATH)/cpld_top.vhd

SOURCES = $(CPUSYSSRC) $(UNISIMSRC) $(CPUSRC) $(COMPSRC) $(UARTSRC) $(CPLDSRC)

TESTBENCH = $(TBPATH)/mycpu_tb.vhd
TOPENTITY = verification_mycpu

# set vhdl standard
STANDARD = 02

.default: all

.phony: compile run runw test all clean

all:  $(TOPENTITY) run

run: $(TOPENTITY) $(SOURCES)
	ghdl -e --std=$(STANDARD) --ieee=synopsys --workdir=work $(TOPENTITY)
	ghdl -r $(TOPENTITY) $(WAVECMD) --stop-time=$(TIME)

# run ghdl on windows (it is broken with actual ghdl version 0.26)
runw:
	-rm -r work
	-mkdir work
	ghdl -c --std=$(STANDARD) --ieee=synopsys --workdir=work $(TESTBENCH) $(SOURCES) -r $(TOPENTITY) $(WAVECMD) --stop-time=$(TIME) 

$(TOPENTITY):  $(SOURCES)
	-mkdir work
	ghdl -a --std=$(STANDARD) --ieee=synopsys --workdir=work $(TESTBENCH) $(SOURCES)

test:
	ghdl -a --std=$(STANDARD) --ieee=synopsys --workdir=work $(TESTBENCH) $(SOURCES)

compile:  clean $(TOPENTITY)

clean:
	-rm $(TOPENTITY)
	-rm -r work
	-rm *.vcd
	-rm ouput.txt

