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