# 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
import math

print("module top(input clk, clkb, rst, ena, enb, cea, ceb, input [13:0] ra, wa, input [3:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);")
N = 500
print("    wire [35:0] int_d[0:%d-1];" % N)
print("    assign rdata = sel[0] ? int_d[sel[10:1]][35:18] : int_d[sel[10:1]][17:0];")
for i in range(N):
	write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36])
	read_width_a = np.random.choice([0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.45, 0.1])
	write_width_a = 0 if (write_width_b == 36 or read_width_a == 36) else np.random.choice([0, 1, 2, 4, 9, 18])
	read_width_b = 0 if (read_width_a == 36 or write_width_b == 36) else np.random.choice([0, 1, 2, 4, 9, 18], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.55])

	cd = np.random.choice(["INDEPENDENT", "COMMON"])

	print("    (* keep, dont_touch *) RAMB18E2 #(")
	print("        .CLOCK_DOMAINS(\"%s\")," % cd)
	print("        .READ_WIDTH_A(%d)," % read_width_a)
	print("        .READ_WIDTH_B(%d)," % read_width_b)
	print("        .WRITE_WIDTH_A(%d)," % write_width_a)
	print("        .WRITE_WIDTH_B(%d)," % write_width_b)
	print("        .WRITE_MODE_A(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
	print("        .WRITE_MODE_B(\"%s\")," % np.random.choice(["NO_CHANGE", "READ_FIRST", "WRITE_FIRST"]))
	print("        .CASCADE_ORDER_A(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
	print("        .CASCADE_ORDER_B(\"%s\")," % np.random.choice(["NONE", "FIRST", "MIDDLE", "LAST"]))
	print("        .DOA_REG(%d)," % (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
	print("        .DOB_REG(%d),"% (0 if (write_width_b == 36 or read_width_a == 36) else np.random.randint(2)))
	print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
	print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
	print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
	print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
	print("        .RSTREG_PRIORITY_A(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
	print("        .RSTREG_PRIORITY_B(\"%s\")," % np.random.choice(["RSTREG", "REGCE"]))
	print("        .SLEEP_ASYNC(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
	for pin in ("CLKARDCLK", "CLKBWRCLK", "ENARDEN", "ENBWREN", "RSTRAMARSTRAM", "RSTRAMB", "RSTREGARSTREG", "RSTREGB"):
		print("        .IS_%s_INVERTED(%d)," % (pin, np.random.randint(2)))
	print("        .INIT_A(18'd%d)," % np.random.randint(2**18))
	print("        .INIT_B(18'd%d)," % np.random.randint(2**18))
	print("        .SRVAL_A(18'd%d)," % np.random.randint(2**18))
	print("        .SRVAL_B(18'd%d)" % np.random.randint(2**18))
	print("   ) ram%d (" % i)
	print("        .DINADIN(wdata[15:0]),")
	print("        .DINPADINP(wdata[17:16]),")
	douta_bit = np.random.randint(-1, 19)
	if douta_bit >= 0 and douta_bit < 16:	
		print("        .DOUTADOUT({int_d[%d][0]%s})," % (i, ", {%d{1'bx}}" % douta_bit if douta_bit > 0 else ""))
	if douta_bit >= 16:
		print("        .DOUTPADOUTP({int_d[%d][16]%s})," % (i, ", {%d{1'bx}}" % (douta_bit - 16) if douta_bit > 16 else ""))
	print("        .ADDRARDADDR(ra),")
	print("        .CLKARDCLK(clk),")
	print("        .ADDRENA(ena),")
	print("        .ENARDEN(ena),")
	print("        .REGCEAREGCE(cea),")
	print("        .RSTRAMARSTRAM(rst),")
	print("        .RSTREGARSTREG(rst),")
	print("        .WEA(%s)," % ("2'b00" if write_width_a == 0 else "we[1:0]"))
	print("        .DINBDIN(wdata[15:0]),")
	print("        .DINPBDINP(wdata[17:16]),")
	doutb_bit = np.random.randint(-1, 19)
	if doutb_bit >= 0 and doutb_bit < 16:	
		print("        .DOUTBDOUT({int_d[%d][18]%s})," % (i, ", {%d{1'bx}}" % doutb_bit if doutb_bit > 0 else ""))
	if doutb_bit >= 16:
		print("        .DOUTPBDOUTP({int_d[%d][34]%s})," % (i, ", {%d{1'bx}}" % (doutb_bit - 16) if doutb_bit > 16 else ""))
	print("        .ADDRBWRADDR(wa),")
	print("        .CLKBWRCLK(%s)," % ("clkb" if cd == "INDEPENDENT" else "clk"))
	print("        .ENBWREN(enb),")
	print("        .ADDRENB(enb),")
	print("        .REGCEB(ceb),")
	print("        .RSTRAMB(rst),")
	print("        .RSTREGB(rst),")
	print("        .WEBWE(%s)" % ("2'b00" if write_width_b == 0 else ("we[3:0]" if write_width_b == 36 else "we[3:2]")))
	print("   );")
	print()
print("endmodule")