|  | #!/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 io | 
|  | import os | 
|  | import random | 
|  | random.seed(int(os.getenv("SEED"), 16)) | 
|  | from prjxray import util | 
|  | from prjxray import lut_maker | 
|  | from prjxray import verilog | 
|  | 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()): | 
|  | if not 'CFG_CENTER_MID' in tile_name: | 
|  | continue | 
|  | print("// tile: " + str(tile_name)) | 
|  | loc = grid.loc_of_tilename(tile_name) | 
|  | gridinfo = grid.gridinfo_at_loc(loc) | 
|  |  | 
|  | sites = {} | 
|  | print("// " + str(gridinfo.sites.items())) | 
|  | for site_name, site_type in gridinfo.sites.items(): | 
|  | if site_type == 'STARTUP': | 
|  | print("// got site: " + str(site_name)) | 
|  | sites[site_type] = site_name | 
|  |  | 
|  | if sites: | 
|  | yield tile_name, sites | 
|  |  | 
|  | def run(): | 
|  | params = { | 
|  | "tiles": [], | 
|  | } | 
|  |  | 
|  | for tile, sites in gen_sites(): | 
|  | for site_type, site in sites.items(): | 
|  | p = {} | 
|  | p['tile'] = tile | 
|  | p['site'] = site | 
|  |  | 
|  | p['CONNECTION'] = random.choice( | 
|  | ( | 
|  | 'HARD_ZERO', | 
|  | # hard zero or hard one does not make a difference | 
|  | # it only seems to matter if it is connected to a clock net or not | 
|  | #'HARD_ONE', | 
|  | 'CLOCK', | 
|  | )) | 
|  |  | 
|  | params['tiles'].append(p) | 
|  |  | 
|  | print( | 
|  | ''' | 
|  | module top (input  wire clk); | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | STARTUPE2 STARTUPE2 ( | 
|  | .CLK(1'b0), | 
|  | .GSR(1'b0), | 
|  | .GTS(1'b0), | 
|  | .KEYCLEARB(1'b1), | 
|  | .PACK(1'b0), | 
|  | .PREQ(), | 
|  |  | 
|  | // Drive clock.''') | 
|  |  | 
|  | connection = p['CONNECTION'] | 
|  |  | 
|  | if connection == "HARD_ZERO": | 
|  | print("        .USRCCLKO (1'b0),") | 
|  | elif connection == "HARD_ONE": | 
|  | print("        .USRCCLKO (1'b1),") | 
|  | else: | 
|  | print("        .USRCCLKO (clk),") | 
|  |  | 
|  | print( | 
|  | ''' | 
|  | .USRCCLKTS(1'b0), | 
|  | .USRDONEO (1'b0), | 
|  | .USRDONETS(1'b1), | 
|  | .CFGCLK(), | 
|  | .CFGMCLK(), | 
|  | .EOS() | 
|  | ); | 
|  |  | 
|  | endmodule | 
|  | ''') | 
|  |  | 
|  | with open('params.json', 'w') as f: | 
|  | json.dump(params, f, indent=2) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | run() |