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