|  | #!/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 | 
|  | from collections import namedtuple | 
|  |  | 
|  | random.seed(int(os.getenv("SEED"), 16)) | 
|  | from prjxray import util | 
|  | from prjxray import verilog | 
|  | from prjxray.lut_maker import LutMaker | 
|  | from prjxray.db import Database | 
|  |  | 
|  | INT = "INT" | 
|  | BIN = "BIN" | 
|  | BOOL = "BOOL" | 
|  | STR = "STR" | 
|  |  | 
|  |  | 
|  | def gen_sites(site): | 
|  | db = Database(util.get_db_root(), util.get_part()) | 
|  | grid = db.grid() | 
|  | already_used = list() | 
|  | for tile_name in sorted(grid.tiles()): | 
|  | loc = grid.loc_of_tilename(tile_name) | 
|  | gridinfo = grid.gridinfo_at_loc(loc) | 
|  |  | 
|  | if gridinfo.tile_type not in [ | 
|  | "GTP_CHANNEL_0", | 
|  | "GTP_CHANNEL_1", | 
|  | "GTP_CHANNEL_2", | 
|  | "GTP_CHANNEL_3", | 
|  | "GTP_CHANNEL_0_MID_LEFT", | 
|  | "GTP_CHANNEL_1_MID_LEFT", | 
|  | "GTP_CHANNEL_2_MID_LEFT", | 
|  | "GTP_CHANNEL_3_MID_LEFT", | 
|  | "GTP_CHANNEL_0_MID_RIGHT", | 
|  | "GTP_CHANNEL_1_MID_RIGHT", | 
|  | "GTP_CHANNEL_2_MID_RIGHT", | 
|  | "GTP_CHANNEL_3_MID_RIGHT", | 
|  | ] or gridinfo.tile_type in already_used: | 
|  | continue | 
|  | else: | 
|  | tile_type = gridinfo.tile_type | 
|  | already_used.append(tile_type) | 
|  |  | 
|  | for site_name, site_type in gridinfo.sites.items(): | 
|  | if site_type != site: | 
|  | continue | 
|  |  | 
|  | if "RIGHT" in tile_type and "X0" in site_name: | 
|  | continue | 
|  |  | 
|  | if "LEFT" in tile_type and "X1" in site_name: | 
|  | continue | 
|  |  | 
|  | yield tile_name, tile_type, site_name, site_type | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | print( | 
|  | ''' | 
|  | module top( | 
|  | input wire in, | 
|  | output wire out | 
|  | ); | 
|  |  | 
|  | assign out = in; | 
|  | ''') | 
|  |  | 
|  | luts = LutMaker() | 
|  |  | 
|  | primitives_list = list() | 
|  |  | 
|  | for tile_name, tile_type, site_name, site_type in gen_sites( | 
|  | "GTPE2_CHANNEL"): | 
|  |  | 
|  | params_list = list() | 
|  | params_dict = dict() | 
|  |  | 
|  | params_dict["tile_type"] = tile_type | 
|  | params = dict() | 
|  | params['site'] = site_name | 
|  |  | 
|  | verilog_attr = "" | 
|  |  | 
|  | verilog_attr = "#(" | 
|  |  | 
|  | fuz_dir = os.getenv("FUZDIR", None) | 
|  | assert fuz_dir | 
|  | with open(os.path.join(fuz_dir, "attrs.json"), "r") as attrs_file: | 
|  | attrs = json.load(attrs_file) | 
|  |  | 
|  | in_use = bool(random.randint(0, 9)) | 
|  | params["IN_USE"] = in_use | 
|  |  | 
|  | if in_use: | 
|  | for param, param_info in attrs.items(): | 
|  | param_type = param_info["type"] | 
|  | param_values = param_info["values"] | 
|  | param_digits = param_info["digits"] | 
|  |  | 
|  | if param_type == INT: | 
|  | value = random.choice(param_values) | 
|  | value_str = value | 
|  | elif param_type == BIN: | 
|  | value = random.randint(0, param_values[0]) | 
|  | value_str = "{digits}'b{value:0{digits}b}".format( | 
|  | value=value, digits=param_digits) | 
|  | elif param_type in [BOOL, STR]: | 
|  | value = random.choice(param_values) | 
|  | value_str = verilog.quote(value) | 
|  |  | 
|  | params[param] = value | 
|  |  | 
|  | verilog_attr += """ | 
|  | .{}({}),""".format(param, value_str) | 
|  |  | 
|  | verilog_ports = "" | 
|  | for param in ["TXUSRCLK", "TXUSRCLK2", "TXPHDLYTSTCLK", | 
|  | "SIGVALIDCLK", "RXUSRCLK", "RXUSRCLK2", "DRPCLK", | 
|  | "DMONITORCLK", "CLKRSVD0", "CLKRSVD1"]: | 
|  | is_inverted = random.randint(0, 1) | 
|  |  | 
|  | params[param] = is_inverted | 
|  |  | 
|  | verilog_attr += """ | 
|  | .IS_{}_INVERTED({}),""".format(param, is_inverted) | 
|  | verilog_ports += """ | 
|  | .{}({}),""".format(param, luts.get_next_output_net()) | 
|  |  | 
|  | verilog_attr = verilog_attr.rstrip(",") | 
|  | verilog_attr += "\n)" | 
|  |  | 
|  | print("(* KEEP, DONT_TOUCH, LOC=\"{}\" *)".format(site_name)) | 
|  | print( | 
|  | """GTPE2_CHANNEL {attrs} {site} ( | 
|  | {ports} | 
|  | ); | 
|  | """.format( | 
|  | attrs=verilog_attr, | 
|  | site=tile_type.lower(), | 
|  | ports=verilog_ports.rstrip(","))) | 
|  |  | 
|  | params_list.append(params) | 
|  | params_dict["params"] = params_list | 
|  | primitives_list.append(params_dict) | 
|  |  | 
|  | for l in luts.create_wires_and_luts(): | 
|  | print(l) | 
|  |  | 
|  | print("endmodule") | 
|  |  | 
|  | with open('params.json', 'w') as f: | 
|  | json.dump(primitives_list, f, indent=2) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |