#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Copyright (C) 2017-2021 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 argparse import yaml import subprocess import os import re import tempfile import json from prjxray.util import OpenSafeFile, db_root_arg, get_parts, set_part_resources def main(): """Tool to update the used resources by the fuzzers for each available part. Example: prjxray$ ./utils/update_resources.py artix7 --db-root database/artix7/ """ parser = argparse.ArgumentParser( description="Saves all resource information for a family.") parser.add_argument( 'family', help="Name of the device family.", choices=['artix7', 'kintex7', 'zynq7', 'spartan7']) db_root_arg(parser) args = parser.parse_args() env = os.environ.copy() cwd = os.path.dirname(os.path.abspath(__file__)) resource_path = os.path.join( os.getenv('XRAY_DIR'), 'settings', args.family) information = {} parts = get_parts(args.db_root) processed_parts = dict() for part in parts.keys(): # Skip parts which differ only in the speedgrade, as they have the same pins fields = part.split("-") common_part = fields[0] if common_part in processed_parts: information[part] = processed_parts[common_part] continue print("Find pins for {}".format(part)) env['XRAY_PART'] = part _, tmp_file = tempfile.mkstemp() # Asks with get_package_pins and different filters for pins with # specific properties. command = "env TMP_FILE={} {} -mode batch -source update_resources.tcl".format( tmp_file, env['XRAY_VIVADO']) result = subprocess.run( command.split(' '), check=True, env=env, cwd=cwd, stdout=subprocess.PIPE) with OpenSafeFile(tmp_file, "r") as fp: pins_json = json.load(fp) os.remove(tmp_file) clk_pins = pins_json["clk_pins"].split() data_pins = pins_json["data_pins"].split() pins = { 0: clk_pins[0], 1: data_pins[0], 2: data_pins[int(len(data_pins) / 2)], 3: data_pins[-1] } information[part] = {'pins': pins} processed_parts[common_part] = {'pins': pins} # Overwrites the /resources.yaml file completly with new data set_part_resources(resource_path, information) if __name__ == '__main__': main()