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,19 +94,20 @@ 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
93107 for line in ifile .readlines ():
94108 library_name , file_type , file_name = line .strip ().split ("," , 2 )
95109
96- if file_type not in ( "Verilog" , "VHDL" , "Verilog Header" ) :
110+ if file_type not in valid_file_types :
97111 if fail_on_non_hdl_files :
98112 raise RuntimeError (f"Unsupported compile order file: { file_name } " )
99113 print (f"Compile order file ignored: { file_name } " )
@@ -120,12 +134,22 @@ def run_vivado(tcl_file_name, tcl_args=None, cwd=None, vivado_path=None):
120134 """
121135 Run tcl script in Vivado in batch mode.
122136
123- Note: the shell=True is important in windows where Vivado is just a bat file.
137+ :param tcl_file_name: Path to tcl file
138+ :param tcl_args: tcl arguments passed to Vivado via the ``-tclargs`` switch
139+ :param cwd: Passed as ``cwd`` to :func:`subprocess.check_call`
140+ :param vivado_path: Path to Vivado install directory. If ``None``, the
141+ environment variable ``VUNIT_VIVADO_PATH`` is used if set. Otherwise,
142+ rely on that ``vivado`` is in the path.
124143 """
125- vivado = "vivado" if vivado_path is None else str (Path (vivado_path ).resolve () / "bin" / "vivado" )
126- cmd = f"{ vivado } -nojournal -nolog -notrace -mode batch -source { str (Path (tcl_file_name ).resolve ())} "
144+ vivado = (
145+ str (Path (vivado_path ).resolve () / "bin" / "vivado" )
146+ if vivado_path is not None
147+ else environ .get ("VUNIT_VIVADO_PATH" , "vivado" )
148+ )
149+ cmd = f'"{ vivado } " -nojournal -nolog -notrace -mode batch -source "{ str (Path (tcl_file_name ).resolve ())} "'
127150 if tcl_args is not None :
128- cmd += " -tclargs " + " " .join ([str ( val ) for val in tcl_args ])
151+ cmd += " -tclargs " + " " .join ([f'" { val } "' for val in tcl_args ])
129152
130153 print (cmd )
154+ # shell=True is important in Windows where Vivado is just a bat file.
131155 check_call (cmd , cwd = cwd , shell = True )
0 commit comments