# 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)