# 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 = 600
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("    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]),")
    print("        .DOUTADOUT(int_d[%d][15:0])," % i)
    print("        .DOUTPADOUTP(int_d[%d][17:16])," % i)
    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]),")
    print("        .DOUTBDOUT(int_d[%d][33:18])," % i)
    print("        .DOUTPBDOUTP(int_d[%d][35:34])," % i)
    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")
