Source code for edalize.rivierapro

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

import os
import logging
import sys
from edalize.edatool import Edatool

logger = logging.getLogger(__name__)

RUN_DO = """#Generated by Edalize
run -all
exit
"""


[docs] class Rivierapro(Edatool): argtypes = ["plusarg", "vlogdefine", "vlogparam"]
[docs] @classmethod def get_doc(cls, api_ver): if api_ver == 0: return { "description": "Riviera Pro simulator from Aldec", "members": [ { "name": "compilation_mode", "type": "String", "desc": "Common or separate compilation, sep - for separate compilation, common - for common compilation", } ], "lists": [ { "name": "vlog_options", "type": "String", "desc": "Additional options for compilation with vlog", }, { "name": "vsim_options", "type": "String", "desc": "Additional run options for vsim", }, ], }
def _write_build_rtl_tcl_file(self, tcl_main): tcl_build_rtl = open(os.path.join(self.work_root, "edalize_build_rtl.tcl"), "w") (src_files, incdirs) = self._get_fileset_files(force_slash=True) vlog_include_dirs = ["+incdir+" + d.replace("\\", "/") for d in incdirs] libs = [] common_compilation_sv = [] common_compilation_vhdl = [] for f in src_files: if not f.logical_name: f.logical_name = "work" if not f.logical_name in libs: tcl_build_rtl.write("vlib {}\n".format(f.logical_name)) libs.append(f.logical_name) if f.file_type.startswith("verilogSource") or f.file_type.startswith( "systemVerilogSource" ): cmd = "vlog" args = [] args += self.tool_options.get("vlog_options", []) if f.file_type.startswith("verilogSource"): if f.file_type.endswith("95"): args.append("-v95") elif f.file_type.endswith("2001"): args.append("-v2k") elif f.file_type.endswith("2005"): args.append("-v2k5") else: args += ["-sv"] for k, v in self.vlogdefine.items(): args += ["+define+{}={}".format(k, self._param_value_str(v))] args += vlog_include_dirs elif f.file_type.startswith("vhdlSource"): cmd = "vcom" if f.file_type.endswith("-87"): args = ["-87"] if f.file_type.endswith("-93"): args = ["-93"] if f.file_type.endswith("-2008"): args = ["-2008"] else: args = [] elif f.file_type == "tclSource": cmd = None tcl_main.write("do {}\n".format(f.name)) elif f.file_type == "user": cmd = None else: _s = "{} has unknown file type '{}'" logger.warning(_s.format(f.name, f.file_type)) cmd = None if cmd: args += ["-quiet"] args += ["-work", f.logical_name] args += [f.name] if cmd == "vlog": if not common_compilation_sv: common_compilation_sv += ["vlog"] for k, v in self.vlogdefine.items(): common_compilation_sv += [ "+define+{}={}".format(k, self._param_value_str(v)) ] common_compilation_sv += self.tool_options.get( "vlog_options", [] ) common_compilation_sv += vlog_include_dirs common_compilation_sv += ["-quiet"] common_compilation_sv += ["-work", f.logical_name] common_compilation_sv += [f.name, "\\\n"] else: common_compilation_sv += [f.name, "\\\n"] elif cmd == "vcom": if not common_compilation_vhdl: common_compilation_vhdl += ["vcom"] common_compilation_vhdl += [f.name, "\\\n"] else: common_compilation_vhdl += [f.name, "\\\n"] if (self.tool_options.get("compilation_mode")) == "sep" or ( self.tool_options.get("compilation_mode") == None ): tcl_build_rtl.write("{} {}\n".format(cmd, " ".join(args))) if self.tool_options.get("compilation_mode") == "common": if common_compilation_sv: tcl_build_rtl.write("{} \n".format(" ".join(common_compilation_sv))) if common_compilation_vhdl: tcl_build_rtl.write("{} \n".format(" ".join(common_compilation_vhdl))) if not ( self.tool_options.get("compilation_mode") == "common" or self.tool_options.get("compilation_mode") == None or self.tool_options.get("compilation_mode") == "sep" ): raise RuntimeError( "wrong compilation mode, use --compilation_mode=common for common compilation or --compilation_mode=sep for separate compilation" ) def _write_run_tcl_file(self): tcl_launch = open(os.path.join(self.work_root, "edalize_launch.tcl"), "w") # FIXME: Handle failures. Save stdout/stderr vpi_options = [] for vpi_module in self.vpi_modules: vpi_options += ["-pli", vpi_module["name"]] args = ["vsim"] args += self.tool_options.get("vsim_options", []) args += vpi_options args += self.toplevel.split() # Plusargs for key, value in self.plusarg.items(): args += ["+{}={}".format(key, self._param_value_str(value))] # Top-level parameters for key, value in self.vlogparam.items(): args += ["-g{}={}".format(key, self._param_value_str(value))] tcl_launch.write(" ".join(args) + "\n") tcl_launch.close() tcl_run = open(os.path.join(self.work_root, "edalize_run.tcl"), "w") tcl_run.write("do edalize_launch.tcl\n") tcl_run.write("run -all\n") tcl_run.write("exit\n") tcl_run.close() def _write_build_vpi_tcl_file(self): tcl_build_vpi = open(os.path.join(self.work_root, "edalize_build_vpi.tcl"), "w") for vpi_module in self.vpi_modules: _name = vpi_module["name"] _incs = " ".join(["-I" + d for d in vpi_module["include_dirs"]]) _libs = " ".join(["-l" + l for l in vpi_module["libs"]]) _options = "-std=c99" _srcs = " ".join(vpi_module["src_files"]) _s = "ccomp -pli -o {}.so {} {} {} {}\n".format( vpi_module["name"], _incs, _libs, _options, _srcs ) tcl_build_vpi.write(_s) tcl_build_vpi.close()
[docs] def configure_main(self): tcl_main = open(os.path.join(self.work_root, "edalize_main.tcl"), "w") tcl_main.write("do edalize_build_rtl.tcl\n") self._write_build_rtl_tcl_file(tcl_main) if self.vpi_modules: self._write_build_vpi_tcl_file() tcl_main.write("do edalize_build_vpi.tcl\n") tcl_main.close() self._write_run_tcl_file()
[docs] def build_pre(self): if not os.getenv("ALDEC_PATH"): raise RuntimeError( "Environment variable ALDEC_PATH was not found. It should be set to Riviera Pro install path. Please source <Riviera Pro install path>/etc/setenv to set it" ) super(Rivierapro, self).build_pre()
[docs] def build_main(self): args = ["-c", "-do", "do edalize_main.tcl; exit"] self._run_tool("vsim", args, quiet=True)
[docs] def run_main(self): if not os.getenv("ALDEC_PATH"): raise RuntimeError( "Environment variable ALDEC_PATH was not found. It should be set to Riviera Pro install path. Please source <Riviera Pro install path>/etc/setenv to set it" ) args = ["-c", "-quiet", "-do", "edalize_run.tcl"] self._run_tool("vsim", args)