# makefile for ModelSIM
include $(NOODLYBOX_HOME)/etc/makerule

MODELSIMLIB:=$(dir $(shell which vsim))
MODELSIM=$(MODELSIMLIB)..

VPATH=$(NOODLYBOX_HOME)/model $(NOODLYBOX_HOME)/c ../c

DPISRCS=MPU.sv
DLLOBJS=c_side.o cMpuFactory.o cMpuFactoryEnlarger.o \
	cMpu.o cSh7751.o accessfpga.o
DLLNAME=c_side.dll
PROJNAME=dpisample.mpf

INCLUDES=-I$(MODELSIM)/include -I$(NOODLYBOX_HOME)/c -I.

.PHONY : sim launch addrtest

all : $(PROJNAME) $(DLLNAME) s

clean :
	-rm -rf *_dpi.h *.o *.obj $(DLLNAME) s
	-rm -f *.cr.mti transcript *.wlf samplefpga.*

depend : $(DLLOBJS:.o=.d)
	cat $^ > makefile.depend
	rm $^

sim : all
	vsim -gui -do "project open $(PROJNAME); source s; do ../sim.tcl" &

launch : all
	vsim -gui -do "project open $(PROJNAME); source s" &

s :
	echo 'source ../../tcl/s.tcl' > $@

addrtest : samplefpga$(DOTEXE)
	./$<

samplefpga$(DOTEXE) : samplefpga.c samplefpga.h
	$(CC) $(CFLAGS) -DREALWORLD $(INCLUDES) -o $@ $<

makefile : ../msim_makefile
	cd .. && $(MAKE) $(notdir $(PWD))/$@

%.o : %.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $<

%.d : %.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDES) -MM $< \
	| sed -e s,' [^ ]*svdpi\.h',, -e s,' [^ ]*\.cpp',, > $@

%_dpi.h : %.sv
	if [ ! -d work ]; then vlib work; fi
	vlog -nologo -sv -dpiheader $@ $<
	touch $@

# This description overwrites the rule that exist in /etc/makerule.
%.h : %.csv
	accessor.rb -dpih $< > $@

%.c : %.csv
	accessor.rb -dpiht $< > $@

%_dpi.obj : %_dpi.h
	vsim -quiet -dpiexportobj $(basename $@) $(subst _dpi.h,,$<)

$(DLLNAME) : $(DLLOBJS) $(DPISRCS:.sv=_dpi.obj)
	$(CXX) -shared -Bsymbolic -o $@ $^ -L $(MODELSIMLIB) -lmtipli

$(PROJNAME) : $(NOODLYBOX_HOME)/sample/rtl/MAINDCM.v
	vsim -gui -do "set argv [list msim $(HDL) $(basename $@)]; source ../create_project.tcl"

$(DLLOBJS:.o=.d) : MPU_dpi.h samplefpga.h

-include makefile.depend
