blob: 2392de2ca90544134794b08620f63fd6b7c93850 [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
X = 8
N = 200
root = sys.argv[2]
def random_vector(size):
return "{%s}" % ", ".join(["d[%d]" % np.random.randint(12) for k in range(size)])
for x in range(X):
with open(root + "/dsp2/dsp_b%d.v" % x, "w") as f:
print("module top(input [7:0] clk, cen, rst, input [11:0] d, input [7:0] sel, output [63:0] q);", file=f)
print(" wire [8:0] r = {1'b0, rst}, e = {1'b1, cen};", file=f)
print(" wire [63:0] int_q[0:%d];" % (N-1), file=f)
print(" assign q = int_q[sel];", file=f)
for i in range(N):
use_preadd = np.random.choice([False, True])
bmultsel = (np.random.choice(["AD", "B"]) if use_preadd else "B")
amultsel = (np.random.choice(["AD", "A"]) if use_preadd and bmultsel == "AD" else ("AD" if use_preadd else "A"))
use_patdet = np.random.choice([False, True])
print(" (* keep, dont_touch *) DSP48E2 #(", file=f)
print(" .ADREG(%d)," % (np.random.randint(2) if use_preadd else 0), file=f)
print(" .ALUMODEREG(%d)," % np.random.randint(2), file=f)
print(" .AMULTSEL(\"%s\")," % amultsel, file=f)
print(" .AREG(%d)," % np.random.randint(3), file=f)
print(" .AUTORESET_PATDET(\"%s\")," % np.random.choice(["NO_RESET", "RESET_MATCH", "RESET_NOT_MATCH"]), file=f)
print(" .AUTORESET_PRIORITY(\"%s\")," % np.random.choice(["RESET", "CEP"]), file=f)
print(" .A_INPUT(\"DIRECT\"),", file=f)
print(" .BMULTSEL(\"%s\")," % bmultsel,file=f)
print(" .BREG(%d)," % np.random.randint(3), file=f)
print(" .B_INPUT(\"DIRECT\"),", file=f)
print(" .CARRYINREG(%d)," % np.random.randint(2), file=f)
print(" .CARRYINSELREG(%d)," % np.random.randint(2), file=f)
print(" .CREG(%d)," % np.random.randint(2), file=f)
print(" .DREG(%d)," % np.random.randint(2), file=f)
print(" .INMODEREG(%d)," % np.random.randint(2), file=f)
print(" .IS_ALUMODE_INVERTED(%d)," % np.random.randint(16), file=f)
print(" .IS_CARRYIN_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_CLK_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_INMODE_INVERTED(%d)," % np.random.randint(32), file=f)
print(" .IS_OPMODE_INVERTED(%d)," % np.random.randint(512), file=f)
print(" .IS_RSTALLCARRYIN_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTALUMODE_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTA_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTB_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTCTRL_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTC_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTD_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTINMODE_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTM_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .IS_RSTP_INVERTED(%d)," % np.random.randint(2), file=f)
print(" .MASK({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
print(" .MREG(%d)," % np.random.randint(2), file=f)
print(" .OPMODEREG(%d)," % np.random.randint(2), file=f)
print(" .PATTERN({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
print(" .PREADDINSEL(\"%s\")," % np.random.choice(["A", "B"]), file=f)
print(" .PREG(%d)," % np.random.randint(2), file=f)
print(" .RND({24'd%d, 24'd%d})," % (np.random.randint(2**24), np.random.randint(2**24)), file=f)
print(" .SEL_MASK(\"%s\")," % np.random.choice(["MASK", "C", "ROUNDING_MODE1", "ROUNDING_MODE2"]), file=f)
print(" .SEL_PATTERN(\"%s\")," % np.random.choice(["PATTERN", "C"]), file=f)
print(" .USE_PATTERN_DETECT(\"%s\")," % ("PATDET" if use_patdet else "NO_PATDET"), file=f)
print(" .USE_SIMD(\"%s\")," % np.random.choice(["ONE48", "TWO24", "FOUR12"]), file=f)
print(" .USE_WIDEXOR(\"%s\")," % np.random.choice(["TRUE", "FALSE"]), file=f)
print(" .XORSIMD(\"%s\")" % np.random.choice(["XOR12", "XOR24_48_96"]), file=f)
print(" ) dsp_%d (" % i, file=f)
print(" .A(%s)," % random_vector(30), file=f)
print(" .ALUMODE(%s)," % random_vector(4), file=f)
print(" .B(%s)," % random_vector(18), file=f)
#print(" .C(%s)," % random_vector(48), file=f)
print(" .CARRYIN(%s)," % random_vector(1), file=f)
print(" .CEA1(e[%d])," % np.random.randint(9), file=f)
print(" .CEA2(e[%d])," % np.random.randint(9), file=f)
print(" .CEAD(e[%d])," % np.random.randint(9), file=f)
print(" .CEALUMODE(e[%d])," % np.random.randint(9), file=f)
print(" .CEC(e[%d])," % np.random.randint(9), file=f)
print(" .CECARRYIN(e[%d])," % np.random.randint(9), file=f)
print(" .CECTRL(e[%d])," % np.random.randint(9), file=f)
print(" .CED(e[%d])," % np.random.randint(9), file=f)
print(" .CEINMODE(e[%d])," % np.random.randint(9), file=f)
print(" .CEM(e[%d])," % np.random.randint(9), file=f)
print(" .CEP(e[%d])," % np.random.randint(9), file=f)
#print(" .D(%s)," % random_vector(27), file=f)
print(" .INMODE(%s)," % random_vector(5), file=f)
print(" .OPMODE(%s)," % random_vector(9), file=f)
print(" .RSTA(r[%d])," % np.random.randint(9), file=f)
print(" .RSTALLCARRYIN(r[%d])," % np.random.randint(9), file=f)
print(" .RSTALUMODE(r[%d])," % np.random.randint(9), file=f)
print(" .RSTB(r[%d])," % np.random.randint(9), file=f)
print(" .RSTC(r[%d])," % np.random.randint(9), file=f)
print(" .RSTCTRL(r[%d])," % np.random.randint(9), file=f)
print(" .RSTD(r[%d])," % np.random.randint(9), file=f)
print(" .RSTINMODE(r[%d])," % np.random.randint(9), file=f)
print(" .RSTM(r[%d])," % np.random.randint(9), file=f)
print(" .RSTP(r[%d])," % np.random.randint(9), file=f)
o_bit = np.random.randint(-1, 64)
if o_bit >= 0 and o_bit < 48:
print(" .P({int_q[%d][0]%s})," % (i, ", {%d{1'bx}}" % o_bit if o_bit > 0 else ""), file=f)
if o_bit >= 48 and o_bit < 52:
print(" .CARRYOUT({int_q[%d][48]%s})," % (i, ", {%d{1'bx}}" % (o_bit-48) if o_bit > 48 else ""), file=f)
if o_bit >= 52 and o_bit < 60:
print(" .XOROUT({int_q[%d][52]%s})," % (i, ", {%d{1'bx}}" % (o_bit-52) if o_bit > 52 else ""), file=f)
if o_bit == 60:
print(" .PATTERNDETECT(int_q[%d][60])," % i, file=f)
if o_bit == 61:
print(" .PATTERNBDETECT(int_q[%d][61])," % i, file=f)
if o_bit == 62:
print(" .OVERFLOW(int_q[%d][62])," % i, file=f)
if o_bit == 63:
print(" .UNDERFLOW(int_q[%d][63])," % i, file=f)
print(" .CLK(clk[%d])" % np.random.randint(8), file=f)
print(" );", file=f)
print("", file=f)
print("endmodule", file=f)
with open(root + "/dsp2/dsp_b%d.tcl" % x, "w") as f:
print("add_files %s" % (root + ("/dsp2/dsp_b%d.v" % x)), file=f)
print("synth_design -top top -part xczu7ev-ffvc1156-2-e", file=f)
print("opt_design", file=f)
print("place_design", file=f)
print("route_design", file=f)
print("set_property SEVERITY {Warning} [get_drc_checks NSTD-1]", file=f)
print("set_property SEVERITY {Warning} [get_drc_checks UCIO-1]", file=f)
print("set_property SEVERITY {Warning} [get_drc_checks AVAL-*]", file=f)
print("set_property SEVERITY {Warning} [get_drc_checks REQP-*]", file=f)
print("set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design]", file=f)
print("write_checkpoint -force %s/specimen_bram/dsp_b%d.dcp" % (root, x), file=f)
print("write_edif -force %s/specimen_bram/dsp_b%d.edf" % (root, x), file=f)
print("write_bitstream -force %s/specimen_bram/dsp_b%d.bit" % (root, x), file=f)
with open(root + "/dsp2/run.sh", "w") as f:
print("#/usr/bin/env bash", file=f)
#print("set -ex", file=f)
for x in range(X):
print("vivado -mode batch -nolog -nojournal -source dsp_b%d.tcl" % x, file=f)
print("if [ $? -eq 0 ]; then", file=f)
print(" ../../ultra/tools/dump_bitstream %s/specimen_bram/dsp_b%d.bit %s/frames.txt > %s/specimen_bram/dsp_b%d.dump" % (root, x, root, root, x), file=f)
print(" python3 ../../ultra/tools/bits_to_tiles.py %s/tile.json %s/specimen_bram/dsp_b%d.dump > %s/specimen_bram/dsp_b%d.tbits" % (root, root, x, root, x), file=f)
print("else", file=f)
print(" rm %s/specimen_bram/dsp_b%d.dump" % (root, x), file=f)
print(" rm %s/specimen_bram/dsp_b%d.tbits" % (root, x), file=f)
print(" rm %s/specimen_bram/dsp_b%d.dcp" % (root, x), file=f)
print(" rm %s/specimen_bram/dsp_b%d.bit" % (root, x), file=f)
print(" rm %s/specimen_bram/dsp_b%d.features" % (root, x), file=f)
print("fi", file=f)