# 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 [14:0] ra, wa, input [7:0] we, input [17:0] wdata, input [10:0] sel, output [35:0] rdata);"
)
N = 300
print("    wire [71:0] int_d[0:%d-1];" % N)
print("    assign rdata = int_d[sel[10:2]][18 * sel[1:0] +: 18];")
for i in range(N):
    write_width_b = np.random.choice([0, 1, 2, 4, 9, 18, 36, 72])
    read_width_a = np.random.choice(
        [0, 1, 2, 4, 9, 18, 36, 72],
        p=[0.05, 0.1, 0.1, 0.1, 0.05, 0.05, 0.45, 0.1])
    write_width_a = 0 if (write_width_b == 72
                          or read_width_a == 72) else np.random.choice(
                              [0, 1, 2, 4, 9, 18, 36])
    read_width_b = 0 if (
        write_width_b == 72 or read_width_a == 72) else np.random.choice(
            [0, 1, 2, 4, 9, 18, 36], p=[0.05, 0.1, 0.1, 0.1, 0.1, 0.1, 0.45])
    cd = np.random.choice(["INDEPENDENT", "COMMON"])

    print("    RAMB36E2 #(")
    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 == 72 or read_width_a == 72)
                                   else np.random.randint(2)))
    print(
        "        .DOB_REG(%d)," % (0 if
                                   (write_width_b == 72 or read_width_a == 72)
                                   else np.random.randint(2)))
    print("        .ENADDRENA(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
    print("        .ENADDRENB(\"%s\")," % np.random.choice(["FALSE", "TRUE"]))
    print("        .EN_ECC_PIPE(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
                                                             p=[0.9, 0.1]))
    print("        .EN_ECC_READ(\"%s\")," % np.random.choice(["FALSE", "TRUE"],
                                                             p=[0.9, 0.1]))
    print("        .EN_ECC_WRITE(\"%s\")," % np.random.choice(
        ["FALSE", "TRUE"], p=[0.9, 0.1]))
    print("        .RDADDRCHANGEA(\"%s\")," % np.random.choice(
        ["FALSE", "TRUE"]))
    print("        .RDADDRCHANGEB(\"%s\")," % np.random.choice(
        ["FALSE", "TRUE"]))
    print(
        "        .SLEEP_ASYNC(\"%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"]))
    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, 18'd%d})," % (np.random.randint(2**18),
                                                  np.random.randint(2**18)))
    print("        .INIT_B({18'd%d, 18'd%d})," % (np.random.randint(2**18),
                                                  np.random.randint(2**18)))
    print("        .SRVAL_A({18'd%d, 18'd%d})," % (np.random.randint(2**18),
                                                   np.random.randint(2**18)))
    print("        .SRVAL_B({18'd%d, 18'd%d})" % (np.random.randint(2**18),
                                                  np.random.randint(2**18)))
    print("   ) ram%d (" % i)
    print("        .DINADIN({wdata[15:0], wdata[15:0]}),")
    print("        .DINPADINP({wdata[17:16], wdata[17:16]}),")
    douta_bit = np.random.randint(-1, 37)
    if douta_bit >= 0 and douta_bit < 32:
        print("        .DOUTADOUT({int_d[%d][0]%s})," %
              (i, ", {%d{1'bx}}" % douta_bit if douta_bit > 0 else ""))
    if douta_bit >= 32:
        print("        .DOUTPADOUTP({int_d[%d][32]%s})," %
              (i, ", {%d{1'bx}}" % (douta_bit - 32) if douta_bit > 32 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)," % ("4'b00" if write_width_a == 0 else "we[3:0]"))
    print("        .DINBDIN({wdata[15:0], wdata[15:0]}),")
    print("        .DINPBDINP({wdata[17:16], wdata[17:16]}),")
    doutb_bit = np.random.randint(-1, 37)
    if doutb_bit >= 0 and doutb_bit < 32:
        print("        .DOUTBDOUT({int_d[%d][36]%s})," %
              (i, ", {%d{1'bx}}" % doutb_bit if doutb_bit > 0 else ""))
    if doutb_bit >= 32:
        print("        .DOUTPBDOUTP({int_d[%d][68]%s})," %
              (i, ", {%d{1'bx}}" % (doutb_bit - 32) if doutb_bit > 32 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)" %
          ("4'b00" if write_width_b == 0 else
           ("we[7:0]" if write_width_b == 72 else "we[7:4]")))
    print("   );")
    print()
print("endmodule")
