// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
{
  // Replicate settings from `common_sim_cfg.hjson`.
  //
  // Unfortunately, that file assumes that the tools are invoked natively as
  // opposed to via FuseSoC. Verilator is setup to be invoked via FuseSoC,
  // which causes FuseSoC to fail due to unknown {build_opts}. Hence, contents
  // from `common_sim_cfg.hjson` are replicated here as appropriate.
  // -- START --
  dv_root:          "{proj_root}/hw/dv"
  flow:             sim
  flow_makefile:    "{dv_root}/tools/dvsim/sim.mk"

  import_cfgs:      ["{proj_root}/hw/data/common_project_cfg.hjson",
                     "{dv_root}/tools/dvsim/common_modes.hjson",
                     "{dv_root}/tools/dvsim/fusesoc.hjson",
                     ]

  // Default directory structure for the output
  build_dir:          "{scratch_path}/{build_mode}"
  run_dir_name:       "{index}.{test}"
  run_dir:            "{scratch_path}/{run_dir_name}/out"
  sw_root_dir:        "{proj_root}/sw"

  regressions: [
    {
      name: smoke
      reseed: 1
    }
    {
      name: all
    }
    {
      name: all_once
      reseed: 1
    }
    {
      name: nightly
    }
  ]
  // -- END --

  pre_build_cmds: []

  build_cmd:  "fusesoc {fusesoc_cores_root_dirs} run"
  ex_name:    "{eval_cmd} echo \"{fusesoc_core}\" | cut -d: -f3"
  run_cmd:    "{build_dir}/sim-verilator/V{ex_name}"

  // TODO: Verilator has a few useful build switches. Need to figure out how to
  // pass them via FuseSoC.

  build_opts: ["--flag=fileset_{design_level}",
               "--target=sim",
               "--build-root={build_dir}",
               "--setup",
               "--build",
               "{fusesoc_core}"
               // "--timescale 1ns/1ps",
               // Enable all assertions.
               // "--assert",
               // Flush streams immediately after all $displays.
               // "--autoflush",
               // Enable multi-threading.
               // "--threads 4",
               // Randomize all 2-state vars if driven to unknown 'X'.
               // "--x-assign unique",
               // "--x-initial unique",
               ]

  run_opts: [// Set random seed.
             // "+verilator+seed+{seed}",
             ]

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

  // Vars that need to exported to the env.
  exports: [
  ]

  // pass and fail patterns
  build_pass_patterns: []
  build_fail_patterns: [// Verilator compile error.
                        "^%Error.*?:",
                        // FuseSoC build error.
                        "^ERROR:.*$",
                        ]
  run_pass_patterns:   ["^TEST PASSED CHECKS$"]
  run_fail_patterns:   [// $warning/error/fatal messages.
                        "^\\[[0-9]+\\] %Warning.*?: ",
                        "^\\[[0-9]+\\] %Error.*?: ",
                        "^\\[[0-9]+\\] %Fatal.*?: ",
                        // Ninja / SW compile failure.
                        "^FAILED: ",
                        " error: ",
                        // Failure signature pattern.
                        "^TEST FAILED CHECKS$"
                        ]

  // Coverage related.
  cov_db_dir: ""
  cov_db_test_dir: ""

  build_modes: [
    // TODO: Verilator will likely never have GUI. Find a better way to support
    // --gui when the tool itself doesn't support it.
    {
      name: verilator_gui
      is_sim_mode: 1
      build_opts: []
      run_opts: []
    }
    {
      name: verilator_waves
      is_sim_mode: 1
      // build_opts: ["--trace",
      //              "--trace-fst"
      //              "--trace-structs",
      //              "--trace-params",
      //              "-CFLAGS \"-DVM_TRACE_FMT_FST\"",
      //              ]
      run_opts: ["--trace"]
    }
    // TODO: These need to be fine-tuned.
    {
      name: verilator_cov
      is_sim_mode: 1
      // build_opts: ["--coverage"]
    }
    {
      name: verilator_xprop
      is_sim_mode: 1
    }
    {
      name: verilator_profile
      is_sim_mode: 1
      // build_opts: ["--prof-cfuncs",
      //              "--prof-threads",
      //             ]
    }
    {
      name: verilator_loopdetect
      is_sim_mode: 1
    }
  ]
}
