makefile: verbessert
[hwmod.git] / src / Makefile
index da86f578918c1a0dbce5aea282994c149fcf0d44..4d3dc4e9a05d4277b057e097b02e03c04dd564bd 100644 (file)
@@ -2,18 +2,36 @@ SHELL := bash
 
 MPWD := $(shell pwd)
 D_BEHSIM := $(MPWD)/../sim/beh
+D_POSTSIM := $(MPWD)/../sim/post
+POST_VHO := $(MPWD)/../quartus/calc/simulation/modelsim/calc.vho
+POST_SDO := $(MPWD)/../quartus/calc/simulation/modelsim/calc_vhd.sdo
+POST_SDO_INST := inst
 
 WORK := work
 
-#reihenfolge ist hier wichtig!
-IFILES = gen_pkg alu alu_tb
-IFILES := $(strip $(IFILES))
-#virtuelle targets: weil wir sowas wie ein objectfile von vcom nicht bekommen. bessere ideen sind willkommen
-VTARGETS := $(foreach n, $(IFILES), $(D_BEHSIM)/$(WORK)/$(n)/_primary.dat)
+# o reihenfolge ist wichtig
+# o keine testbechnes hier angeben
+BEH_IFILES = gen_pkg alu
+BEH_IFILES := $(strip $(BEH_IFILES))
+
+# o keine testbenches hier angeben
+# o beachte, dass sich viele files schon in dem VHO file befinden -- es muessen eigentlich nur
+#   abhaengigkeiten fuer die testbenches angegeben werden
+POST_IFILES = gen_pkg
+POST_IFILES := $(strip $(POST_IFILES))
+
+#virtuelle targets fuer behsim: weil wir sowas wie ein objectfile von vcom nicht bekommen. bessere ideen sind willkommen
+BEH_VTARGETS := $(foreach n, $(BEH_IFILES), $(D_BEHSIM)/$(WORK)/$(n)/_primary.dat)
+
+#virtuelle targets fuer postsim
+POST_VTARGETS := $(foreach n, $(shell grep ENTITY $(POST_VHO) | awk '{ print $$2 }'), $(D_POSTSIM)/$(WORK)/$(n)/_primary.dbs)
+POST_VTARGETS += $(foreach n, $(POST_IFILES), $(D_POSTSIM)/$(WORK)/$(n)/_primary.dat)
+
 
 all: behsim
 
-behsim: $(D_BEHSIM)/modelsim.ini $(VTARGETS)
+#behsim
+behsim: $(D_BEHSIM)/modelsim.ini $(BEH_VTARGETS)
 
 $(D_BEHSIM)/modelsim.ini:
        @echo " INIT for behavioural simulation"
@@ -23,14 +41,44 @@ $(D_BEHSIM)/modelsim.ini:
        vlib work > /dev/null ; \
        vmap work work > /dev/null ;
 
-$(D_BEHSIM)/$(WORK)/%/_primary.dat: %.vhd
+$(D_BEHSIM)/$(WORK)/%/_primary.dat: %.vhd $(D_BEHSIM)/modelsim.ini
        @echo " CC    $<"
        @cd $(D_BEHSIM); \
        vcom -work $(WORK) $(MPWD)/$<
 
-modelsim: behsim
-       @cd $(D_BEHSIM); \
-       vsim "work.alu_tb(sim)" -f /dev/null -do $(MPWD)/alu.do
+beh_%: $(D_BEHSIM)/$(WORK)/beh_%_tb/_primary.dat beh_%_tb.do behsim
+       cd $(D_BEHSIM); \
+       vsim "work.$@_tb(sim)" -f /dev/null -do $(MPWD)/$@_tb.do
+
+#postsim
+postsim: $(POST_VHO) $(D_POSTSIM)/modelsim.ini $(POST_VTARGETS)
+
+$(D_POSTSIM)/modelsim.ini:
+       @echo " INIT for post-layout simulation"
+       @mkdir -p $(D_POSTSIM)
+       @cd $(D_POSTSIM); \
+       vlib work > /dev/null ; \
+       vmap work work > /dev/null ;
+
+$(D_POSTSIM)/$(WORK)/%/_primary.dbs: $(POST_VHO) $(D_POSTSIM)/modelsim.ini
+       @echo " CC    $<"
+       @cd $(D_POSTSIM); \
+       vcom -work $(WORK) $(POST_VHO)
+
+$(D_POSTSIM)/$(WORK)/%/_primary.dat: %.vhd $(D_POSTSIM)/modelsim.ini
+       @echo " CC    $<"
+       @cd $(D_POSTSIM); \
+       vcom -work $(WORK) $(MPWD)/$<
+
+post_%: $(D_POSTSIM)/$(WORK)/post_%_tb/_primary.dat post_%_tb.do postsim $(POST_SDO)
+       cd $(D_POSTSIM); \
+       vsim "work.$@_tb(sim)" -sdftyp /$(POST_SDO_INST)=$(POST_SDO) -f /dev/null -do $(MPWD)/$@_tb.do
+
+$(POST_VHO) $(POST_SDO):
+       @if [ -f $@ ]; \
+       then echo "vho/sdo: passt"; true ; \
+       else echo "Fehler: $@ muss mit quartus erstellt werden"; false; \
+       fi
 
 quartus:
        @echo "Die angebotene (free) Quartus II Version funktioniert leider nicht. (Build endet mit einem Error, auch mit dem debouncing-bsp der LVA)."
@@ -41,5 +89,5 @@ quartus:
 
 .PHONY: clean
 clean:
-       rm -Rf $(D_BEHSIM)
+       rm -Rf $(D_BEHSIM) $(D_POSTSIM)