|  | #!/usr/bin/env python3 | 
|  | # Copyright lowRISC contributors. | 
|  | # Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  | """Program an FPGA with a bitstream | 
|  | """ | 
|  | import argparse | 
|  | import os | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  |  | 
|  | def program_bitstream_with_vivado(part, bitstream, hw_server_url, hw_target, jtag_freq): | 
|  | tcl_file = os.path.join(os.path.dirname(__file__), 'vivado_pgm.tcl') | 
|  | if not os.path.isfile(tcl_file): | 
|  | raise FileNotFoundError('{} not found.'.format(tcl_file)) | 
|  |  | 
|  | cmd_env = os.environ.copy() | 
|  | if hw_server_url is not None: | 
|  | cmd_env['HW_SERVER_URL'] = hw_server_url | 
|  | if hw_target is not None: | 
|  | cmd_env['HW_TARGET'] = hw_target | 
|  | if jtag_freq is not None: | 
|  | cmd_env['JTAG_FREQ'] = jtag_freq | 
|  |  | 
|  | cmd = [ | 
|  | 'vivado', '-quiet', '-nolog', '-notrace', '-mode', 'batch', '-source', | 
|  | str(tcl_file), '-tclargs', part, bitstream | 
|  | ] | 
|  | try: | 
|  | subprocess.run(cmd, check=True, env=cmd_env) | 
|  | except FileNotFoundError as e: | 
|  | print("Unable to run Vivado: %s. Is Vivado in your PATH?" % str(e), | 
|  | file=sys.stderr) | 
|  | return 1 | 
|  | except subprocess.CalledProcessError as e: | 
|  | print(str(e), file=sys.stderr) | 
|  | return 1 | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument('--hw-server-url', | 
|  | required=False, | 
|  | default=None, | 
|  | help='The URL of a running Xilinx hardware server to ' | 
|  | 'connect to. If not specified, a hardware server will ' | 
|  | 'be started automatically on localhost.') | 
|  | parser.add_argument('--hw-target', | 
|  | '-t', | 
|  | required=False, | 
|  | default=None, | 
|  | help='Hardware target to use. Use the TCL command ' | 
|  | 'get_hw_targets in Vivado to get a list of available ' | 
|  | 'targets.') | 
|  | parser.add_argument('--jtag-freq', | 
|  | '-f', | 
|  | required=False, | 
|  | default=None, | 
|  | help='JTAG frequency (in Hz)') | 
|  | parser.add_argument('part', help='Device (part) to flash') | 
|  | parser.add_argument('bitstream', help='Path to the bitstream file') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | return program_bitstream_with_vivado(args.part, | 
|  | args.bitstream, | 
|  | hw_server_url=args.hw_server_url, | 
|  | hw_target=args.hw_target, | 
|  | jtag_freq=args.jtag_freq) | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | sys.exit(main()) |