| #!/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() |