makefile: more fun with quartus
[hwmod.git] / src / Makefile
1 SHELL := bash
2
3 MPWD := $(shell pwd)
4 D_BEHSIM := $(MPWD)/../sim/beh
5 D_POSTSIM := $(MPWD)/../sim/post
6 POST_VHO := $(MPWD)/../quartus/calc/simulation/modelsim/calc.vho
7 POST_SDO := $(MPWD)/../quartus/calc/simulation/modelsim/calc_vhd.sdo
8 POST_SDO_INST := inst
9 QUARTUS := $(MPWD)/../quartus/calc
10 QUOPT := --read_settings_files=on --write_settings_files=off calc -c calc
11 QUMACRO := unset LS_COLORS; cd $(QUARTUS);
12
13 HN := $(shell hostname)
14 TILABHOSTS := $(shell echo ti{1..9}) apps1
15
16 WORK := work
17
18 # o reihenfolge ist wichtig
19 # o keine testbechnes hier angeben
20 BEH_IFILES = gen_pkg alu
21 BEH_IFILES := $(strip $(BEH_IFILES))
22
23 # o keine testbenches hier angeben
24 # o beachte, dass sich viele files schon in dem VHO file befinden -- es muessen eigentlich nur
25 #   abhaengigkeiten fuer die testbenches angegeben werden
26 POST_IFILES = gen_pkg
27 POST_IFILES := $(strip $(POST_IFILES))
28
29 #virtuelle targets fuer behsim: weil wir sowas wie ein objectfile von vcom nicht bekommen. bessere ideen sind willkommen
30 BEH_VTARGETS := $(foreach n, $(BEH_IFILES), $(D_BEHSIM)/$(WORK)/$(n)/_primary.dat)
31
32 #virtuelle targets fuer postsim
33 POST_VTARGETS := $(foreach n, $(POST_IFILES), $(D_POSTSIM)/$(WORK)/$(n)/_primary.dat)
34
35
36 all: behsim
37
38 #behsim
39 behsim: $(D_BEHSIM)/modelsim.ini $(BEH_VTARGETS)
40
41 $(D_BEHSIM)/modelsim.ini:
42         @echo " INIT for behavioural simulation"
43         @mkdir -p $(D_BEHSIM)
44         @#make fuehrt jeden befehl in einer eigenen shell aus, deswegen ein "oneliner"
45         @cd $(D_BEHSIM); \
46         vlib work > /dev/null ; \
47         vmap work work > /dev/null ;
48
49 $(D_BEHSIM)/$(WORK)/%/_primary.dat: %.vhd $(D_BEHSIM)/modelsim.ini
50         @echo " CC    $<"
51         @cd $(D_BEHSIM); \
52         vcom -work $(WORK) $(MPWD)/$<
53
54 beh_%: $(D_BEHSIM)/$(WORK)/beh_%_tb/_primary.dat beh_%_tb.do behsim
55         cd $(D_BEHSIM); \
56         vsim "work.$@_tb(sim)" -f /dev/null -do $(MPWD)/$@_tb.do
57
58 #postsim
59 postsim: $(POST_VHO) $(POST_SDO)
60
61 $(D_POSTSIM)/modelsim.ini:
62         @echo " INIT for post-layout simulation"
63         @mkdir -p $(D_POSTSIM)
64         @cd $(D_POSTSIM); \
65         vlib work > /dev/null ; \
66         vmap work work > /dev/null ;
67
68 $(D_POSTSIM)/$(WORK)/%/_primary.dat: %.vhd
69         @echo " CC    $<"
70         @cd $(D_POSTSIM); \
71         vcom -work $(WORK) $(MPWD)/$<
72
73 post_%: postsim $(D_POSTSIM)/$(WORK)/post_%_tb/_primary.dat post_%_tb.do
74         cd $(D_POSTSIM); \
75         vsim "work.$@_tb(sim)" -sdftyp /$(POST_SDO_INST)=$(POST_SDO) -f /dev/null -do $(MPWD)/$@_tb.do
76
77 $(QUARTUS): $(D_POSTSIM)/modelsim.ini
78         @echo -n " Quartus  generate project"
79 ifeq ($(findstring $(HN), $(TILABHOSTS)),$(HN))
80         @echo "(@tilab)"
81         @cd ../quartus; ./linux_tilab.sh
82 else
83         @echo "(not @ tilab)"
84         @cd ../quartus; ./linux_web.sh
85 endif
86
87 #TODO: more targets plz...
88 $(POST_VHO) $(POST_SDO): $(QUARTUS) $(POST_VTARGETS)
89         @echo " Quartus  analysis & synthesis"
90         @$(QUMACRO) quartus_map $(QUOPT) | tee $(MPWD)/quartusmap.tmp
91         @echo " Quartus  fitter"
92         @$(QUMACRO) quartus_fit $(QUOPT)
93         @echo " Quartus  assembler"
94         @$(QUMACRO) quartus_asm $(QUOPT)
95         @echo " Quartus  timing analyzer"
96         @$(QUMACRO) quartus_tan $(QUOPT) --timing_analysis_only | tee $(MPWD)/quartustan.tmp
97         @echo " Quartus  EDA netlist writer"
98         @$(QUMACRO) quartus_eda $(QUOPT)
99         #not nice atm :/
100         @echo " CC    $(POST_VHO)"
101         @cd $(D_POSTSIM); \
102         vcom -work $(WORK) $(POST_VHO)
103         @echo -n "  INFO  logic cells: "
104         @grep 'logic cells' quartusmap.tmp | awk ' { print $$3 } '
105         @grep 'Fmax ' quartustan.tmp | sed -e 's/  / /g' -e 's/Info/INFO/g' -e 's/:/ /g'
106         @rm quartus*.tmp
107
108 .PHONY: clean
109 clean:
110         rm -Rf $(D_BEHSIM) $(D_POSTSIM) $(QUARTUS)
111