package rstmgr_pkg;

  // global constants
  parameter int ALWAYS_ON_SEL    = pwrmgr_pkg::ALWAYS_ON_DOMAIN;

  // params that reference pwrmgr, should be replaced once pwrmgr is merged
  localparam int PowerDomains    = pwrmgr_pkg::PowerDomains;
  localparam int ExtResetReasons = pwrmgr_pkg::HwRstReqs;

  // calculated domains
  localparam int OffDomains = PowerDomains-1;

  // low power exit + external reasons + ndm_reset_req
  localparam int ResetReasons = 1 + ExtResetReasons + 1;

  // ast interface
  typedef struct packed {
    logic vcc_pok;
    logic alw_pok;
  } rstmgr_ast_t;

  // default value for rstmgr_ast_rsp_t (for dangling ports)
  parameter rstmgr_ast_t RSTMGR_AST_DEFAULT = '{
    vcc_pok: 1'b1,
    alw_pok: 1'b1
  };

  // resets generated and broadcast
  // This should be templatized and generated
  typedef struct packed {
    logic rst_por_aon_n;
    logic rst_por_n;
    logic rst_por_io_n;
    logic rst_por_usb_n;
    logic rst_lc_n;
    logic rst_sys_io_n;
    logic rst_sys_n;
    logic rst_spi_device_n;
    logic rst_usb_n;
  } rstmgr_out_t;

  // peripherals reset requests
  typedef struct packed {
    logic rst_cpu_n;
    logic ndmreset_req;
  } rstmgr_cpu_t;

  // default value for rstmgr_ast_rsp_t (for dangling ports)
  parameter rstmgr_cpu_t RSTMGR_CPU_DEFAULT = '{
    rst_cpu_n: 1'b1,
    ndmreset_req: '0
  };

  // peripherals reset requests
  typedef struct packed {
    logic [ExtResetReasons-1:0] rst_reqs;
  } rstmgr_peri_t;

  // default value for rstmgr_ast_rsp_t (for dangling ports)
  parameter rstmgr_peri_t RSTMGR_PERI_DEFAULT = '{
    rst_reqs: '0
  };


endpackage // rstmgr_pkg
