mirror of https://github.com/YosysHQ/icestorm.git
140 lines
4.5 KiB
Python
Executable File
140 lines
4.5 KiB
Python
Executable File
#!/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")
|