// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

package ${name}_agent_pkg;
  // dep packages
  import uvm_pkg::*;
  import dv_utils_pkg::*;
  import dv_lib_pkg::*;

  // macro includes
  `include "uvm_macros.svh"
  `include "dv_macros.svh"

  // parameters

  // local types
  // forward declare classes to allow typedefs below
  typedef class ${name}_item;
  typedef class ${name}_agent_cfg;

% if has_separate_host_device_driver:
  // add typedef for ${name}_driver which is dv_base_driver with the right parameter set
  // ${name}_host_driver and ${name}_device_driver will extend from this
  typedef dv_base_driver #(.ITEM_T        (${name}_item),
                           .CFG_T         (${name}_agent_cfg)) ${name}_driver;

% endif
  // reuse dv_base_seqeuencer as is with the right parameter set
  typedef dv_base_sequencer #(.ITEM_T     (${name}_item),
                              .CFG_T      (${name}_agent_cfg)) ${name}_sequencer;

  // functions

  // package sources
  `include "${name}_item.sv"
  `include "${name}_agent_cfg.sv"
  `include "${name}_agent_cov.sv"
% if has_separate_host_device_driver:
  `include "${name}_host_driver.sv"
  `include "${name}_device_driver.sv"
% else:
  `include "${name}_driver.sv"
% endif
  `include "${name}_monitor.sv"
  `include "${name}_agent.sv"
  `include "${name}_seq_list.sv"

  endpackage: ${name}_agent_pkg
