// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
{
  build_cmd:  "{job_prefix} dsim"
  run_cmd:    "{job_prefix} dsim"

  build_opts: ["-work {build_dir}/dsim_out",
               "-genimage image",
               "-sv",
               // Set parallel compilation jobs limit
               "-j 12",
               // UVM
               "+incdir+{UVM_HOME}/src",
               "{UVM_HOME}/src/uvm_pkg.sv",
               // Add dpi/vpi include path.
               "-c-opts -I{DSIM_HOME}/../../include",
               // Needed for including "secded_enc.h".
               "-c-opts -I{build_dir}/src/lowrisc_dv_secded_enc_0",
               "-timescale 1ns/1ps",
               "-f {sv_flist}",
               // List multiple tops for the simulation. Prepend each top level with `-top`.
               "{eval_cmd} echo {sim_tops} | sed -E 's/(\\S+)/-top \\1/g'",
               "+incdir+{build_dir}",
               // TODO Remove buggy optimization when dsim fixes bug
               // https://gitlab.metrics.ca/google/google/-/issues/242.
               "-noopt-task-func",
               // Suppress following DSim errors and warnings:
               //   EnumMustBePositive - UVM 1.2 violates this
               "-suppress EnumMustBePositive"]

  run_opts:   ["-work {build_dir}/dsim_out",
               "-image image",
               // UVM DPI
               "-sv_lib {DSIM_HOME}/lib/libuvm_dpi.so",
               "-sv_seed {seed}",
               // tell DSim to write line-buffered stdout (lines will be written in proper order)
               "-linebuf",
               "+UVM_TESTNAME={uvm_test}",
               "+UVM_TEST_SEQ={uvm_test_seq}"]

  // Supported wave dumping formats (in order of preference).
  supported_wave_formats: ["vcd", "fst"]

  // Default tcl script used when running the sim. Override if needed.
  run_script: ""

  // TODO: refactor coverage configuration for DSim.

  // COVERAGE related.
  cov_db_dir: "{scratch_path}/coverage/{build_mode}.vdb"

  // Individual test specific coverage data - this will be deleted if the test fails
  // so that coverage from failing tests is not included in the final report.
  cov_db_test_dir_name: "{run_dir_name}.{seed}"
  cov_db_test_dir: "{cov_db_dir}/snps/coverage/db/testdata/{cov_db_test_dir_name}"

  // Merging coverage.
  // "cov_db_dirs" is a special variable that appends all build directories in use.
  // It is constructed by the tool itself.
  cov_merge_dir:    "{scratch_path}/cov_merge"
  cov_merge_db_dir: "{cov_merge_dir}/merged.vdb"
  cov_merge_cmd:    "{job_prefix} urg"
  cov_merge_opts:   []

  // Generate coverage reports in text as well as html.
  cov_report_dir:   "{scratch_path}/cov_report"
  cov_report_cmd:   "{job_prefix} urg"
  cov_report_opts:  []
  cov_report_txt:   "{cov_report_dir}/dashboard.txt"
  cov_report_page:  "dashboard.html"

  // Analyzing coverage - this is done by invoking --cov-analyze switch. It opens up the
  // GUI for visual analysis.
  cov_analyze_dir:  "{scratch_path}/cov_analyze"
  cov_analyze_cmd:  "{job_prefix} verdi"
  cov_analyze_opts: ["-cov",
                     "-covdir {cov_merge_db_dir}",
                     "-line nocasedef",
                     "-elfile {vcs_cov_excl_files}"]

  // Vars that need to exported to the env.
  exports: [
    { PATH: "{DSIM_HOME}:{PATH}" }
    { LD_LIBRARY_PATH: "{DSIM_HOME}/lib:{LD_LIBRARY_PATH}" }
  ]

  // Defaults for DSim
  // TODO: there is currently no equivalent of "all" coverage metrics in DSim
  cov_metrics: ""

  // pass and fail patterns
  build_fail_patterns: ["^=E:"]
  run_fail_patterns:   ["^=E:"]

  // waveform
  probe_file: "dsim.probe"

  build_modes: [
    {
      name: dsim_gui
      is_sim_mode: 1
      build_opts: []
      run_opts: []
    }
    {
      name: dsim_waves
      is_sim_mode: 1
      build_opts: ["+acc+b"]
      run_opts:   ["-waves waves.{waves}",
                   // dsim.probe is currently undefined
                   //"-wave-scope-specs {probe_file}",
                   // Dump unpacked structs and arrays.
                   "-dump-agg"]
    }
    // TODO: support coverage mode
    // Note: no specific build or run options are required for dsim to produce functional
    // coverage. Code coverage support is evolving.
    {
      name: dsim_cov
      is_sim_mode: 1
      build_opts: [// Enable the required cov metrics
                   ]
      run_opts:   [// Enable the required cov metrics
                   ]
    }
    // TODO: support xprop mode
    {
      name: dsim_xprop
      is_sim_mode: 1
    }
    {
      name: dsim_profile
      is_sim_mode: 1
      run_opts:   ["-profile"]
    }
    {
      // TODO: Add build and run options to enable zero delay loop detection.
      name: dsim_loopdetect
      is_sim_mode: 1
      build_opts: []
      run_opts:   []
    }
  ]
}
