|  | #!/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.db import Database | 
|  | from prjxray import util | 
|  | from prjxray import verilog | 
|  |  | 
|  |  | 
|  | def gen_bram36(grid): | 
|  | for tile_name in grid.tiles(): | 
|  | loc = grid.loc_of_tilename(tile_name) | 
|  |  | 
|  | gridinfo = grid.gridinfo_at_loc(loc) | 
|  |  | 
|  | found = False | 
|  | for site_name, site_type in gridinfo.sites.items(): | 
|  | if site_type == 'RAMBFIFO36E1': | 
|  | found = True | 
|  | break | 
|  |  | 
|  | if found: | 
|  | bram36_site_name = site_name | 
|  | for site_name, site_type in gridinfo.sites.items(): | 
|  | if site_type == 'RAMB18E1': | 
|  | bram18_site_name = site_name | 
|  |  | 
|  | if site_type == 'FIFO18E1': | 
|  | fifo18_site_name = site_name | 
|  |  | 
|  | yield tile_name, bram36_site_name, bram18_site_name, fifo18_site_name | 
|  |  | 
|  |  | 
|  | RAM_EXTENSION_OPTS = [ | 
|  | "NONE", | 
|  | "LOWER", | 
|  | "UPPER", | 
|  | ] | 
|  |  | 
|  | BRAM36_WIDTHS = [1, 2] | 
|  | BRAM36_TO_18_WIDTHS = {1: 1, 2: 1} | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | db = Database(util.get_db_root(), util.get_part()) | 
|  | grid = db.grid() | 
|  |  | 
|  | print(''' | 
|  | module top(); | 
|  | ''') | 
|  |  | 
|  | params = [] | 
|  | for tile_name, bram36_site_name, bram18_site_name, fifo18_site_name in gen_bram36( | 
|  | grid): | 
|  | bram36_ra_width = random.choice(BRAM36_WIDTHS) | 
|  | bram36_wa_width = random.choice(BRAM36_WIDTHS) | 
|  | bram36_rb_width = random.choice(BRAM36_WIDTHS) | 
|  | bram36_wb_width = random.choice(BRAM36_WIDTHS) | 
|  |  | 
|  | bram18_ra_width = BRAM36_TO_18_WIDTHS[bram36_ra_width] | 
|  | bram18_wa_width = BRAM36_TO_18_WIDTHS[bram36_wa_width] | 
|  | bram18_rb_width = BRAM36_TO_18_WIDTHS[bram36_rb_width] | 
|  | bram18_wb_width = BRAM36_TO_18_WIDTHS[bram36_wb_width] | 
|  |  | 
|  | if random.random() < .8: | 
|  | if bram36_ra_width == 1 and bram36_wa_width == 1: | 
|  | ram_extension_a = random.choice(RAM_EXTENSION_OPTS) | 
|  | else: | 
|  | ram_extension_a = 'NONE' | 
|  |  | 
|  | if bram36_rb_width == 1 and bram36_wb_width == 1: | 
|  | ram_extension_b = random.choice(RAM_EXTENSION_OPTS) | 
|  | else: | 
|  | ram_extension_b = 'NONE' | 
|  |  | 
|  | en_ecc_read = random.randint(0, 1) | 
|  | en_ecc_write = random.randint(0, 1) | 
|  |  | 
|  | print( | 
|  | ''' | 
|  | (* KEEP, DONT_TOUCH, LOC = "{site}" *) | 
|  | RAMB36E1 #( | 
|  | .READ_WIDTH_A({bram36_ra_width}), | 
|  | .WRITE_WIDTH_A({bram36_wa_width}), | 
|  | .READ_WIDTH_B({bram36_rb_width}), | 
|  | .WRITE_WIDTH_B({bram36_wb_width}), | 
|  | .RAM_EXTENSION_A({ram_extension_a}), | 
|  | .RAM_EXTENSION_B({ram_extension_b}), | 
|  | .EN_ECC_READ({en_ecc_read}), | 
|  | .EN_ECC_WRITE({en_ecc_write}) | 
|  | ) bram_{site} ( | 
|  | .CLKARDCLK(), | 
|  | .CLKBWRCLK(), | 
|  | .ENARDEN(), | 
|  | .ENBWREN(), | 
|  | .REGCEAREGCE(), | 
|  | .REGCEB(), | 
|  | .RSTRAMARSTRAM(), | 
|  | .RSTRAMB(), | 
|  | .RSTREGARSTREG(), | 
|  | .RSTREGB(), | 
|  | .ADDRARDADDR(), | 
|  | .ADDRBWRADDR(), | 
|  | .DIADI(), | 
|  | .DIBDI(), | 
|  | .DIPADIP(), | 
|  | .DIPBDIP(), | 
|  | .WEA(), | 
|  | .WEBWE(), | 
|  | .DOADO(), | 
|  | .DOBDO(), | 
|  | .DOPADOP(), | 
|  | .DOPBDOP()); | 
|  | '''.format( | 
|  | site=bram36_site_name, | 
|  | ram_extension_a=verilog.quote(ram_extension_a), | 
|  | ram_extension_b=verilog.quote(ram_extension_b), | 
|  | en_ecc_read=en_ecc_read, | 
|  | en_ecc_write=en_ecc_write, | 
|  | bram36_ra_width=bram36_ra_width, | 
|  | bram36_wa_width=bram36_wa_width, | 
|  | bram36_rb_width=bram36_rb_width, | 
|  | bram36_wb_width=bram36_wb_width, | 
|  | )) | 
|  |  | 
|  | params.append( | 
|  | { | 
|  | 'tile': tile_name, | 
|  | 'BRAM36_IN_USE': True, | 
|  | 'site': bram36_site_name, | 
|  | 'RAM_EXTENSION_A': ram_extension_a, | 
|  | 'RAM_EXTENSION_B': ram_extension_b, | 
|  | 'EN_ECC_READ': en_ecc_read, | 
|  | 'EN_ECC_WRITE': en_ecc_write, | 
|  | 'bram36_ra_width': bram36_ra_width, | 
|  | 'bram36_wa_width': bram36_wa_width, | 
|  | 'bram36_rb_width': bram36_rb_width, | 
|  | 'bram36_wb_width': bram36_wb_width, | 
|  | }) | 
|  | else: | 
|  | print( | 
|  | ''' | 
|  | (* KEEP, DONT_TOUCH, LOC = "{bram18}" *) | 
|  | RAMB18E1 #( | 
|  | .READ_WIDTH_A({bram18_ra_width}), | 
|  | .WRITE_WIDTH_A({bram18_wa_width}), | 
|  | .READ_WIDTH_B({bram18_rb_width}), | 
|  | .WRITE_WIDTH_B({bram18_wb_width}) | 
|  | ) bram_{bram18} ( | 
|  | .CLKARDCLK(), | 
|  | .CLKBWRCLK(), | 
|  | .ENARDEN(), | 
|  | .ENBWREN(), | 
|  | .REGCEAREGCE(), | 
|  | .REGCEB(), | 
|  | .RSTRAMARSTRAM(), | 
|  | .RSTRAMB(), | 
|  | .RSTREGARSTREG(), | 
|  | .RSTREGB(), | 
|  | .ADDRARDADDR(), | 
|  | .ADDRBWRADDR(), | 
|  | .DIADI(), | 
|  | .DIBDI(), | 
|  | .DIPADIP(), | 
|  | .DIPBDIP(), | 
|  | .WEA(), | 
|  | .WEBWE(), | 
|  | .DOADO(), | 
|  | .DOBDO(), | 
|  | .DOPADOP(), | 
|  | .DOPBDOP()); | 
|  |  | 
|  | (* KEEP, DONT_TOUCH, LOC = "{fifo18}" *) | 
|  | RAMB18E1 #( | 
|  | .READ_WIDTH_A({bram18_ra_width}), | 
|  | .WRITE_WIDTH_A({bram18_wa_width}), | 
|  | .READ_WIDTH_B({bram18_rb_width}), | 
|  | .WRITE_WIDTH_B({bram18_wb_width}) | 
|  | ) bram_{fifo18} ( | 
|  | .CLKARDCLK(), | 
|  | .CLKBWRCLK(), | 
|  | .ENARDEN(), | 
|  | .ENBWREN(), | 
|  | .REGCEAREGCE(), | 
|  | .REGCEB(), | 
|  | .RSTRAMARSTRAM(), | 
|  | .RSTRAMB(), | 
|  | .RSTREGARSTREG(), | 
|  | .RSTREGB(), | 
|  | .ADDRARDADDR(), | 
|  | .ADDRBWRADDR(), | 
|  | .DIADI(), | 
|  | .DIBDI(), | 
|  | .DIPADIP(), | 
|  | .DIPBDIP(), | 
|  | .WEA(), | 
|  | .WEBWE(), | 
|  | .DOADO(), | 
|  | .DOBDO(), | 
|  | .DOPADOP(), | 
|  | .DOPBDOP()); | 
|  | '''.format( | 
|  | bram18=bram18_site_name, | 
|  | fifo18=fifo18_site_name, | 
|  | bram18_ra_width=bram18_ra_width, | 
|  | bram18_wa_width=bram18_wa_width, | 
|  | bram18_rb_width=bram18_rb_width, | 
|  | bram18_wb_width=bram18_wb_width, | 
|  | )) | 
|  |  | 
|  | params.append( | 
|  | { | 
|  | 'tile': tile_name, | 
|  | 'BRAM36_IN_USE': False, | 
|  | 'site': bram36_site_name, | 
|  | 'bram36_ra_width': bram36_ra_width, | 
|  | 'bram36_wa_width': bram36_wa_width, | 
|  | 'bram36_rb_width': bram36_rb_width, | 
|  | 'bram36_wb_width': bram36_wb_width, | 
|  | }) | 
|  |  | 
|  | print("endmodule") | 
|  |  | 
|  | with open('params.json', 'w') as f: | 
|  | json.dump(params, f, indent=2) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |