99"""
1010
1111from subprocess import check_call
12- from os import makedirs
12+ from os import makedirs , environ
1313from pathlib import Path
1414
1515
1616def add_from_compile_order_file (
1717 vunit_obj , compile_order_file , dependency_scan_defaultlib = True , fail_on_non_hdl_files = True
1818): # pylint: disable=too-many-locals
1919 """
20- Add Vivado IP:s from a compile order file
20+ Add Vivado IP:s from a compile order file.
21+
22+ :param project_file: :class:`~vunit.ui.VUnit`
23+ :param compile_order_file: Compile-order file (from :func:`create_compile_order_file`)
24+ :param dependency_scan_defaultlib: Whether to do VUnit scanning of ``xil_defaultlib``.
25+ :param fail_on_non_hdl_files: Whether to fail on non-HDL files.
26+
2127 """
2228 compile_order , libraries , include_dirs = _read_compile_order (compile_order_file , fail_on_non_hdl_files )
2329
@@ -30,8 +36,9 @@ def add_from_compile_order_file(
3036
3137 no_dependency_scan = []
3238 with_dependency_scan = []
39+ verilog_file_endings = (".v" , ".vp" , ".sv" )
3340 for library_name , file_name in compile_order :
34- is_verilog = file_name .endswith (".v" ) or file_name . endswith ( ".vp" )
41+ is_verilog = file_name .endswith (verilog_file_endings )
3542
3643 # Optionally use VUnit dependency scanning for everything in xil_defaultlib, which
3744 # typically contains unencrypted top levels that instantiate encrypted implementations.
@@ -63,7 +70,13 @@ def add_from_compile_order_file(
6370
6471def create_compile_order_file (project_file , compile_order_file , vivado_path = None ):
6572 """
66- Create compile file from Vivado project
73+ Create compile file from Vivado project.
74+
75+ :param project_file: Project filename.
76+ :param compile_order_file: Filename for to write compile-order file.
77+ :param vivado_path: Path to Vivado install directory. If ``None``, the
78+ environment variable ``VUNIT_VIVADO_PATH`` is used if set. Otherwise,
79+ rely on that ``vivado`` is in the path.
6780 """
6881 print (f"Generating Vivado project compile order into { str (Path (compile_order_file ).resolve ())} ..." )
6982
@@ -81,18 +94,19 @@ def create_compile_order_file(project_file, compile_order_file, vivado_path=None
8194
8295def _read_compile_order (file_name , fail_on_non_hdl_files ):
8396 """
84- Read the compile order file and filter out duplicate files
97+ Read the compile order file and filter out duplicate files.
8598 """
8699 compile_order = []
87100 unique = set ()
88101 include_dirs = set ()
89102 libraries = set ()
90103
104+ valid_file_types = ("Verilog" , "VHDL" , "Verilog Header" , "SystemVerilog" )
91105 with Path (file_name ).open ("r" , encoding = "utf-8" ) as ifile :
92106 for line in ifile .readlines ():
93107 library_name , file_type , file_name = line .strip ().split ("," , 2 )
94108
95- if file_type not in ( "Verilog" , "VHDL" , "Verilog Header" ) :
109+ if file_type not in valid_file_types :
96110 if fail_on_non_hdl_files :
97111 raise RuntimeError (f"Unsupported compile order file: { file_name } " )
98112 print (f"Compile order file ignored: { file_name } " )
@@ -119,12 +133,22 @@ def run_vivado(tcl_file_name, tcl_args=None, cwd=None, vivado_path=None):
119133 """
120134 Run tcl script in Vivado in batch mode.
121135
122- Note: the shell=True is important in windows where Vivado is just a bat file.
136+ :param tcl_file_name: Path to tcl file
137+ :param tcl_args: tcl arguments passed to Vivado via the ``-tclargs`` switch
138+ :param cwd: Passed as ``cwd`` to :func:`subprocess.check_call`
139+ :param vivado_path: Path to Vivado install directory. If ``None``, the
140+ environment variable ``VUNIT_VIVADO_PATH`` is used if set. Otherwise,
141+ rely on that ``vivado`` is in the path.
123142 """
124- vivado = "vivado" if vivado_path is None else str (Path (vivado_path ).resolve () / "bin" / "vivado" )
125- cmd = f"{ vivado } -nojournal -nolog -notrace -mode batch -source { str (Path (tcl_file_name ).resolve ())} "
143+ vivado = (
144+ str (Path (vivado_path ).resolve () / "bin" / "vivado" )
145+ if vivado_path is not None
146+ else environ .get ("VUNIT_VIVADO_PATH" , "vivado" )
147+ )
148+ cmd = f'"{ vivado } " -nojournal -nolog -notrace -mode batch -source "{ Path (tcl_file_name ).resolve ()} "'
126149 if tcl_args is not None :
127- cmd += " -tclargs " + " " .join ([str ( val ) for val in tcl_args ])
150+ cmd += " -tclargs " + " " .join ([f'" { val } "' for val in tcl_args ])
128151
129152 print (cmd )
153+ # shell=True is important in Windows where Vivado is just a bat file.
130154 check_call (cmd , cwd = cwd , shell = True )
0 commit comments