| #!/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 |
| import random |
| import json |
| random.seed(int(os.getenv("SEED"), 16)) |
| from prjxray import util |
| from prjxray import verilog |
| from prjxray.db import Database |
| |
| |
| def gen_sites(): |
| db = Database(util.get_db_root(), util.get_part()) |
| grid = db.grid() |
| for tile in sorted(grid.tiles()): |
| loc = grid.loc_of_tilename(tile) |
| gridinfo = grid.gridinfo_at_loc(loc) |
| if gridinfo.tile_type in ['DSP_L', 'DSP_R']: |
| for site in sorted(gridinfo.sites.keys()): |
| if gridinfo.sites[site] == 'DSP48E1': |
| yield tile, site |
| |
| |
| def fuzz(*args): |
| if len(args) == 1 and isinstance(args[0], int): |
| # Argument indicates that we should generate a random integer with |
| # args[0] number of bits. |
| return random.getrandbits(args[0]) |
| else: |
| # Otherwise make a random choice |
| return random.choice(*args) |
| |
| |
| def run(): |
| verilog.top_harness(48, 48) |
| |
| print('module roi(input clk, input [47:0] din, output [47:0] dout);') |
| |
| data = {} |
| data['instances'] = [] |
| |
| sites = list(gen_sites()) |
| |
| for i, (tile, site) in enumerate(sites): |
| synthesis = '(* KEEP, DONT_TOUCH, LOC = "%s" *)' % (site) |
| module = 'DSP48E1' |
| instance = 'INST_%s' % (site) |
| ports = {} |
| params = {} |
| |
| ports['A'] = '{30{1\'b1}}' |
| ports['ACIN'] = '{30{1\'b1}}' |
| ports['ACOUT'] = '30\'b0' |
| ports['ALUMODE'] = 'din[3:0]' |
| ports['B'] = '{18{1\'b1}}' |
| ports['BCIN'] = '{18{1\'b1}}' |
| ports['BCOUT'] = '18\'b0' |
| ports['C'] = '{48{1\'b1}}' |
| ports['CARRYCASCIN'] = '1\'b1' |
| ports['CARRYCASCOUT'] = '1\'b0' |
| ports['CARRYIN'] = 'din[4]' |
| ports['CARRYINSEL'] = '3\'b000' |
| ports['CARRYOUT'] = '4\'b0' |
| ports['CEA1'] = '1\'b1' |
| ports['CEA2'] = '1\'b1' |
| ports['CEAD'] = '1\'b1' |
| ports['CEALUMODE'] = '1\'b1' |
| ports['CEB1'] = '1\'b1' |
| ports['CEB2'] = '1\'b1' |
| ports['CEC'] = '1\'b1' |
| ports['CECARRYIN'] = '1\'b1' |
| ports['CECTRL'] = '1\'b1' |
| ports['CED'] = '1\'b1' |
| ports['CEINMODE'] = '1\'b1' |
| ports['CEM'] = '1\'b1' |
| ports['CEP'] = '1\'b1' |
| ports['CLK'] = 'clk' |
| ports['D'] = '{25{1\'b1}}' |
| ports['INMODE'] = 'din[9:5]' |
| #ports['MULTISIGNIN'] = '1\'b1' |
| #ports['MULTISIGNOUT'] = '1\'b0' |
| ports['OPMODE'] = 'din[16:10]' |
| ports['OVERFLOW'] = '1\'b0' |
| ports['P'] = '48\'b0' |
| ports['PATTERNBDETECT'] = '1\'b0' |
| ports['PATTERNDETECT'] = '1\'b0' |
| ports['PCIN'] = '{48{1\'b1}}' |
| ports['PCOUT'] = '48\'b0' |
| ports['RSTA'] = '1\'b1' |
| ports['RSTALLCARRYIN'] = '1\'b1' |
| ports['RSTALUMODE'] = '1\'b1' |
| ports['RSTB'] = '1\'b1' |
| ports['RSTC'] = '1\'b1' |
| ports['RSTCTRL'] = '1\'b1' |
| ports['RSTD'] = '1\'b1' |
| ports['RSTINMODE'] = '1\'b1' |
| ports['RSTM'] = '1\'b1' |
| ports['RSTP'] = '1\'b1' |
| ports['UNDERFLOW'] = '1\'b0' |
| |
| params['ADREG'] = fuzz((0, 1)) |
| params['ALUMODEREG'] = fuzz((0, 1)) |
| params['AREG'] = fuzz((0, 1, 2)) |
| if params['AREG'] == 0 or params['AREG'] == 1: |
| params['ACASCREG'] = params['AREG'] |
| else: |
| params['ACASCREG'] = fuzz((1, 2)) |
| params['BREG'] = fuzz((0, 1, 2)) |
| if params['BREG'] == 0 or params['BREG'] == 1: |
| params['BCASCREG'] = params['BREG'] |
| else: |
| params['BCASCREG'] = fuzz((1, 2)) |
| params['CARRYINREG'] = fuzz((0, 1)) |
| params['CARRYINSELREG'] = fuzz((0, 1)) |
| params['CREG'] = fuzz((0, 1)) |
| params['DREG'] = fuzz((0, 1)) |
| params['INMODEREG'] = fuzz((0, 1)) |
| params['OPMODEREG'] = fuzz((0, 1)) |
| params['PREG'] = fuzz((0, 1)) |
| params['A_INPUT'] = verilog.quote(fuzz(('DIRECT', 'CASCADE'))) |
| params['B_INPUT'] = verilog.quote(fuzz(('DIRECT', 'CASCADE'))) |
| params['USE_DPORT'] = verilog.quote(fuzz(('TRUE', 'FALSE'))) |
| params['USE_SIMD'] = verilog.quote(fuzz(('ONE48', 'TWO24', 'FOUR12'))) |
| params['USE_MULT'] = verilog.quote( |
| 'NONE' if params['USE_SIMD'] != verilog.quote('ONE48') else fuzz( |
| ('NONE', 'MULTIPLY', 'DYNAMIC'))) |
| params['MREG'] = 0 if params['USE_MULT'] == verilog.quote( |
| 'NONE') else fuzz((0, 1)) |
| params['AUTORESET_PATDET'] = verilog.quote( |
| fuzz(('NO_RESET', 'RESET_MATCH', 'RESET_NOT_MATCH'))) |
| params['MASK'] = '48\'d%s' % fuzz(48) |
| params['PATTERN'] = '48\'d%s' % fuzz(48) |
| params['SEL_MASK'] = verilog.quote( |
| fuzz(('MASK', 'C', 'ROUNDING_MODE1', 'ROUNDING_MODE2'))) |
| params['USE_PATTERN_DETECT'] = verilog.quote( |
| fuzz(('NO_PATDET', 'PATDET'))) |
| |
| params['IS_ALUMODE_INVERTED'] = fuzz(4) |
| params['IS_CARRYIN_INVERTED'] = fuzz((0, 1)) |
| params['IS_CLK_INVERTED'] = fuzz((0, 1)) |
| params['IS_INMODE_INVERTED'] = fuzz(5) |
| params['IS_OPMODE_INVERTED'] = fuzz(7) |
| |
| verilog.instance(synthesis + ' ' + module, instance, ports, params) |
| |
| params['TILE'] = tile |
| params['SITE'] = site |
| |
| data['instances'].append(params) |
| |
| with open('params.json', 'w') as fp: |
| json.dump(data, fp) |
| |
| print("endmodule") |
| |
| |
| if __name__ == '__main__': |
| run() |