diff --git a/vunit/configuration.py b/vunit/configuration.py index 5c16665de..cd987d1f7 100644 --- a/vunit/configuration.py +++ b/vunit/configuration.py @@ -111,6 +111,12 @@ def set_generic(self, name, value): else: self.generics[name] = value + def set_objects(self, files): + """ + Set list of pre-built objects to be linked + """ + self.set_sim_option("objects", files) + def set_sim_option(self, name, value): """ Set sim option @@ -199,6 +205,12 @@ def set_generic(self, name, value): for config in configs.values(): config.set_generic(name, value) + def set_objects(self, files, overwrite=True): + """ + Set list of pre-built objects to be linked + """ + self.set_sim_option("objects", files, overwrite) + def set_sim_option(self, name, value, overwrite=True): """ Set sim option diff --git a/vunit/ghdl_interface.py b/vunit/ghdl_interface.py index ff9183e16..9816db128 100644 --- a/vunit/ghdl_interface.py +++ b/vunit/ghdl_interface.py @@ -124,6 +124,13 @@ def determine_backend(cls, prefix): print("=============================" + ("=" * 60)) raise AssertionError("No known GHDL back-end could be detected from running 'ghdl --version'") + @classmethod + def supports_vhpi(cls): + """ + Return if the simulator supports VHPI + """ + return cls.determine_backend(cls.find_prefix_from_path()) != "mcode" + def _has_output_flag(self): """ Returns if backend supports output flag @@ -208,6 +215,10 @@ def _get_command(self, config, output_path, ghdl_e): cmd += ['-o', join(output_path, "%s-%s" % (config.entity_name, config.architecture_name))] cmd += config.sim_options.get("ghdl.elab_flags", []) + objs = config.sim_options.get("objects", []) + if objs: + cmd += ["-Wl," + " ".join(objs)] + cmd += [config.entity_name, config.architecture_name] if not ghdl_e: diff --git a/vunit/simulator_factory.py b/vunit/simulator_factory.py index b0d71e7bb..09993664c 100644 --- a/vunit/simulator_factory.py +++ b/vunit/simulator_factory.py @@ -57,7 +57,8 @@ def _extract_sim_options(self): [VHDLAssertLevelOption(), BooleanOption("disable_ieee_warnings"), BooleanOption("enable_coverage"), - ListOfStringOption("pli")]) + ListOfStringOption("pli"), + ListOfStringOption("objects")]) for sim_class in self.supported_simulators(): for opt in sim_class.sim_options: diff --git a/vunit/simulator_interface.py b/vunit/simulator_interface.py index 0ca303955..b456490cd 100644 --- a/vunit/simulator_interface.py +++ b/vunit/simulator_interface.py @@ -17,7 +17,7 @@ from vunit.color_printer import NO_COLOR_PRINTER -class SimulatorInterface(object): +class SimulatorInterface(object): # pylint: disable=too-many-public-methods """ Generic simulator interface """ @@ -145,6 +145,13 @@ def has_valid_exit_code(): """ return False + @staticmethod + def supports_vhpi(): + """ + Return if the simulator supports VHPI + """ + return False + def merge_coverage(self, file_name, args): # pylint: disable=unused-argument, no-self-use """ Hook for simulator interface to creating coverage reports diff --git a/vunit/test/common.py b/vunit/test/common.py index 5d626856a..c96584b84 100644 --- a/vunit/test/common.py +++ b/vunit/test/common.py @@ -32,6 +32,16 @@ def simulator_is(*names): return SIMULATOR_FACTORY.select_simulator().name in names +def simulator_check(func): + """ + Check some method of the selected simulator + """ + simif = SIMULATOR_FACTORY.select_simulator() + if simif is None: + return False + return func(simif) + + def check_report(report_file, tests=None): """ Check an XML report_file for the exact occurrence of specific test results diff --git a/vunit/ui.py b/vunit/ui.py index 5e4f6f915..2fc991ef4 100644 --- a/vunit/ui.py +++ b/vunit/ui.py @@ -568,6 +568,12 @@ def set_parameter(self, name, value, allow_empty=False): for test_bench in check_not_empty(test_benches, allow_empty, "No test benches found"): test_bench.set_generic(name, value) + def set_objects(self, files, overwrite=True): + """ + Set list of pre-built objects to be linked + """ + self.set_sim_option("objects", files, overwrite=overwrite) + def set_sim_option(self, name, value, allow_empty=False, overwrite=True): """ Set simulation option in all |configurations| @@ -1199,6 +1205,12 @@ def set_parameter(self, name, value, allow_empty=False): for test_bench in self.get_test_benches(allow_empty=allow_empty): test_bench.set_generic(name, value) + def set_objects(self, files, allow_empty=False, overwrite=True): + """ + Set list of pre-built objects to be linked + """ + self.set_sim_option("objects", files, allow_empty=allow_empty, overwrite=overwrite) + def set_sim_option(self, name, value, allow_empty=False, overwrite=True): """ Set simulation option within all |configurations| of test benches and tests this library @@ -1512,6 +1524,12 @@ def set_parameter(self, name, value): """ self._test_bench.set_generic(name, value) + def set_objects(self, files, overwrite=True): + """ + Set list of pre-built objects to be linked + """ + self.set_sim_option("objects", files, overwrite) + def set_sim_option(self, name, value, overwrite=True): """ Set simulation option within all |configurations| of this test bench or test cases within it @@ -1793,6 +1811,12 @@ def set_parameter(self, name, value): """ self._test_case.set_generic(name, value) + def set_objects(self, files, overwrite=True): + """ + Set list of pre-built objects to be linked + """ + self.set_sim_option("objects", files, overwrite) + def set_sim_option(self, name, value, overwrite=True): """ Set simulation option within all |configurations| of this test