blob: ce6f46d6e347b70b9a8a64e8a6aa064c4ede3fb6 [file] [log] [blame] [edit]
# 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
print("module top(input [15:0] clk, sr, ce, input [7:0] d, output [31:0] q);")
N = 500
D = ["d[%d]" % i for i in range(8)]
slices = []
with open(sys.argv[1], "r") as tf:
for line in tf:
sl = line.strip().split(",")
if len(sl) < 4:
continue
for site in sl[4:]:
if "SLICEM" in site or "SLICEL" in site:
slices.append(site.split(":")[0])
np.random.shuffle(slices)
for i in range(N):
sl = slices.pop()
ffmode = np.random.randint(3, size=2)
clk = tuple(np.random.randint(16, size=2))
sr = tuple(["1'b1" if y >= 16 else "sr[%d]" % y for y in np.random.randint(25, size=2)])
ce = tuple(["1'b1" if y >= 16 else "ce[%d]" % y for y in np.random.randint(25, size=4)])
def random_fftype(mode):
if mode == 0:
return np.random.choice(["NONE", "FDSE", "FDRE"])
elif mode == 1:
return np.random.choice(["NONE", "FDPE", "FDCE"])
elif mode == 2:
return np.random.choice(["NONE", "LDPE", "LDCE"])
def random_bit():
return np.random.choice(D)
def random_data(width):
return "{%s}" % (", ".join([random_bit() for k in range(width)]))
fftypes = [random_fftype(ffmode[j // 8]) for j in range(16)]
print(' wire [31:0] d%d;' % i)
print(' ultra_slice_logic #(')
print(' .LOC("%s"),' % sl)
for lut in "ABCDEFGH":
print(" .%sLUT_INIT(64'b%s)," % (lut, "".join(str(_) for _ in np.random.randint(2, size=64))))
for j in range(16):
print(' .%sFF%s_TYPE("%s"),' % ("ABCDEFGH"[j//2], "2" if (j % 2) == 1 else "", fftypes[j]))
print(" .FF_INIT(16'b%s)," % "".join(str(_) for _ in np.random.randint(2, size=16)))
for j1 in "ABCDEFGH":
for j2 in ("1", "2"):
print(' .FFMUX%s%s("%s"),' % (j1, j2, np.random.choice(["F7F8", "D6", "D5", "BYP"])))
for j in "ABCDEFGH":
print(' .OUTMUX%s("%s"),' % (j, np.random.choice(["F7F8", "D6", "D5"])))
print(" .CLKINV(2'd%d)," % np.random.randint(4))
print(" .SRINV(2'd%d)" % np.random.randint(4))
print(' ) slice%d (' % i)
for j in range(1, 7):
print(" .A%d(%s)," % (j, random_data(8)))
print(" .I(%s)," % random_data(8))
print(" .X(%s)," % random_data(8))
print(" .CLK({clk[%d], clk[%d]})," % clk)
print(" .SR({%s, %s})," % sr)
print(" .CE({%s, %s, %s, %s})," % ce)
print(" .O(d%d[7:0])," % i)
print(" .Q(d%d[15:8])," % i)
print(" .Q2(d%d[23:16])," % i)
print(" .MUX(d%d[31:24])" % i)
print(' );')
print()
D.clear()
for j in range(8):
D.append("d%d[%d]" % (i, j))
D.append("d%d[%d]" % (i, 24 + j))
if fftypes[2 * j] != "NONE":
D.append("d%d[%d]" % (i, 8 + j))
if fftypes[2 * j + 1] != "NONE":
D.append("d%d[%d]" % (i, 16 + j))
print(" assign q = d%d;" % (N-1))
print("endmodule")