| #!/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") |