| #!/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 <family>/resources.yaml file completly with new data | |
| set_part_resources(resource_path, information) | |
| if __name__ == '__main__': | |
| main() |