Introduce device class into fuxx workign directories and have glbcheck handle unsupported 5k tiles ok.

This commit is contained in:
Scott Shawcroft 2017-07-02 15:38:44 -07:00
parent a25c8679ac
commit b00ffb1c09
21 changed files with 198 additions and 1469 deletions

View File

@ -2,7 +2,7 @@ include ../config.mk
export LC_ALL=C
export ICE_SBTIMER_LP=1
DEVICECLASS := 1k
DEVICECLASS = 1k
ifeq ($(DEVICECLASS), 384)
DEVICE := lp384-cm49
@ -14,7 +14,7 @@ ifeq ($(DEVICECLASS), 1k)
endif
ifeq ($(DEVICECLASS), 5k)
DEVICE := up5k-sg48
DEVICE := up5k-sg48
RAM_SUFFIX := _5k
endif
@ -66,7 +66,7 @@ endif
timings:
ifeq ($(DEVICECLASS),8k)
cp tmedges.txt tmedges.tmp
set -e; for f in work_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
python3 timings.py -t timings_hx8k.txt work_*/*.sdf > timings_hx8k.new
mv timings_hx8k.new timings_hx8k.txt
@ -75,13 +75,13 @@ ifeq ($(DEVICECLASS),8k)
else
ifeq ($(DEVICECLASS),384)
cp tmedges.txt tmedges.tmp
set -e; for f in work_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
python3 timings.py -t timings_lp384.txt work_*/*.slp > timings_lp384.new
mv timings_lp384.new timings_lp384.txt
else
cp tmedges.txt tmedges.tmp
set -e; for f in work_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
set -e; for f in work_$(DEVICECLASS)_*/*.vsb; do echo $$f; yosys -q -f verilog -s tmedges.ys $$f; done
sort -u tmedges.tmp > tmedges.txt && rm -f tmedges.tmp
python3 timings.py -t timings_hx1k.txt work_*/*.sdf > timings_hx1k.new
mv timings_hx1k.new timings_hx1k.txt
@ -104,16 +104,16 @@ data_cached.txt: cached_io.txt cached_logic.txt cached_ramb$(RAM_SUFFIX).txt cac
gawk '{ print "ramt$(RAM_SUFFIX)", $$0; }' cached_ramt$(RAM_SUFFIX).txt >> data_cached.new
mv data_cached.new data_cached.txt
bitdata_io.txt: data_cached.txt $(addprefix data_,$(addsuffix .txt,$(TESTS)))
bitdata_io.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
grep ^io $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
bitdata_logic.txt: data_cached.txt $(addprefix data_,$(addsuffix .txt,$(TESTS)))
bitdata_logic.txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
grep ^logic $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
bitdata_ramb$(RAM_SUFFIX).txt: data_cached.txt $(addprefix data_,$(addsuffix .txt,$(TESTS)))
bitdata_ramb$(RAM_SUFFIX).txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
grep ^ramb$(RAM_SUFFIX) $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
bitdata_ramt$(RAM_SUFFIX).txt: data_cached.txt $(addprefix data_,$(addsuffix .txt,$(TESTS)))
bitdata_ramt$(RAM_SUFFIX).txt: data_cached.txt $(addprefix data_$(DEVICECLASS)_,$(addsuffix .txt,$(TESTS)))
grep ^ramt$(RAM_SUFFIX) $^ | tr -s ' ' | tr -d '\r' | cut -f2- -d' ' | sort -u > $@
datafiles: $(addprefix data_,$(addsuffix .txt,$(TESTS)))
@ -122,10 +122,10 @@ datafiles: $(addprefix data_,$(addsuffix .txt,$(TESTS)))
$(MAKE) -C ../icepack
define data_template
data_$(1).txt: make_$(1).py ../icepack/icepack
data_$(DEVICECLASS)_$(1).txt: make_$(1).py ../icepack/icepack
ICEDEVICE=$(DEVICECLASS) python3 make_$(1).py
+ICEDEV=$(DEVICE) $(MAKE) -C work_$(1)
ICEDEVICE=$(DEVICECLASS) python3 extract.py work_$(1)/*.glb > $$@
+ICEDEV=$(DEVICE) $(MAKE) -C work_$(DEVICECLASS)_$(1)
ICEDEVICE=$(DEVICECLASS) python3 extract.py work_$(DEVICECLASS)_$(1)/*.glb > $$@
endef
$(foreach test,$(TESTS),$(eval $(call data_template,$(test))))
@ -133,17 +133,17 @@ $(foreach test,$(TESTS),$(eval $(call data_template,$(test))))
%.ok: %.bin
bash check.sh $<
check: $(addsuffix .ok,$(basename $(wildcard work_binop/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_pin2pin/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_mesh/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_fanout/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_logic/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_cluster/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_iopack/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_pll/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_binop/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_pin2pin/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_mesh/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_fanout/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_logic/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_cluster/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_iopack/*.bin)))
check: $(addsuffix .ok,$(basename $(wildcard work_$(DEVICECLASS)_pll/*.bin)))
clean:
rm -rf work_*
rm -rf work_$(DEVICECLASS)_*
rm -rf data_*.txt
rm -rf bitdata_*.txt
rm -rf database_*.txt

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -71,3 +71,12 @@ elif device_class == "5k":
#TODO(tannewt): Add 39, 40, 41 to this list. It causes placement failures for some reason.
gpins = "20 35 37 44".split()
def output_makefile(working_dir, fuzzname):
with open(working_dir + "/Makefile", "w") as f:
print("all: %s" % " ".join(["%s_%02d.bin" % (fuzzname, i) for i in range(num)]), file=f)
for i in range(num):
basename = "%s_%02d" % (fuzzname, i)
print("%s.bin:" % basename, file=f)
print("\t-bash ../icecube.sh %s > %s.log 2>&1 && rm -rf %s.tmp || tail %s.log" % (basename, basename, basename, basename), file=f)
print("\tpython3 ../glbcheck.py %s.asc %s.glb" % (basename, basename), file=f)

View File

@ -30,13 +30,13 @@ with open(argv[1]) as f:
with open(argv[2]) as f:
current_tile = None
for line in f:
if line.find("Tile_") >= 0:
if line.startswith(("Tile", "IO_Tile", "RAM_Tile", "LogicTile")):
f = line.replace("IO_", "").replace("RAM_", "").split("_")
assert len(f) == 3
current_tile = "%02d.%02d" % (int(f[1]), int(f[2]))
continue
if line.find("GlobalNetwork") >= 0:
if line.find("GlobalNetwork") >= 0 or line.startswith(("IpCon", "DSP")):
current_tile = None
continue
@ -54,10 +54,15 @@ only_in_asc = asc_bits - glb_bits
only_in_glb = glb_bits - asc_bits
assert len(only_in_asc) != 0 or len(only_in_glb) != 0
if len(only_in_asc) != 0:
print("Only in ASC: %s" % sorted(only_in_asc))
if len(only_in_glb) != 0:
print("Only in GLB: %s" % sorted(only_in_glb))
print("Only in ASC:")
for bit in sorted(only_in_asc):
print(bit)
print()
print("Only in GLB:")
for bit in sorted(only_in_glb):
print(bit)
exit(1)

View File

@ -4,13 +4,17 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_aig")
os.mkdir("work_aig")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_aig" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
w = len(pins) // 2
for idx in range(num):
with open("work_aig/aig_%02d.v" % idx, "w") as f:
with open(working_dir + "/aig_%02d.v" % idx, "w") as f:
print("module top(input [%d:0] a, output [%d:0] y);" % (w-1, w-1), file=f)
sigs = ["a[%d]" % i for i in range(w)]
@ -47,14 +51,11 @@ for idx in range(num):
print("endmodule", file=f)
with open("work_aig/aig_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/aig_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
for i in range(w):
print("set_io a[%d] %s" % (i, p[i]), file=f)
print("set_io y[%d] %s" % (i, p[i+w]), file=f)
with open("work_aig/Makefile", "w") as f:
print("all: %s" % " ".join(["aig_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("aig_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh aig_%02d > aig_%02d.log 2>&1 && rm -rf aig_%02d.tmp || tail aig_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "aig")

View File

@ -4,23 +4,24 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_binop")
os.mkdir("work_binop")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_binop" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
with open("work_binop/binop_%02d.v" % idx, "w") as f:
with open(working_dir + "/binop_%02d.v" % idx, "w") as f:
print("module top(input a, b, output y);", file=f)
print(" assign y = a%sb;" % np.random.choice([" ^ ", " ^ ~", " & ", " & ~", " | ", " | ~"]), file=f)
print("endmodule", file=f)
with open("work_binop/binop_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/binop_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
print("set_io a %s" % p[0], file=f)
print("set_io b %s" % p[1], file=f)
print("set_io y %s" % p[2], file=f)
with open("work_binop/Makefile", "w") as f:
print("all: %s" % " ".join(["binop_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("binop_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh binop_%02d > binop_%02d.log 2>&1 && rm -rf binop_%02d.tmp || tail binop_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "binop")

View File

@ -4,24 +4,23 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_cluster")
os.mkdir("work_cluster")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_cluster" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
with open("work_cluster/cluster_%02d.v" % idx, "w") as f:
with open(working_dir + "/cluster_%02d.v" % idx, "w") as f:
print("module top(input [3:0] a, output [3:0] y);", file=f)
print(" assign y = {|a, &a, ^a, a[3:2] == a[1:0]};", file=f)
print("endmodule", file=f)
with open("work_cluster/cluster_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/cluster_%02d.pcf" % idx, "w") as f:
i = np.random.randint(len(pins))
netnames = np.random.permutation(["a[%d]" % i for i in range(4)] + ["y[%d]" % i for i in range(4)])
for net in netnames:
print("set_io %s %s" % (net, pins[i]), file=f)
i = (i + 1) % len(pins)
with open("work_cluster/Makefile", "w") as f:
print("all: %s" % " ".join(["cluster_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("cluster_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh cluster_%02d > cluster_%02d.log 2>&1 && rm -rf cluster_%02d.tmp || tail cluster_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "cluster")

View File

@ -4,25 +4,26 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_fanout")
os.mkdir("work_fanout")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_fanout" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
output_count = len(pins) - 2
with open("work_fanout/fanout_%02d.v" % idx, "w") as f:
with open(working_dir + "/fanout_%02d.v" % idx, "w") as f:
print("module top(input [1:0] a, output [%d:0] y);" % (output_count,), file=f)
print(" assign y = {%d{a}};" % (output_count,), file=f)
print("endmodule", file=f)
with open("work_fanout/fanout_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/fanout_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
for i in range(output_count):
print("set_io y[%d] %s" % (i, p[i]), file=f)
print("set_io a[0] %s" % p[output_count], file=f)
print("set_io a[1] %s" % p[output_count+1], file=f)
with open("work_fanout/Makefile", "w") as f:
print("all: %s" % " ".join(["fanout_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("fanout_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh fanout_%02d > fanout_%02d.log 2>&1 && rm -rf fanout_%02d.tmp || tail fanout_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "fanout")

View File

@ -4,8 +4,12 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_fflogic")
os.mkdir("work_fflogic")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_fflogic" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
w = (len(pins) - 4) // 5
@ -38,7 +42,7 @@ def print_seq_op(dst, src1, src2, op, f):
assert False
for idx in range(num):
with open("work_fflogic/fflogic_%02d.v" % idx, "w") as f:
with open(working_dir + "/fflogic_%02d.v" % idx, "w") as f:
print("module top(input clk, rst, en, input [%d:0] a, b, c, d, output [%d:0] y, output z);" % (w-1, w-1), file=f)
print(" reg [%d:0] p, q;" % (w-1,), file=f)
@ -47,8 +51,5 @@ for idx in range(num):
print(" assign y = p %s q, z = clk ^ rst ^ en;" % random_op(), file=f)
print("endmodule", file=f)
with open("work_fflogic/Makefile", "w") as f:
print("all: %s" % " ".join(["fflogic_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("fflogic_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh fflogic_%02d > fflogic_%02d.log 2>&1 && rm -rf fflogic_%02d.tmp || tail fflogic_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "fflogic")

View File

@ -4,11 +4,13 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_gbio")
os.mkdir("work_gbio")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_gbio" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for p in gpins:
if p in pins: pins.remove(p)
@ -17,7 +19,7 @@ for p in gpins:
w = min(min((len(pins) - 8) // 4, len(gpins)), 8)
for idx in range(num):
with open("work_gbio/gbio_%02d.v" % idx, "w") as f:
with open(working_dir + "/gbio_%02d.v" % idx, "w") as f:
glbs = np.random.permutation(list(range(8)))
if w <= 4:
@ -81,7 +83,7 @@ for idx in range(num):
globals_0,
glbs[0], glbs[1], glbs[1], glbs[2], glbs[3]
), file=f)
with open("work_gbio/gbio_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/gbio_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
g = np.random.permutation(gpins)
for i in range(w):
@ -93,8 +95,5 @@ for idx in range(num):
print("set_io %s %s" % (n, p[4*w+i]), file=f)
print("set_io q %s" % (p[-1]), file=f)
with open("work_gbio/Makefile", "w") as f:
print("all: %s" % " ".join(["gbio_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("gbio_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh gbio_%02d > gbio_%02d.log 2>&1 && rm -rf gbio_%02d.tmp || tail gbio_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "gbio")

View File

@ -4,8 +4,12 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_gbio2")
os.mkdir("work_gbio2")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_gbio2" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for p in gpins:
if p in pins: pins.remove(p)
@ -15,7 +19,7 @@ for p in gpins:
w = min(min((len(pins) - 8) // 4, len(gpins)), 8)
for idx in range(num):
with open("work_gbio2/gbio2_%02d.v" % idx, "w") as f:
with open(working_dir + "/gbio2_%02d.v" % idx, "w") as f:
glbs = np.random.permutation(list(range(8)))
print("""
module top (
@ -71,7 +75,7 @@ for idx in range(num):
""" % (
glbs[0], glbs[1], glbs[1], glbs[2], glbs[3]
), file=f)
with open("work_gbio2/gbio2_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/gbio2_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
g = np.random.permutation(gpins)
for i in range(w):
@ -83,8 +87,5 @@ for idx in range(num):
print("set_io %s %s" % (n, p[4*w+i]), file=f)
print("set_io q %s" % (p[-1]), file=f)
with open("work_gbio2/Makefile", "w") as f:
print("all: %s" % " ".join(["gbio2_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("gbio2_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh gbio2_%02d > gbio2_%02d.log 2>&1 && rm -rf gbio2_%02d.tmp || tail gbio2_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "gbio2")

View File

@ -4,13 +4,17 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_io")
os.mkdir("work_io")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_io" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
w = num_iobanks
for idx in range(num):
with open("work_io/io_%02d.v" % idx, "w") as f:
with open(working_dir + "/io_%02d.v" % idx, "w") as f:
glbs = np.random.permutation(list(range(8)))
print("""
module top (
@ -48,14 +52,11 @@ for idx in range(num):
np.random.choice(["0000", "0110", "1010", "1110", "0101", "1001", "1101", "0100", "1000", "1100", "0111", "1111"]),
np.random.choice(["00", "01", "10", "11"]), np.random.choice(["0", "1"]), np.random.choice(["0", "1"]), w-1
), file=f)
with open("work_io/io_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/io_%02d.pcf" % idx, "w") as f:
p = list(np.random.permutation(pins))
for k in ["pin", "latch_in", "clk_en", "clk_in", "clk_out", "oen", "dout_0", "dout_1", "din_0", "din_1"]:
for i in range(w):
print("set_io %s[%d] %s" % (k, i, p.pop()), file=f)
with open("work_io/Makefile", "w") as f:
print("all: %s" % " ".join(["io_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("io_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh io_%02d > io_%02d.log 2>&1 && rm -rf io_%02d.tmp || tail io_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "io")

View File

@ -10,8 +10,12 @@ num_xor = 8
num_luts = 8
num_outputs_range = (5, 20)
os.system("rm -rf work_iopack")
os.mkdir("work_iopack")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_iopack" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
def get_pin_directions():
pindirs = ["i" for i in range(len(pins))]
@ -32,7 +36,7 @@ def get_nearby_inputs(p, n, r):
return [choice(ipins) for i in range(n)]
for idx in range(num):
with open("work_iopack/iopack_%02d.v" % idx, "w") as f:
with open(working_dir + "/iopack_%02d.v" % idx, "w") as f:
pindirs = get_pin_directions()
print("module top(%s);" % ", ".join(["%sput p%d" % ("in" if pindirs[i] == "i" else "out", i) for i in range(len(pins))]), file=f)
for outp in range(len(pins)):
@ -45,13 +49,9 @@ for idx in range(num):
xor_nets.add("%sp%d_in%d" % (choice(["~", ""]), outp, i))
print(" assign p%d = ^{%s};" % (outp, ", ".join(sorted(xor_nets))), file=f)
print("endmodule", file=f)
with open("work_iopack/iopack_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/iopack_%02d.pcf" % idx, "w") as f:
for i in range(len(pins)):
print("set_io p%d %s" % (i, pins[i]), file=f)
with open("work_iopack/Makefile", "w") as f:
print("all: %s" % " ".join(["iopack_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("iopack_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh iopack_%02d > iopack_%02d.log 2>&1 && rm -rf iopack_%02d.tmp || tail iopack_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "iopack")

View File

@ -4,19 +4,23 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_logic")
os.mkdir("work_logic")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_logic" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
def random_op():
return np.random.choice(["+", "-", "^", "&", "|", "&~", "|~"])
for idx in range(num):
bus_width = len(pins) // 5
with open("work_logic/logic_%02d.v" % idx, "w") as f:
with open(working_dir + "/logic_%02d.v" % idx, "w") as f:
print("module top(input [%d:0] a, b, c, d, output [%d:0] y);" % (bus_width, bus_width), file=f)
print(" assign y = (a %s b) %s (c %s d);" % (random_op(), random_op(), random_op()), file=f)
print("endmodule", file=f)
with open("work_logic/logic_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/logic_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
for i in range(bus_width):
print("set_io a[%d] %s" % (i, p[i]), file=f)
@ -25,8 +29,4 @@ for idx in range(num):
print("set_io d[%d] %s" % (i, p[i+bus_width*3]), file=f)
print("set_io y[%d] %s" % (i, p[i+bus_width*4]), file=f)
with open("work_logic/Makefile", "w") as f:
print("all: %s" % " ".join(["logic_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("logic_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh logic_%02d > logic_%02d.log 2>&1 && rm -rf logic_%02d.tmp || tail logic_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "logic")

View File

@ -4,11 +4,15 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_mem")
os.mkdir("work_mem")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_mem" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
with open("work_mem/mem_%02d.v" % idx, "w") as f:
with open(working_dir + "/mem_%02d.v" % idx, "w") as f:
print("""
module top(input clk, i0, i1, i2, i3, output reg o0, o1, o2, o3, o4);
reg [9:0] raddr, waddr, rdata, wdata;
@ -27,14 +31,11 @@ for idx in range(num):
end
endmodule
""", file=f)
with open("work_mem/mem_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/mem_%02d.pcf" % idx, "w") as f:
p = list(np.random.permutation(pins))
for port in [ "clk", "i0", "i1", "i2", "i3", "o0", "o1", "o2", "o3", "o4" ]:
print("set_io %s %s" % (port, p.pop()), file=f)
with open("work_mem/Makefile", "w") as f:
print("all: %s" % " ".join(["mem_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("mem_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh mem_%02d > mem_%02d.log 2>&1 && rm -rf mem_%02d.tmp || tail mem_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "mem")

View File

@ -4,8 +4,13 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_mesh")
os.mkdir("work_mesh")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_mesh" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
# This test maps a random set of pins to another random set of outputs.
@ -13,19 +18,16 @@ device_class = os.getenv("ICEDEVICE")
for idx in range(num):
io_count = len(pins) // 2
with open("work_mesh/mesh_%02d.v" % idx, "w") as f:
with open(working_dir + "/mesh_%02d.v" % idx, "w") as f:
print("module top(input [%d:0] a, output [%d:0] y);" % (io_count, io_count), file=f)
print(" assign y = a;", file=f)
print("endmodule", file=f)
with open("work_mesh/mesh_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/mesh_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
for i in range(io_count):
print("set_io a[%d] %s" % (i, p[i]), file=f)
for i in range(io_count):
print("set_io y[%d] %s" % (i, p[io_count+i]), file=f)
with open("work_mesh/Makefile", "w") as f:
print("all: %s" % " ".join(["mesh_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("mesh_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh mesh_%02d > mesh_%02d.log 2>&1 && rm -rf mesh_%02d.tmp || tail mesh_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "mesh")

View File

@ -4,22 +4,23 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_pin2pin")
os.mkdir("work_pin2pin")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_pin2pin" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
with open("work_pin2pin/pin2pin_%02d.v" % idx, "w") as f:
with open(working_dir + "/pin2pin_%02d.v" % idx, "w") as f:
print("module top(input a, output y);", file=f)
print(" assign y = a;", file=f)
print("endmodule", file=f)
with open("work_pin2pin/pin2pin_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/pin2pin_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
print("set_io a %s" % p[0], file=f)
print("set_io y %s" % p[1], file=f)
with open("work_pin2pin/Makefile", "w") as f:
print("all: %s" % " ".join(["pin2pin_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("pin2pin_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh pin2pin_%02d > pin2pin_%02d.log 2>&1 && rm -rf pin2pin_%02d.tmp || tail pin2pin_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "pin2pin")

View File

@ -11,9 +11,14 @@ def randbin(n):
for p in gpins:
if p in pins: pins.remove(p)
os.system("rm -rf work_pll")
os.mkdir("work_pll")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_pll" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
pin_names = list()
@ -110,20 +115,17 @@ for idx in range(num):
pll_inst.append("defparam uut.TEST_MODE = 1'b0;")
with open("work_pll/pll_%02d.v" % idx, "w") as f:
with open(working_dir + "/pll_%02d.v" % idx, "w") as f:
print("module top(%s);" % ", ".join(pin_names), file=f)
print("\n".join(vlog_body), file=f)
print("\n".join(pll_inst), file=f)
print("endmodule", file=f)
with open("work_pll/pll_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/pll_%02d.pcf" % idx, "w") as f:
for pll_pin, package_pin in zip(pin_names, list(permutation(pins))[0:len(pin_names)]):
if pll_pin == "packagepin": package_pin = "49"
print("set_io %s %s" % (pll_pin, package_pin), file=f)
with open("work_pll/Makefile", "w") as f:
print("all: %s" % " ".join(["pll_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("pll_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh pll_%02d > pll_%02d.log 2>&1 && rm -rf pll_%02d.tmp || tail pll_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "pll")

View File

@ -4,13 +4,17 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_prim")
os.mkdir("work_prim")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_prim" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
w = len(pins) // 4
for idx in range(num):
with open("work_prim/prim_%02d.v" % idx, "w") as f:
with open(working_dir + "/prim_%02d.v" % idx, "w") as f:
clkedge = np.random.choice(["pos", "neg"])
print("module top(input clk, input [%s:0] a, b, output reg x, output reg [%s:0] y);""" % ( w-1, w-1 ), file=f)
print(" reg [%s:0] aa, bb;""" % ( w-1 ), file=f)
@ -25,7 +29,7 @@ for idx in range(num):
else:
print(" always @(%sedge clk) y <= %s%s;" % (clkedge, np.random.choice(["~", "-", ""]), np.random.choice(["a", "b"])), file=f)
print("endmodule", file=f)
with open("work_prim/prim_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/prim_%02d.pcf" % idx, "w") as f:
p = np.random.permutation(pins)
if np.random.choice([True, False]):
for i in range(w):
@ -43,8 +47,5 @@ for idx in range(num):
if np.random.choice([True, False]):
print("set_io clk %s" % p[3*w+2], file=f)
with open("work_prim/Makefile", "w") as f:
print("all: %s" % " ".join(["prim_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("prim_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh prim_%02d > prim_%02d.log 2>&1 && rm -rf prim_%02d.tmp || tail prim_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "prim")

View File

@ -4,11 +4,15 @@ from fuzzconfig import *
import numpy as np
import os
os.system("rm -rf work_ram40")
os.mkdir("work_ram40")
device_class = os.getenv("ICEDEVICE")
working_dir = "work_%s_ram40" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
for idx in range(num):
with open("work_ram40/ram40_%02d.v" % idx, "w") as f:
with open(working_dir + "/ram40_%02d.v" % idx, "w") as f:
glbs = ["glb[%d]" % i for i in range(np.random.randint(8)+1)]
glbs_choice = ["wa", "ra", "msk", "wd", "we", "wce", "wc", "re", "rce", "rc"]
print("""
@ -96,15 +100,12 @@ for idx in range(num):
bits[k] = "rdata_%d[%d] ^ %s" % (i, k, bits[k])
print("assign out_pins = rdata_%d;" % i, file=f)
print("endmodule", file=f)
with open("work_ram40/ram40_%02d.pcf" % idx, "w") as f:
with open(working_dir + "/ram40_%02d.pcf" % idx, "w") as f:
p = list(np.random.permutation(pins))
for i in range(len(pins) - 16):
print("set_io in_pins[%d] %s" % (i, p.pop()), file=f)
for i in range(16):
print("set_io out_pins[%d] %s" % (i, p.pop()), file=f)
with open("work_ram40/Makefile", "w") as f:
print("all: %s" % " ".join(["ram40_%02d.bin" % i for i in range(num)]), file=f)
for i in range(num):
print("ram40_%02d.bin:" % i, file=f)
print("\t-bash ../icecube.sh ram40_%02d > ram40_%02d.log 2>&1 && rm -rf ram40_%02d.tmp || tail ram40_%02d.log" % (i, i, i, i), file=f)
output_makefile(working_dir, "ram40")