blob: c057deda8086cf832a9c52c6708ab7503fca5578 [file] [log] [blame] [edit]
# 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
bufgces = []
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 "BUFGCE" in site and "HDIO" not in site:
bufgces.append(site.split(":")[0])
if "SLICEM" in site or "SLICEL" in site:
slices.append(site.split(":")[0])
orig_bufgces = list(bufgces)
np.random.shuffle(bufgces)
np.random.shuffle(slices)
X = 30
root = sys.argv[2]
bufg_prob = np.random.randint(15, 20)
for x in range(X):
with open(root + "/clkroute2/clkrb%d.v" % x, "w") as f:
N = 256
M = np.random.randint(24)
for m in range(M):
print("module layer_1_%d(input [31:0] clk, input [71:0] cen, input d, output q);" % m, file=f)
print(" wire [%d:0] r;" % N, file=f)
print(" assign r[0] = d;", file=f)
print(" assign q = r[%d];" % N, file=f)
print("", file=f)
for i in range(N):
if N == 0 and len(slices) > 0:
loc = slices.pop()
print("(* LOC=\"%s\" *)" % loc, file=f)
if N != 0 and np.random.randint(16) == 0:
print(" wire srl_tmp_%d;" % i, file=f)
print(" SRLC32E srl_%d (.CLK(clk[%d]), .CE(cen[%d]), .A(5'b11111), .D(r[%d]), .Q(srl_tmp_%d));" % (i, (i * 32) // N, np.random.randint(72), i, i), file=f)
print(" FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(srl_tmp_%d), .Q(r[%d]));" % (i, (i * 32) // N, np.random.randint(72), i, i+1), file=f)
else:
print(" FDCE ff_%d (.C(clk[%d]), .CLR(1'b0), .CE(cen[%d]), .D(r[%d]), .Q(r[%d]));" % (i, (i * 32) // N, np.random.randint(72), i, i+1), file=f)
print("endmodule", file=f)
print("module top(input [39:0] clk, cen, input d, output q);", file=f)
num_inputs = np.random.randint(8, 40)
print(" wire [511:0] clk_int;", file=f)
print(" wire [71:0] cen_int;", file=f)
print(" assign clk_int[%d:0] = clk;" % (num_inputs - 1), file=f)
print(" assign cen_int[%d:0] = cen;" % (num_inputs - 1), file=f)
print(" assign cen_int[71:64] = 8'hFF;", file=f)
bufgces = list(orig_bufgces)
np.random.shuffle(bufgces)
for i in range(num_inputs, 512):
a = np.random.randint(num_inputs)
b = None
while b is None or b == a:
b = np.random.randint(num_inputs)
c = None
while c is None or c == a or c == b:
c = np.random.randint(num_inputs)
bg = None
if len(bufgces) > 0:
bg = bufgces.pop()
if bg is not None and np.random.randint(20) >= bufg_prob or (bg is not None and "DIV" in bg and np.random.randint(19) >= bufg_prob):
if "DIV" in bg:
print(" BUFGCE_DIV #(.BUFGCE_DIVIDE(%d), .IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .IS_CLR_INVERTED(%d)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(!cen[%d]), .CE(cen[%d]), .O(clk_int[%d]));" %
(np.random.randint(1, 9), np.random.randint(2), np.random.randint(2), np.random.randint(2), i, a, b, c, np.random.randint(40), np.random.randint(40), i), file=f)
else:
ctype = np.random.choice(["", "_1"])
params = " #(.IS_I_INVERTED(%d), .IS_CE_INVERTED(%d), .CE_TYPE(\"%s\")) " % (np.random.randint(2), np.random.randint(2), np.random.choice(["SYNC", "ASYNC"])) if ctype == "" else ""
print(" BUFGCE%s %s bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(cen[%d]), .O(clk_int[%d]));" %
(ctype, params, i, a, b, c, np.random.randint(40), i), file=f)
else:
print(" assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" % (i, a, b, c), file=f)
if i < 64:
print(" assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b), file=f)
print("", file=f)
print(" wire [%d:0] r;" % M, file=f)
print(" assign r[0] = d;", file=f)
print(" assign q = r[%d];" % M, file=f)
for i in range(M):
print(" layer_1_%d submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));" % (i, i, 32 * i, i, i+1), file=f)
print("endmodule", file=f)
ccio = ["G23", "F23", "G21", "F22", "F11", "H11", "G10", "H9", "G15", "F17", "E15", "D15", "AH11", "AH12", "AJ9", "AJ10", "AG21", "AH22", "AJ21", "AJ20", "AF18", "AH18", "AJ16", "AJ17"]
np.random.shuffle(ccio)
with open(root + "/clkroute2/clkrb%d.xdc" % x, "w") as f:
for i in range(num_inputs):
if i >= len(ccio):
break
print("set_property PACKAGE_PIN %s [get_ports {clk[%d]}]" % (ccio[i], i), file=f)
print("set_property IOSTANDARD LVCMOS18 [get_ports {clk[%d]}]" % (i), file=f)
with open(root + "/clkroute2/clkrb%d.tcl" % x, "w") as f:
print("add_files %s" % (root + ("/clkroute2/clkrb%d.v" % x)), file=f)
print("read_xdc %s" % (root + ("/clkroute2/clkrb%d.xdc" % x)), file=f)
print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
print("opt_design", file=f)
print("place_design", file=f)
print("route_design", file=f)
print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
print("write_checkpoint -force %s/specimen_clk/clkrb%d.dcp" % (root, x), file=f)
print("write_edif -force %s/specimen_clk/clkrb%d.edf" % (root, x), file=f)
print("write_bitstream -force %s/specimen_clk/clkrb%d.bit" % (root, x), file=f)
with open(root + "/clkroute2/run.sh", "w") as f:
print("#/usr/bin/env bash", file=f)
#print("set -ex", file=f)
for x in range(X):
print("vivado -mode batch -nolog -nojournal -source clkrb%d.tcl" % x, file=f)
print("if [ $? -eq 0 ]; then", file=f)
print(" ../../ultra/tools/dump_bitstream %s/specimen_clk/clkrb%d.bit %s/frames.txt > %s/specimen_clk/clkrb%d.dump" % (root, x, root, root, x), file=f)
print(" python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_clk/clkrb%d.dump > %s/specimen_clk/clkrb%d.tbits" % (root, root, x, root, x), file=f)
print("else", file=f)
print(" rm %s/specimen_clk/clkrb%d.dump" % (root, x), file=f)
print(" rm %s/specimen_clk/clkrb%d.tbits" % (root, x), file=f)
print(" rm %s/specimen_clk/clkrb%d.dcp" % (root, x), file=f)
print(" rm %s/specimen_clk/clkrb%d.bit" % (root, x), file=f)
print(" rm %s/specimen_clk/clkrb%d.features" % (root, x), file=f)
print("fi", file=f)