| #!/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 |
| from prjxray import util |
| |
| |
| def main(): |
| """Tool to update all supported, available parts in a mapping file for the |
| given family. It will read all parts from Vivado, filter them by the family, |
| and will only add these where a device exists for. |
| |
| Example: |
| prjxray$ ./utils/update_parts.py artix7 --db-root database/artix7/ |
| """ |
| parser = argparse.ArgumentParser( |
| description="Saves all supported parts for a family.") |
| |
| parser.add_argument( |
| 'family', |
| help="Name of the device family.", |
| choices=['artix7', 'kintex7', 'zynq7', 'spartan7']) |
| util.db_root_arg(parser) |
| |
| args = parser.parse_args() |
| env = os.environ.copy() |
| # Vivado does not use the suffix 7 for zynq |
| env['FILTER'] = "zynq" if args.family == "zynq7" else args.family |
| cwd = os.path.dirname(os.path.abspath(__file__)) |
| information = {} |
| |
| # Read all supported devices |
| supported_devices = util.get_devices(args.db_root).keys() |
| |
| # Fetch all parts for a family (FILTER = family) |
| command = "{} -mode batch -source update_parts.tcl".format( |
| env['XRAY_VIVADO']) |
| result = subprocess.run( |
| command.split(' '), |
| check=True, |
| env=env, |
| cwd=cwd, |
| stdout=subprocess.PIPE) |
| parts = result.stdout.decode('utf-8').split('# }\n')[1].splitlines()[:-1] |
| |
| # Splits up the part number and checks if the device is supported |
| for part in parts: |
| part, device, package, speed = part.split(',') |
| if device in supported_devices: |
| information[part] = { |
| 'device': device, |
| 'package': package, |
| 'speedgrade': speed[1:] |
| } |
| else: |
| print("Part {} has an unsupported device {}".format(part, device)) |
| |
| # Overwrites the <family>/parts.yaml file completly with new data |
| util.set_part_information(args.db_root, information) |
| |
| |
| if __name__ == '__main__': |
| main() |