blob: 4d4fa5a2d70718c993fd3363207079432611e144 [file] [log] [blame]
#!/usr/bin/env python3
from fuzzconfig import *
import numpy as np
import os
device_class = os.getenv("ICEDEVICE")
assert device_class == "u4k"
working_dir = "work_%s_uip" % (device_class, )
os.system("rm -rf " + working_dir)
os.mkdir(working_dir)
def randbin(n):
return "".join([np.random.choice(["0", "1"]) for i in range(n)])
for idx in range(num):
with open(working_dir + "/uip_%02d.v" % idx, "w") as f:
glbs = ["glb[%d]" % i for i in range(np.random.randint(6)+1)]
print("""
module top (
input [%d:0] glb_pins,
input [%d:0] in_pins,
input [2:0] led_data,
output [%d:0] led_pins
);
wire [%d:0] glb, glb_pins;
SB_GB gbufs [%d:0] (
.USER_SIGNAL_TO_GLOBAL_BUFFER(glb_pins),
.GLOBAL_BUFFER_OUTPUT(glb)
);
""" % (len(glbs)-1, len(pins) - len(glbs) - 16 - 1, len(led_pins)-1, len(glbs)-1, len(glbs)-1), file=f)
bits = ["in_pins[%d]" % (i % (len(pins) - len(glbs) - 16 - 1)) for i in range(60)]
bits = list(np.random.permutation(bits))
#Internal oscillators
tmp = ["in_pins[%d]" % i for i in range(len(pins) - len(glbs) - 16 - 1)]
tmp = list(np.random.permutation(tmp))
for osc in ["LF", "HF"]:
bit_pu = tmp.pop()
bit_en = tmp.pop()
bit_clk = "clk_" + osc
glbs.append(bit_clk)
param = ""
if osc == "HF": #only HFOSC has a divider:
param = "#(.CLKHF_DIV(\"0b%s\"))" % randbin(2)
route = np.random.choice(["", "/* synthesis ROUTE_THROUGH_FABRIC = 1 */"])
print("""
SB_%sOSC %s osc_%s (
.CLK%sPU(%s),
.CLK%sEN(%s),
.CLK%s(%s)
) %s;
""" % (
osc, param, osc, osc, bit_pu,
osc, bit_en, osc, bit_clk, route
), file=f)
glbs_orig = list(glbs)
# tmp = list(np.random.permutation(bits))
# glbs = list(glbs_orig)
# bit_clk = np.random.choice([glbs.pop(), tmp.pop()])
# bit_rst = np.random.choice([glbs.pop(), tmp.pop()])
# bit_paramsok = tmp.pop()
# bits_color = [tmp.pop() for k in range(4)]
# bits_bright = [tmp.pop() for k in range(4)]
# bits_ramp = [tmp.pop() for k in range(4)]
# bits_rate = [tmp.pop() for k in range(4)]
# print("""
# wire [2:0] pwm_out;
# SB_RGB_IP rgb_ip (
# .CLK(%s),
# .RST(%s),
# .PARAMSOK(%s),
# .RGBCOLOR({%s,%s,%s,%s}),
# .BRIGHTNESS({%s,%s,%s,%s}),
# .BREATHRAMP({%s,%s,%s,%s}),
# .BLINKRATE({%s,%s,%s,%s}),
# .REDPWM(pwm_out[0]),
# .GREENPWM(pwm_out[1]),
# .BLUEPWM(pwm_out[2])
# );
# """ % (
# bit_clk, bit_rst, bit_paramsok, *bits_color, *bits_bright, *bits_ramp, *bits_rate
# ), file=f)
# bits.append("pwm_out[0]")
# bits.append("pwm_out[1]")
# bits.append("pwm_out[2]")
current_choices = ["0b000000", "0b000001", "0b000011", "0b000111", "0b001111", "0b011111", "0b111111"]
currents = [np.random.choice(current_choices) for i in range(3)]
bit_curren = np.random.choice(bits)
bit_rgbleden = np.random.choice(bits)
bits_pwm = [np.random.choice([np.random.choice(bits), "led_data[%d]" % i]) for i in range(3)]
print("""
wire rgbpu;
SB_LED_DRV_CUR led_drv_cur (
.EN(%s),
.LEDPU(rgbpu)
);
SB_RGB_DRV #(
.RGB0_CURRENT(\"%s\"),
.RGB1_CURRENT(\"%s\"),
.RGB2_CURRENT(\"%s\")
) rgb_drv (
.RGBLEDEN(%s),
.RGBPU(rgbpu),
.RGB0PWM(%s),
.RGB1PWM(%s),
.RGB2PWM(%s),
.RGB0(led_pins[0]),
.RGB1(led_pins[1]),
.RGB2(led_pins[2])
);
""" % (
bit_curren, currents[0], currents[1], currents[2],
bit_rgbleden, bits_pwm[0], bits_pwm[1], bits_pwm[2]
), file = f)
# TODO: I2C and SPI
print("endmodule", file=f)
with open(working_dir + "/uip_%02d.pcf" % idx, "w") as f:
p = list(np.random.permutation(pins))
for i in range(len(pins) - len(glbs) - 16):
print("set_io in_pins[%d] %s" % (i, p.pop()), file=f)
for i in range(len(led_pins)):
print("set_io led_pins[%d] %s" % (i, led_pins[i]), file=f)
output_makefile(working_dir, "uip")