| #!/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 |
| random.seed(int(os.getenv("SEED"), 16)) |
| from prjxray import util |
| from prjxray.db import Database |
| |
| |
| def gen_sites(): |
| db = Database(util.get_db_root(), util.get_part()) |
| grid = db.grid() |
| for tile_name in sorted(grid.tiles()): |
| loc = grid.loc_of_tilename(tile_name) |
| gridinfo = grid.gridinfo_at_loc(loc) |
| |
| if gridinfo.tile_type != 'CFG_CENTER_MID': |
| continue |
| |
| sites = {} |
| for site_name, site_type in gridinfo.sites.items(): |
| if site_type not in sites: |
| sites[site_type] = [] |
| sites[site_type].append(site_name) |
| |
| for site_type in sites: |
| sites[site_type].sort() |
| |
| int_grid_x = loc.grid_x + 3 |
| int_tile_type = 'INT_L' |
| |
| int_tile_locs = [] |
| for dy in range(-9, 12): |
| # Skip the VBREAK tile. |
| if dy != 6: |
| int_tile_locs.append((int_grid_x, loc.grid_y + dy), ) |
| |
| int_tiles = [] |
| for int_tile_loc in int_tile_locs: |
| int_gridinfo = grid.gridinfo_at_loc(int_tile_loc) |
| assert int_gridinfo.tile_type == int_tile_type, ( |
| int_gridinfo.tile_type, int_tile_type) |
| |
| int_tiles.append(grid.tilename_at_loc(int_tile_loc)) |
| |
| yield tile_name, sites, int_tiles |
| |
| |
| def write_params(params): |
| pinstr = 'tile,val\n' |
| for tile, (val) in sorted(params.items()): |
| pinstr += '%s,%s\n' % (tile, val) |
| open('params.csv', 'w').write(pinstr) |
| |
| |
| def run(): |
| print(''' |
| module top(); |
| ''') |
| |
| sites = list(gen_sites()) |
| |
| # Only on CFG_CENTER_MID expected. |
| assert len(sites) == 1 |
| tile_name, sites, int_tiles = sites[0] |
| |
| assert len(sites['ICAP']) == 2, len(sites['ICAP']) |
| |
| # int_tiles[6]: |
| # IMUX43 -> ICAP1_I31 = 0 |
| # IMUX42 -> ICAP1_I30 = toggle 0/1 |
| # int_tiles[7]: |
| # IMUX43 -> ICAP1_I15 = 0 |
| # IMUX42 -> ICAP1_I14 = toggle 0/1 |
| # int_tiles[8]: |
| # IMUX43 -> ICAP1_CSIB = 0 |
| # IMUX42 -> ICAP1_RDWRB = toggle 0/1 |
| |
| ICAP1_I30 = random.randint(0, 1) |
| ICAP1_I14 = random.randint(0, 1) |
| ICAP1_RDWRB = random.randint(0, 1) |
| |
| params = {} |
| params[int_tiles[6]] = ICAP1_I30 |
| params[int_tiles[7]] = ICAP1_I14 |
| params[int_tiles[8]] = ICAP1_RDWRB |
| |
| print( |
| """ |
| wire [31:0] icap_i_{site}; |
| wire icap_rdwrd_{site}; |
| wire icap_csib_{site}; |
| |
| assign icap_i_{site}[31] = 0; |
| assign icap_i_{site}[30] = {ICAP1_I30}; |
| |
| assign icap_i_{site}[15] = 0; |
| assign icap_i_{site}[14] = {ICAP1_I14}; |
| |
| assign icap_csib_{site} = 0; |
| assign icap_rdwrb_{site} = {ICAP1_RDWRB}; |
| |
| (* KEEP, DONT_TOUCH, LOC = "{site}" *) |
| ICAPE2 icap_{site} ( |
| .I(icap_i_{site}), |
| .RDWRB(icap_rdwrb_{site}), |
| .CSIB(icap_csib_{site}) |
| ); |
| """.format( |
| site=sites['ICAP'][1], |
| ICAP1_I30=ICAP1_I30, |
| ICAP1_I14=ICAP1_I14, |
| ICAP1_RDWRB=ICAP1_RDWRB)) |
| |
| print("endmodule") |
| write_params(params) |
| |
| |
| if __name__ == '__main__': |
| run() |