# 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 [15:0] clk, cen, input [8:0] wa, input [7:0] ra, input [7:0] d, input [11:0] sel, output [3:0] q);"
)
N = 4096
print("    wire [3:0] int_d[0:%d-1];" % N)
print("    assign q = int_d[sel];")


def connect(sig, dst, len):
    if sig is None:
        return []
    bit = 0
    conns = []
    for x in sig:
        if type(x) is tuple:
            name, width = x
            conns.append(".%s(%s[%d +: %d])" % (name, dst, bit, width))
            bit += width
        else:
            conns.append(".%s(%s[%d])" % (x, dst, bit))
            bit += 1
    return conns


for i in range(N):
    ctype = np.random.choice([
        "SRL16E", "SRLC32E", "RAM32X1D", "RAM32X1S", "RAM64X1D", "RAM64X1S",
        "RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S", "RAM512X1S"
    ])
    clockport = None
    ceport = None
    wraddr = None
    rdaddr = None
    wdata = None
    rdata = None
    init_len = None
    if ctype in ("SRL16E", "SRLC32E"):
        clockport = "CLK"
        ceport = "CE"
        wdata = ["D"]
        rdata = ["Q"]
        if ctype == "SRLC32E":
            rdata.append("Q31")
            rdaddr = [("A", 5)]
            init_len = 32
        else:
            rdaddr = ["A0", "A1", "A2", "A3"]
            init_len = 16
    elif ctype in ("RAM32X1D", "RAM32X1S"):
        clockport = "WCLK"
        ceport = "WE"
        wdata = ["D"]
        wraddr = ["A0", "A1", "A2", "A3", "A4"]
        init_len = 32
        if ctype == "RAM32X1D":
            rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4"]
            rdata = ["SPO", "DPO"]
        else:
            rdata = ["O"]
    elif ctype in ("RAM64X1D", "RAM64X1S"):
        clockport = "WCLK"
        ceport = "WE"
        wdata = ["D"]
        wraddr = ["A0", "A1", "A2", "A3", "A4", "A5"]
        init_len = 64
        if ctype == "RAM64X1D":
            rdaddr = ["DPRA0", "DPRA1", "DPRA2", "DPRA3", "DPRA4", "DPRA5"]
            rdata = ["SPO", "DPO"]
        else:
            rdata = ["O"]
    elif ctype in ("RAM128X1S", "RAM128X1D", "RAM256X1D", "RAM256X1S",
                   "RAM512X1S"):
        init_len = int(ctype[3:6])
        abits = math.log2(init_len)
        clockport = "WCLK"
        ceport = "WE"
        wdata = ["D"]
        if ctype == "RAM128X1S":
            wraddr = ["A0", "A1", "A2", "A3", "A4", "A5", "A6"]
        else:
            wraddr = [("A", abits)]
        if ctype[-1] == "D":
            rdaddr = [("DPRA", abits)]
            rdata = ["SPO", "DPO"]
        else:
            rdata = ["O"]
    else:
        assert False, ctype
    conns = []
    if clockport is not None:
        conns.append(".%s(clk[%d])" % (clockport, np.random.randint(0, 16)))
    if ceport is not None:
        conns.append(".%s(cen[%d])" % (ceport, np.random.randint(0, 16)))
    conns += connect(wraddr, "wa", 9)
    conns += connect(rdaddr, "ra", 8)
    conns += connect(wdata, "d", 8)
    conns += connect(rdata, "int_d[%d]" % i, 4)
    print("    %s #(" % ctype)
    if init_len is not None:
        initdata = np.random.randint(2, size=init_len)
        print("        .INIT(%d'b%s)" % (init_len, "".join(
            [str(_) for _ in initdata])))
    print("    ) %s_%d (" % (ctype, i))
    print("    %s" % ",\n    ".join(conns))
    print("    );")
print("endmodule")
