# 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

N = 5000

bufgces = []
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])

print("module layer_1(input [31:0] clk, input [71:0] cen, input d, output q);")
print("    wire [%d:0] r;" % N)
print("    assign r[0] = d;")
print("    assign q = r[%d];" % N)
print()
for i in range(N):
	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))
	print()
print("endmodule")


M = 16
print("module top(input [15:0] clk, cen, input d, output q);")
print("    wire [511:0] clk_int;")
print("    wire [71:0] cen_int;")
print("    assign clk_int[15:0] = clk;")
print("    assign cen_int[15:0] = cen;")
print("    assign cen_int[71:64] = 8'hFF;")
for i in range(16, 512):
	a = np.random.randint(16)
	b = None
	while b is None or b == a:
		b = np.random.randint(16)
	c = None
	while c is None or c == a or c == b:
		c = np.random.randint(16)
	bg = None
	if len(bufgces) > 0:
		bg = bufgces.pop()
	if bg is not None and np.random.randint(3) > 0:
		if "DIV" in bg:
			print("    BUFGCE_DIV #(.BUFGCE_DIVIDE(3)) bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CLR(0), .CE(1'b1), .O(clk_int[%d]));" % (i, a, b, c, i))
		else:
			print("    BUFGCE bufg_%d (.I(clk[%d] ^ clk[%d] ^ clk[%d]), .CE(1'b1), .O(clk_int[%d]));" % (i, a, b, c, i))
	else:
		print("    assign clk_int[%d] = clk[%d] ^ clk[%d] ^ clk[%d];" % (i, a, b, c))
	if i < 64:
		print("    assign cen_int[%d] = cen[%d] ^ cen[%d];" % (i, a, b))
print()
print("    wire [%d:0] r;" % M)
print("    assign r[0] = d;")
print("    assign q = r[%d];" % M)
for i in range(M):
	print("    layer_1 submod_%d(.clk(clk_int[%d +: 32]), .cen(cen_int), .d(r[%d]), .q(r[%d]));" % (i, 32 * i, i, i+1))
print("endmodule")
