| # Copyright 2020 Project U-Ray Authors | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| import numpy as np | |
| import sys | |
| print("module top(input [15:0] clk, rst, cen, input [6:0] d, output q);") | |
| N = 10000 | |
| print(" wire [%d:0] int_d;" % N) | |
| print(" assign int_d[6:0] = d;") | |
| print(" assign q = int_d[%d];" % N) | |
| slices = [] | |
| with open(sys.argv[1], "r") as tf: | |
| for line in tf: | |
| sl = line.strip().split(",") | |
| if len(sl) < 4: | |
| continue | |
| for site in sl[4:]: | |
| if "SLICEM" in site or "SLICEL" in site: | |
| slices.append(site.split(":")[0]) | |
| for i in range(6, N): | |
| fftype, srsig = np.random.choice(["FDPE,PRE", "FDCE,CLR", "FDSE,S", "FDRE,R"]).split(",") | |
| sl = slices.pop() | |
| if np.random.ranf() < 0.5: | |
| data = "int_d[%d]" % i | |
| else: | |
| lutsize = np.random.randint(2, 10) | |
| if lutsize > 6: | |
| lutsize = 6 | |
| print (" wire lut_q_%d;" % i) | |
| print(" (* BEL=\"%s%dLUT\" *) (* LOC=\"%s\" *) LUT%d #(" % (np.random.choice(list("ABCDEFGH")), np.random.randint(6 if lutsize == 6 else 5, 7), sl, lutsize)) | |
| print(" .INIT(%d'h%016x)" % (2 ** lutsize, np.random.randint(1, (2 ** ((2 ** lutsize) - 1) - 1)))) | |
| print(" ) lut_%d (" % i) | |
| for j in range(lutsize): | |
| print(" .I%d(int_d[%d])," % (j, i - j)) | |
| print(" .O(lut_q_%d)" % i) | |
| print(" );") | |
| data = "lut_q_%d" % i | |
| print(" (* BEL=\"%sFF%s\" *) (* LOC=\"%s\" *) %s #(" % (np.random.choice(list("ABCDEFGH")), np.random.choice(["", "2"]), sl, fftype)) | |
| print(" .IS_C_INVERTED(%s)," % np.random.choice(["0", "1"])) | |
| print(" .IS_%s_INVERTED(%s)," % (srsig, np.random.choice(["0", "1"]))) | |
| print(" .INIT(%s)" % np.random.choice(["1'b0", "1'b1"])) | |
| print(" ) ff_%d (" % i) | |
| print(" .C(clk[%d])," % np.random.randint(0, 16)) | |
| print(" .CE(cen[%d])," % np.random.randint(0, 16)) | |
| print(" .%s(rst[%d])," % (srsig, np.random.randint(0, 16))) | |
| print(" .D(%s)," % (data)) | |
| print(" .Q(int_d[%d])" % (i + 1)) | |
| print(" );") | |
| print("endmodule") |