|  | #!/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(): | 
|  | ''' | 
|  | IOB33S: main IOB of a diff pair | 
|  | IOB33M: secondary IOB of a diff pair | 
|  | IOB33: not a diff pair. Relatively rare (at least in ROI...2 of them?) | 
|  | Focus on IOB33S to start | 
|  | ''' | 
|  | 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) | 
|  |  | 
|  | for site_name, site_type in gridinfo.sites.items(): | 
|  | if site_type == 'IOB33S': | 
|  | yield tile_name, site_name | 
|  |  | 
|  |  | 
|  | def write_params(params): | 
|  | pinstr = 'tile,val,site,pin\n' | 
|  | for tile, (site, val, pin) in sorted(params.items()): | 
|  | pinstr += '%s,%s,%s,%s\n' % (tile, val, site, pin) | 
|  | open('params.csv', 'w').write(pinstr) | 
|  |  | 
|  |  | 
|  | def run(): | 
|  | sites = list(gen_sites()) | 
|  | print( | 
|  | ''' | 
|  | `define N_DI {} | 
|  |  | 
|  | module top(input wire [`N_DI-1:0] di); | 
|  | wire [`N_DI-1:0] di_buf; | 
|  | '''.format(len(sites))) | 
|  |  | 
|  | params = {} | 
|  | print(''' | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | LUT6 dummy_lut();''') | 
|  |  | 
|  | for idx, ((tile_name, site_name), isone) in enumerate(zip( | 
|  | sites, util.gen_fuzz_states(len(sites)))): | 
|  | params[tile_name] = (site_name, isone, "di[%u]" % idx) | 
|  | print( | 
|  | ''' | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | IBUF #( | 
|  | ) ibuf_{site_name} ( | 
|  | .I(di[{idx}]), | 
|  | .O(di_buf[{idx}]) | 
|  | );'''.format(site_name=site_name, idx=idx)) | 
|  |  | 
|  | if isone: | 
|  | print( | 
|  | ''' | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | PULLUP #( | 
|  | ) pullup_{site_name} ( | 
|  | .O(di[{idx}]) | 
|  | );'''.format(site_name=site_name, idx=idx)) | 
|  |  | 
|  | print("endmodule") | 
|  | write_params(params) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | run() |