1include ../config.mk
2export LC_ALL=C
3export ICE_SBTIMER_LP=1
4
5DEVICECLASS = 1k
6
7ifeq ($(DEVICECLASS), 384)
8  DEVICE := lp384-cm49
9	THREEH = _384
10endif
11
12ifeq ($(DEVICECLASS), 1k)
13	DEVICE := hx1k-tq144
14endif
15
16ifeq ($(DEVICECLASS), u4k)
17	DEVICE := u4k-sg48
18	RAM_SUFFIX := _8k
19endif
20
21ifeq ($(DEVICECLASS), 5k)
22	DEVICE := up5k-sg48
23	RAM_SUFFIX := _8k
24endif
25
26ifeq ($(DEVICECLASS), 4k)
27	DEVICE := lm4k-cm49
28	RAM_SUFFIX := _8k
29endif
30
31ifeq ($(DEVICECLASS), 8k)
32  DEVICE := hx8k-ct256
33  RAM_SUFFIX = _8k
34endif
35
36TESTS =
37TESTS += binop
38TESTS += pin2pin
39TESTS += mesh
40TESTS += fanout
41TESTS += logic
42TESTS += cluster
43TESTS += iopack
44TESTS += io
45TESTS += gbio
46TESTS += gbio2
47TESTS += prim
48TESTS += fflogic
49ifneq ($(DEVICECLASS),384)
50 TESTS += ram40
51 TESTS += mem
52 TESTS += pll
53 TESTS += aig
54endif
55ifeq ($(DEVICECLASS),5k)
56 TESTS += dsp
57 TESTS += upip
58endif
59ifeq ($(DEVICECLASS),u4k)
60 TESTS += dsp
61 TESTS += uip
62endif
63database: bitdata_io.txt bitdata_logic.txt bitdata_ramb$(RAM_SUFFIX).txt bitdata_ramt$(RAM_SUFFIX).txt bitdata_dsp0_5k.txt bitdata_dsp1_5k.txt bitdata_dsp2_5k.txt bitdata_dsp3_5k.txt bitdata_ipcon_5k.txt
64ifneq ($(RAM_SUFFIX),)
65	cp cached_ramb.txt bitdata_ramb.txt
66	cp cached_ramt.txt bitdata_ramt.txt
67endif
68ifneq ($(RAM_SUFFIX),_8k)
69	cp cached_ramb_8k.txt bitdata_ramb_8k.txt
70	cp cached_ramt_8k.txt bitdata_ramt_8k.txt
71endif
72ifneq ($(RAM_SUFFIX),_5k)
73	cp cached_dsp0_5k.txt bitdata_dsp0_5k.txt
74	cp cached_dsp1_5k.txt bitdata_dsp1_5k.txt
75	cp cached_dsp2_5k.txt bitdata_dsp2_5k.txt
76	cp cached_dsp3_5k.txt bitdata_dsp3_5k.txt
77	cp cached_ipcon_5k.txt bitdata_ipcon_5k.txt
78endif
79	ICEDEVICE=$(DEVICECLASS) python3 database.py
80	python3 export.py
81	diff -U0 cached_io.txt bitdata_io.txt || cp -v bitdata_io.txt cached_io.txt
82	diff -U0 cached_logic.txt bitdata_logic.txt || cp -v bitdata_logic.txt cached_logic.txt
83	diff -U0 cached_ramb$(RAM_SUFFIX).txt bitdata_ramb$(RAM_SUFFIX).txt || cp -v bitdata_ramb$(RAM_SUFFIX).txt cached_ramb$(RAM_SUFFIX).txt
84	diff -U0 cached_ramt$(RAM_SUFFIX).txt bitdata_ramt$(RAM_SUFFIX).txt || cp -v bitdata_ramt$(RAM_SUFFIX).txt cached_ramt$(RAM_SUFFIX).txt
85	diff -U0 cached_dsp0_5k.txt bitdata_dsp0_5k.txt || cp -v bitdata_dsp0_5k.txt cached_dsp0_5k.txt
86	diff -U0 cached_dsp1_5k.txt bitdata_dsp1_5k.txt || cp -v bitdata_dsp1_5k.txt cached_dsp1_5k.txt
87	diff -U0 cached_dsp2_5k.txt bitdata_dsp2_5k.txt || cp -v bitdata_dsp2_5k.txt cached_dsp2_5k.txt
88	diff -U0 cached_dsp3_5k.txt bitdata_dsp3_5k.txt || cp -v bitdata_dsp3_5k.txt cached_dsp3_5k.txt
89	diff -U0 cached_ipcon_5k.txt bitdata_ipcon_5k.txt || cp -v bitdata_ipcon_5k.txt cached_ipcon_5k.txt
90
91timings:
92ifeq ($(DEVICECLASS),5k)
93	cp tmedges.txt tmedges.tmp
94	set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; sed '/defparam/d' < $$f > $$f.fixed;  yosys -q -f verilog -s tmedges.ys $$f.fixed; python3 rename_dsps.py $$f; done
95	sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
96	python3 timings.py -t timings_up5k.txt work_*/*.sdf > timings_up5k.new
97	mv timings_up5k.new timings_up5k.txt
98else
99ifeq ($(DEVICECLASS),u4k)
100	cp tmedges.txt tmedges.tmp
101	set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; sed '/defparam/d' < $$f > $$f.fixed;  yosys -q -f verilog -s tmedges.ys $$f.fixed; python3 rename_dsps.py $$f; done
102	sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
103	python3 timings.py -t timings_u4k.txt work_*/*.sdf > timings_u4k.new
104	mv timings_u4k.new timings_u4k.txt
105else
106ifeq ($(DEVICECLASS),8k)
107	cp tmedges.txt tmedges.tmp
108	set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
109	sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
110	python3 timings.py -t timings_hx8k.txt work_*/*.sdf > timings_hx8k.new
111	mv timings_hx8k.new timings_hx8k.txt
112	python3 timings.py -t timings_lp8k.txt work_*/*.slp > timings_lp8k.new
113	mv timings_lp8k.new timings_lp8k.txt
114else
115 ifeq ($(DEVICECLASS),384)
116	cp tmedges.txt tmedges.tmp
117	set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
118	sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
119	python3 timings.py -t timings_lp384.txt work_*/*.slp > timings_lp384.new
120	mv timings_lp384.new timings_lp384.txt
121 else
122	cp tmedges.txt tmedges.tmp
123	set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
124	sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
125	python3 timings.py -t timings_hx1k.txt work_*/*.sdf > timings_hx1k.new
126	mv timings_hx1k.new timings_hx1k.txt
127	python3 timings.py -t timings_lp1k.txt work_*/*.slp > timings_lp1k.new
128	mv timings_lp1k.new timings_lp1k.txt
129 endif
130endif
131endif
132endif
133timings_html:
134	python3 timings.py -h tmedges.txt -t timings_hx1k.txt -l "HX1K with default temp/volt settings" > timings_hx1k.html
135	python3 timings.py -h tmedges.txt -t timings_hx8k.txt -l "HX8K with default temp/volt settings" > timings_hx8k.html
136	python3 timings.py -h tmedges.txt -t timings_lp1k.txt -l "LP1K with default temp/volt settings" > timings_lp1k.html
137	python3 timings.py -h tmedges.txt -t timings_lp8k.txt -l "LP8K with default temp/volt settings" > timings_lp8k.html
138	python3 timings.py -h tmedges.txt -t timings_lp384.txt -l "LP384 with default temp/volt settings" > timings_lp384.html
139	python3 timings.py -h tmedges.txt -t timings_up5k.txt -l "UP5K with default temp/volt settings" > timings_up5k.html
140	python3 timings.py -h tmedges.txt -t timings_u4k.txt -l "U4K with default temp/volt settings" > timings_u4k.html
141data_cached.txt: cached_io.txt cached_logic.txt cached_ramb$(RAM_SUFFIX).txt cached_ramt$(RAM_SUFFIX).txt cached_dsp0_5k.txt cached_dsp1_5k.txt cached_dsp2_5k.txt cached_dsp3_5k.txt cached_ipcon_5k.txt
142	gawk '{ print "io", $$0; }' cached_io.txt > data_cached.new
143	gawk '{ print "logic", $$0; }' cached_logic.txt >> data_cached.new
144	gawk '{ print "ramb$(RAM_SUFFIX)", $$0; }' cached_ramb$(RAM_SUFFIX).txt >> data_cached.new
145	gawk '{ print "ramt$(RAM_SUFFIX)", $$0; }' cached_ramt$(RAM_SUFFIX).txt >> data_cached.new
146
147	gawk '{ print "dsp0_5k", $$0; }' cached_dsp0_5k.txt >> data_cached.new
148	gawk '{ print "dsp1_5k", $$0; }' cached_dsp1_5k.txt >> data_cached.new
149	gawk '{ print "dsp2_5k", $$0; }' cached_dsp2_5k.txt >> data_cached.new
150	gawk '{ print "dsp3_5k", $$0; }' cached_dsp3_5k.txt >> data_cached.new
151	gawk '{ print "ipcon_5k", $$0; }' cached_ipcon_5k.txt >> data_cached.new
152
153	mv data_cached.new data_cached.txt
154
155bitdata_io.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
156	grep ^io $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
157
158bitdata_logic.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
159	grep ^logic $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
160
161bitdata_ramb$(RAM_SUFFIX).txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
162	grep ^ramb$(RAM_SUFFIX) $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
163
164bitdata_ramt$(RAM_SUFFIX).txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
165	grep ^ramt$(RAM_SUFFIX) $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
166
167bitdata_dsp0_5k.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
168	grep ^dsp0_5k $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
169
170bitdata_dsp1_5k.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
171	grep ^dsp1_5k $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
172
173bitdata_dsp2_5k.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
174	grep ^dsp2_5k $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
175
176bitdata_dsp3_5k.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
177	grep ^dsp3_5k $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
178
179bitdata_ipcon_5k.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
180	grep ^ipcon_5k $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
181
182datafiles: $(addprefix data_,$(addsuffix .txt,$(TESTS)))
183
184../icepack/icepack:
185	$(MAKE) -C ../icepack
186
187define data_template
188data_$(DEVICECLASS)_$(1).txt: make_$(1).py ../icepack/icepack
189	ICEDEVICE=$(DEVICECLASS) python3 make_$(1).py
190	+ICEDEV=$(DEVICE) $(MAKE) -C work_$(DEVICECLASS)_$(1)
191	ICEDEVICE=$(DEVICECLASS) python3 extract.py work_$(DEVICECLASS)_$(1)/*.glb > $$@
192endef
193
194$(foreach test,$(TESTS),$(eval $(call data_template,$(test))))
195
196%.ok: %.bin
197	bash check.sh $<
198
199check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_binop/*.bin)))
200check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_pin2pin/*.bin)))
201check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_mesh/*.bin)))
202check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_fanout/*.bin)))
203check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_logic/*.bin)))
204check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_cluster/*.bin)))
205check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_iopack/*.bin)))
206check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_pll/*.bin)))
207
208clean:
209	rm -rf work_$(DEVICECLASS)_*
210	rm -rf data_*.txt
211	rm -rf bitdata_*.txt
212	rm -rf database_*.txt
213	rm -rf timings_*.html
214
215.PHONY: database datafiles check clean
216