|  | #!/usr/bin/env python3 | 
|  |  | 
|  | from fuzzconfig import * | 
|  | import numpy as np | 
|  | import os | 
|  |  | 
|  | 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(working_dir + "/ram40_%02d.v" % idx, "w") as f: | 
|  | glbs = ["glb[%d]" % i for i in range(np.random.randint(8)+1)] | 
|  | # Connecting GLB to CE pins seemingly disallowed | 
|  | if device_class == "5k": | 
|  | glbs_choice = ["wa", "ra", "msk", "wd", "we", "wc", "re", "rc"] | 
|  | else: | 
|  | glbs_choice = ["wa", "ra", "msk", "wd", "we", "wce", "wc", "re", "rce", "rc"] | 
|  | print(""" | 
|  | module top ( | 
|  | input  [%d:0] glb_pins, | 
|  | input  [%d:0] in_pins, | 
|  | output [15:0] out_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(glbs)-1, len(glbs)-1), file=f) | 
|  | bits = ["in_pins[%d]" % i for i in range(60)] | 
|  | bits = list(np.random.permutation(bits)) | 
|  | for i in range(num_ramb40): | 
|  | tmp = list(np.random.permutation(bits)) | 
|  | rmode = np.random.randint(4) | 
|  | if rmode == 3: | 
|  | wmode = np.random.randint(1, 4) | 
|  | else: | 
|  | wmode = np.random.randint(4) | 
|  | raddr_bits = (8, 9, 10, 11)[rmode] | 
|  | waddr_bits = (8, 9, 10, 11)[wmode] | 
|  | rdata_bits = (16, 8, 4, 2)[rmode] | 
|  | wdata_bits = (16, 8, 4, 2)[wmode] | 
|  | bits_waddr = [tmp.pop() for k in range(waddr_bits)] | 
|  | bits_raddr = [tmp.pop() for k in range(raddr_bits)] | 
|  | bits_mask  = [tmp.pop() for k in range(16)] | 
|  | bits_wdata = [tmp.pop() for k in range(wdata_bits)] | 
|  | bit_we     = tmp.pop() | 
|  | bit_wclke  = tmp.pop() | 
|  | bit_wclk   = tmp.pop() | 
|  | bit_re     = tmp.pop() | 
|  | bit_rclke  = tmp.pop() | 
|  | bit_rclk   = tmp.pop() | 
|  | if len(glbs) != 0: | 
|  | s = np.random.choice(glbs_choice) | 
|  | glbs_choice.remove(s) | 
|  | if s == "wa":  bits_waddr[np.random.randint(len(bits_waddr))] = glbs.pop() | 
|  | if s == "ra":  bits_raddr[np.random.randint(len(bits_raddr))] = glbs.pop() | 
|  | if s == "msk": bits_mask [np.random.randint(len(bits_mask ))] = glbs.pop() | 
|  | if s == "wd":  bits_wdata[np.random.randint(len(bits_wdata))] = glbs.pop() | 
|  | if s == "we":  bit_we    = glbs.pop() | 
|  | if s == "wce": bit_wclke = glbs.pop() | 
|  | if s == "wc":  bit_wclk  = glbs.pop() | 
|  | if s == "re":  bit_re    = glbs.pop() | 
|  | if s == "rce": bit_rclke = glbs.pop() | 
|  | if s == "rc":  bit_rclk  = glbs.pop() | 
|  | bits_waddr = "{%s}" % ", ".join(bits_waddr) | 
|  | bits_raddr = "{%s}" % ", ".join(bits_raddr) | 
|  | bits_mask  = "{%s}" % ", ".join(bits_mask) | 
|  | bits_wdata = "{%s}" % ", ".join(bits_wdata) | 
|  | if wmode != 0: bits_mask = "" | 
|  | memtype = np.random.choice(["", "NR", "NW", "NRNW"]) | 
|  | wclksuffix = "N" if memtype in ["NW", "NRNW"] else "" | 
|  | rclksuffix = "N" if memtype in ["NR", "NRNW"] else "" | 
|  | print(""" | 
|  | wire [%d:0] rdata_%d; | 
|  | SB_RAM40_4K%s #( | 
|  | .READ_MODE(%d), | 
|  | .WRITE_MODE(%d) | 
|  | ) ram_%d ( | 
|  | .WADDR(%s), | 
|  | .RADDR(%s), | 
|  | .MASK(%s), | 
|  | .WDATA(%s), | 
|  | .RDATA(rdata_%d), | 
|  | .WE(%s), | 
|  | .WCLKE(%s), | 
|  | .WCLK%s(%s), | 
|  | .RE(%s), | 
|  | .RCLKE(%s), | 
|  | .RCLK%s(%s) | 
|  | ); | 
|  | """ % ( | 
|  | rdata_bits-1, i, memtype, rmode, wmode, i, | 
|  | bits_waddr, bits_raddr, bits_mask, bits_wdata, i, | 
|  | bit_we, bit_wclke, wclksuffix, bit_wclk, | 
|  | bit_re, bit_rclke, rclksuffix, bit_rclk | 
|  | ), file=f) | 
|  | bits = list(np.random.permutation(bits)) | 
|  | for k in range(rdata_bits): | 
|  | 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(working_dir + "/ram40_%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(16): | 
|  | print("set_io out_pins[%d] %s" % (i, p.pop()), file=f) | 
|  |  | 
|  |  | 
|  | output_makefile(working_dir, "ram40") |