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