| #!/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 json | 
 | import os | 
 | import random | 
 | random.seed(int(os.getenv("SEED"), 16)) | 
 | from prjxray.db import Database | 
 | from prjxray import util | 
 | from prjxray.state_gen import StateGen | 
 |  | 
 |  | 
 | def gen_sites(): | 
 |     xy_fun = util.create_xy_fun('BUFGCTRL_') | 
 |     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) | 
 |         sites = [] | 
 |  | 
 |         xs = [] | 
 |         ys = [] | 
 |         for site, site_type in gridinfo.sites.items(): | 
 |             if site_type == 'BUFGCTRL': | 
 |                 x, y = xy_fun(site) | 
 |                 xs.append(x) | 
 |                 ys.append(y) | 
 |  | 
 |                 sites.append((site, x, y)) | 
 |  | 
 |         if sites: | 
 |             yield tile_name, min(xs), min(ys), sorted(sites) | 
 |  | 
 |  | 
 | def main(): | 
 |     print(''' | 
 | module top(); | 
 |     ''') | 
 |  | 
 |     params_list = [] | 
 |     state_gen = StateGen(list(gen_sites()), states_per_site=12 * 16) | 
 |     for tile_name, x_min, y_min, sites in state_gen: | 
 |         for site, x, y in sites: | 
 |             params = {} | 
 |             params['tile'] = tile_name | 
 |             params['site'] = site | 
 |             params['x'] = x - x_min | 
 |             params['y'] = y - y_min | 
 |             params['IN_USE'] = state_gen.next_state() | 
 |  | 
 |             if params['IN_USE']: | 
 |                 params['INIT_OUT'] = state_gen.next_state() | 
 |                 params['IS_CE0_INVERTED'] = state_gen.next_state() | 
 |                 params['IS_CE1_INVERTED'] = state_gen.next_state() | 
 |                 params['IS_S0_INVERTED'] = state_gen.next_state() | 
 |                 params['IS_S1_INVERTED'] = state_gen.next_state() | 
 |                 params['IS_IGNORE0_INVERTED'] = state_gen.next_state() | 
 |                 params['IS_IGNORE1_INVERTED'] = state_gen.next_state() | 
 |  | 
 |                 params['PRESELECT_I0'] = state_gen.next_state() | 
 |                 if not params['PRESELECT_I0']: | 
 |                     params['PRESELECT_I1'] = state_gen.next_state() | 
 |                 else: | 
 |                     params['PRESELECT_I1'] = 0 | 
 |  | 
 |                 params['force_0_high'] = state_gen.next_state() | 
 |                 params['force_1_high'] = state_gen.next_state() | 
 |                 if params['force_0_high']: | 
 |                     params['force_1_high'] = 0 | 
 |  | 
 |                 print( | 
 |                     ''' | 
 |     wire ce0_{site}; | 
 |     wire s0_{site}; | 
 |     (* KEEP, DONT_TOUCH *) | 
 |     LUT6 l0_{site} ( | 
 |         .O(ce0_{site}) | 
 |         ); | 
 |     (* KEEP, DONT_TOUCH *) | 
 |     LUT6 l1_{site} ( | 
 |         .O(s0_{site}) | 
 |         ); | 
 |  | 
 |     wire ce1_{site}; | 
 |     wire s1_{site}; | 
 |     (* KEEP, DONT_TOUCH *) | 
 |     LUT6 l2_{site} ( | 
 |         .O(ce1_{site}) | 
 |         ); | 
 |     (* KEEP, DONT_TOUCH *) | 
 |     LUT6 l3_{site} ( | 
 |         .O(s1_{site}) | 
 |         ); | 
 |  | 
 |     (* KEEP, DONT_TOUCH, LOC = "{site}" *) | 
 |     BUFGCTRL #( | 
 |         .INIT_OUT({INIT_OUT}), | 
 |         .PRESELECT_I0({PRESELECT_I0}), | 
 |         .PRESELECT_I1({PRESELECT_I1}), | 
 |         .IS_CE0_INVERTED({IS_CE0_INVERTED}), | 
 |         .IS_CE1_INVERTED({IS_CE1_INVERTED}), | 
 |         .IS_S0_INVERTED({IS_S0_INVERTED}), | 
 |         .IS_S1_INVERTED({IS_S1_INVERTED}), | 
 |         .IS_IGNORE0_INVERTED({IS_IGNORE0_INVERTED}), | 
 |         .IS_IGNORE1_INVERTED({IS_IGNORE1_INVERTED}) | 
 |         ) buf_{site} ( | 
 |             .CE0(ce0_{site} | {force_0_high}), | 
 |             .S0(s0_{site} | {force_0_high}), | 
 |             .CE1(ce1_{site} | {force_1_high}), | 
 |             .S1(s1_{site} | {force_1_high}) | 
 |         ); | 
 |                     '''.format(**params)) | 
 |  | 
 |             params_list.append(params) | 
 |  | 
 |     print(""" | 
 |     (* KEEP, DONT_TOUCH *) | 
 |     LUT6 dummy ( | 
 |         );""") | 
 |  | 
 |     print("endmodule") | 
 |  | 
 |     with open('params.json', 'w') as f: | 
 |         json.dump(params_list, f, indent=2) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |     main() |