| #!/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() |