Source code for edalize.vcs

# Copyright edalize contributors
# Licensed under the 2-Clause BSD License, see LICENSE for details.
# SPDX-License-Identifier: BSD-2-Clause

import os
import logging

from edalize.edatool import Edatool

logger = logging.getLogger(__name__)


[docs] class Vcs(Edatool): _description = """ Synopsys VCS Backend VCS is one of the "Big 3" simulators. Example snippet of a CAPI2 description file for VCS: .. code:: yaml vcs: vcs_options: # Compile-time options passed to the vcs command - -debug_access+pp - -debug_access+all run_options: # Run-time options passed to the simulation itself - -licqueue """ tool_options = { "lists": { "vcs_options": "String", # compile-time options (passed to VCS) "run_options": "String", # runtime options (passed to simulation) } } argtypes = ["plusarg", "vlogdefine", "vlogparam"] def _filelist_has_filetype(self, file_list, string, match_type="prefix"): for f in file_list: if match_type == "prefix" and f.file_type.startswith(string): return True elif match_type == "exact" and f.file_type == string: return True return False
[docs] def configure_main(self): def _vcs_filelist_filter(src_file): ft = src_file.file_type # XXX: C source files can be passed to VCS to be compiled into DPI # libraries; passing C sources together with RTL sources is a # workaround until we have proper DPI support # (https://github.com/olofk/fusesoc/issues/311). return ( ft.startswith("verilogSource") or ft.startswith("systemVerilogSource") or ft == "cSource" or ft == "cppSource" ) self._write_fileset_to_f_file( os.path.join(self.work_root, self.name + ".scr"), include_vlogparams=True, filter_func=_vcs_filelist_filter, ) plusargs = [] if self.plusarg: for key, value in self.plusarg.items(): plusarg = "+" + key if value != True: plusarg += "=" + self._param_value_str(value) plusargs.append(plusarg) vcs_options = self.tool_options.get("vcs_options", []) (src_files, incdirs) = self._get_fileset_files(force_slash=True) if self._filelist_has_filetype(src_files, "systemVerilog", match_type="prefix"): vcs_options.append("-sverilog") if self._filelist_has_filetype(src_files, "verilog2001", match_type="exact"): vcs_options.append("+v2k") template_vars = { "name": self.name, "vcs_options": vcs_options, "run_options": self.tool_options.get("run_options", []), "toplevel": self.toplevel, "plusargs": plusargs, } self.render_template("Makefile.j2", "Makefile", template_vars)
[docs] def run_main(self): args = ["run"] # Set plusargs if self.plusarg: plusargs = [] for key, value in self.plusarg.items(): plusargs += ["+{}={}".format(key, self._param_value_str(value))] args.append("EXTRA_OPTIONS=" + " ".join(plusargs)) self._run_tool("make", args)