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