| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| import os, random |
| random.seed(0) |
| from prjxray import util |
| from prjxray import verilog |
| |
| from prims import * |
| |
| # INCREMENT is the amount of additional CLBN to be instantiated in the design. |
| # This makes the fuzzer compilation more robust against failures. |
| INCREMENT = os.getenv('CLBN', 0) |
| CLBN = 600 + int(INCREMENT) |
| print('//Requested CLBs: %s' % str(CLBN)) |
| |
| f = open("top.txt", "w") |
| f.write("i,prim,loc,bel,init\n") |
| |
| |
| def gen_slices(): |
| for _tile_name, site_name, _site_type in util.get_roi().gen_sites([ |
| 'SLICEL', |
| 'SLICEM', |
| ]): |
| yield site_name |
| |
| |
| DIN_N = CLBN * 4 |
| DOUT_N = CLBN * 1 |
| |
| verilog.top_harness(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 |
| |
| ''') |