# makefile for Icarus Verilog
include $(NOODLYBOX_HOME)/etc/makerule

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

EXEOBJS=c_side_pipe.o cNamedPipeIo.o cMpuFactory.o cMpuFactoryEnlarger.o \
	cMpu.o cSh7751.o accessfpga.o
EXENAME=c_side_pipe$(DOTEXE)
PROJNAME=pipesample.txt

# select vcd or lxt2
WAVENAME=$(PROJNAME:.txt=.vcd)
#WAVENAME=$(PROJNAME:.txt=.lxt2)

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

CXXFLAGS+=-ggdb -DMPU_PIPE
#CXXFLAGS+=-O2 -DMPU_PIPE


TOPMODULE=tPIPE
DUMPER=WAVEDUMP.v

.PHONY : view addrtest

all : $(WAVENAME)

clean :
	-rm -rf *.o *.obj $(PROJNAME) *.out $(EXENAME) $(DUMPER)
	-rm -f *.cr.mti transcript *.vcd *.lxt2 *.wlf samplefpga.* *.d

depend : $(EXEOBJS:.o=.d) $(PROJNAME:.txt=.d)
	cat $^ > makefile.depend
	rm $^

%.vcd : %.out $(EXENAME)
	./$(EXENAME) 0 SH7751 &
	sleep 1
	echo finish | vvp $<

#%.lxt2 : %.out $(EXENAME)
#	./$(EXENAME) 0 SH7751 &
#	sleep 1
#	echo finish | vvp $< -lxt2

%.wlf : %.vcd
	vcd2wlf $< $@

view : $(WAVENAME)
	gtkwave $< &

addrtest : samplefpga$(DOTEXE)
	./$<

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

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

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

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

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

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

$(EXENAME) : $(EXEOBJS)
	$(CXX) -o $@ $^

$(PROJNAME) $(PROJNAME:.txt=.d) : $(NOODLYBOX_HOME)/sample/rtl/MAINDCM.v
	../create_project.rb icarus verilog $@

%.out : %.txt $(DUMPER)
	iverilog -c $< -o $@ -g 2x -s $(TOPMODULE) -s $(DUMPER:.v=) $(DUMPER)

$(DUMPER) :
	echo '`timescale 1 ns / 1 ns' > $@
	echo 'module $(@:.v=);' >> $@
	echo '    initial begin' >> $@
	echo '        $$dumpfile("$(WAVENAME)");' >> $@
	echo '        $$dumpvars(0, $(TOPMODULE));' >> $@
	echo '    end' >> $@
	echo 'endmodule' >> $@

$(EXEOBJS:.o=.d) : samplefpga.h

-include makefile.depend
