import random random.seed(0) import os import re from prims import * def slice_xy(): '''Return (X1, X2), (Y1, Y2) from XRAY_ROI, exclusive end (for xrange)''' # SLICE_X12Y100:SLICE_X27Y149 # Note XRAY_ROI_GRID_* is something else m = re.match( r'SLICE_X([0-9]*)Y([0-9]*):SLICE_X([0-9]*)Y([0-9]*)', os.getenv('XRAY_ROI')) ms = [int(m.group(i + 1)) for i in range(4)] return ((ms[0], ms[2] + 1), (ms[1], ms[3] + 1)) CLBN = 600 SLICEX, SLICEY = slice_xy() # 800 SLICEN = (SLICEY[1] - SLICEY[0]) * (SLICEX[1] - SLICEX[0]) print('//SLICEX: %s' % str(SLICEX)) print('//SLICEY: %s' % str(SLICEY)) print('//SLICEN: %s' % str(SLICEN)) print('//Requested CLBs: %s' % str(CLBN)) f = open("top.txt", "w") f.write("i,prim,loc,bel,init\n") def gen_slices(): for slicey in range(*SLICEY): for slicex in range(*SLICEX): yield "SLICE_X%dY%d" % (slicex, slicey) DIN_N = CLBN * 4 DOUT_N = CLBN * 1 print( ''' module top(input clk, stb, di, output do); localparam integer DIN_N = %d; localparam integer DOUT_N = %d; reg [DIN_N-1:0] din; wire [DOUT_N-1:0] dout; reg [DIN_N-1:0] din_shr; reg [DOUT_N-1:0] dout_shr; always @(posedge clk) begin din_shr <= {din_shr, di}; dout_shr <= {dout_shr, din_shr[DIN_N-1]}; if (stb) begin din <= din_shr; dout_shr <= dout; end end assign do = dout_shr[DOUT_N-1]; roi roi ( .clk(clk), .din(din), .dout(dout) ); endmodule ''' % (DIN_N, DOUT_N)) slices = gen_slices() print( 'module roi(input clk, input [%d:0] din, output [%d:0] dout);' % (DIN_N - 1, DOUT_N - 1)) for i in range(CLBN): ffprim = random.choice(ones(ffprims)) # clb_FD clb_FD (.clk(clk), .din(din[ 0 +: 4]), .dout(dout[ 0])); # clb_FD_1 clb_FD_1 (.clk(clk), .din(din[ 4 +: 4]), .dout(dout[ 1])); loc = next(slices) # Latch can't go in 5s if isff(ffprim): bel = random.choice(ff_bels) else: bel = random.choice(ff_bels_ffl) init = random.choice((0, 1)) #bel = "AFF" print(' clb_%s' % ffprim) print( ' #(.LOC("%s"), .BEL("%s"), .INIT(%d))' % (loc, bel, init)) print( ' clb_%d (.clk(clk), .din(din[ %d +: 4]), .dout(dout[ %d]));' % (i, 4 * i, 1 * i)) f.write("%d,%s,%s,%s,%d\n" % (i, ffprim, loc, bel, init)) print( '''endmodule // --------------------------------------------------------------------- ''') print( ''' module clb_FD (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y100"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FD ff ( .C(clk), .Q(dout), .D(din[0]) ); endmodule module clb_FD_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y101"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FD_1 ff ( .C(clk), .Q(dout), .D(din[0]) ); endmodule module clb_FDC (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y102"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDC ff ( .C(clk), .Q(dout), .CLR(din[0]), .D(din[1]) ); endmodule module clb_FDC_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y103"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDC_1 ff ( .C(clk), .Q(dout), .CLR(din[0]), .D(din[1]) ); endmodule module clb_FDCE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y104"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDCE ff ( .C(clk), .Q(dout), .CE(din[0]), .CLR(din[1]), .D(din[2]) ); endmodule module clb_FDCE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y105"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDCE_1 ff ( .C(clk), .Q(dout), .CE(din[0]), .CLR(din[1]), .D(din[2]) ); endmodule module clb_FDE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y106"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDE ff ( .C(clk), .Q(dout), .D(din[0]), .CE(din[1]) ); endmodule module clb_FDE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y107"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDE_1 ff ( .C(clk), .Q(dout), .D(din[0]), .CE(din[1]) ); endmodule module clb_FDP (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y108"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDP ff ( .C(clk), .Q(dout), .D(din[0]), .PRE(din[1]) ); endmodule module clb_FDP_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y109"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDP_1 ff ( .C(clk), .Q(dout), .D(din[0]), .PRE(din[1]) ); endmodule module clb_FDPE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y110"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDPE ff ( .C(clk), .Q(dout), .CE(din[0]), .PRE(din[1]), .D(din[2]) ); endmodule module clb_FDPE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y111"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDPE_1 ff ( .C(clk), .Q(dout), .CE(din[0]), .PRE(din[1]), .D(din[2]) ); endmodule module clb_FDR (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y112"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDR ff ( .C(clk), .Q(dout), .D(din[0]), .R(din[1]) ); endmodule module clb_FDR_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y113"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDR_1 ff ( .C(clk), .Q(dout), .D(din[0]), .R(din[1]) ); endmodule module clb_FDRE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y114"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDRE ff ( .C(clk), .Q(dout), .CE(din[0]), .R(din[1]), .D(din[2]) ); endmodule module clb_FDRE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y115"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDRE_1 ff ( .C(clk), .Q(dout), .CE(din[0]), .R(din[1]), .D(din[2]) ); endmodule module clb_FDS (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y116"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDS ff ( .C(clk), .Q(dout), .S(din[0]), .D(din[1]) ); endmodule module clb_FDS_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y117"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDS_1 ff ( .C(clk), .Q(dout), .S(din[0]), .D(din[1]) ); endmodule module clb_FDSE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y118"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDSE ff ( .C(clk), .Q(dout), .CE(din[0]), .S(din[1]), .D(din[2]) ); endmodule module clb_FDSE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y119"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) FDSE_1 ff ( .C(clk), .Q(dout), .CE(din[0]), .S(din[1]), .D(din[2]) ); endmodule //******************************************************************************** module clb_LDC (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y120"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDC ff ( .G(~clk), .Q(dout), .D(din[0]), .CLR(din[1]) ); endmodule module clb_LDC_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y121"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDC_1 ff ( .G(~clk), .Q(dout), .D(din[0]), .CLR(din[1]) ); endmodule module clb_LDCE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y122"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDCE ff ( .G(~clk), //NOTE: diagram shows two outputs. Error? .Q(dout), .D(din[0]), .GE(din[1]), .CLR(din[2]) ); endmodule module clb_LDCE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y123"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDCE_1 ff ( .G(~clk), //NOTE: diagram shows two outputs. Error? .Q(dout), .D(din[0]), .GE(din[1]), .CLR(din[2]) ); endmodule module clb_LDE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y124"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDE ff ( .G(~clk), .Q(dout), .D(din[0]), .GE(din[1]) ); endmodule module clb_LDE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y125"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDE_1 ff ( .G(~clk), .Q(dout), .D(din[0]), .GE(din[1]) ); endmodule module clb_LDP (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y126"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDP ff ( .G(~clk), .Q(dout), .D(din[0]), .PRE(din[1]) ); endmodule module clb_LDP_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y127"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDP_1 ff ( .G(~clk), .Q(dout), .D(din[0]), .PRE(din[1]) ); endmodule module clb_LDPE (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y128"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDPE ff ( .G(~clk), .Q(dout), .PRE(din[0]), .D(din[1]), .GE(din[2]) ); endmodule module clb_LDPE_1 (input clk, input [3:0] din, output dout); parameter LOC="SLICE_X16Y129"; parameter BEL="AFF"; parameter INIT=1'b0; (* LOC=LOC, BEL=BEL, KEEP, DONT_TOUCH, INIT=INIT *) LDPE_1 ff ( .G(~clk), .Q(dout), .PRE(din[0]), .D(din[1]), .GE(din[2]) ); endmodule ''')