text: // Copyright lowRISC contributors.
  // Licensed under the Apache License, Version 2.0, see LICENSE for details.
  // SPDX-License-Identifier: Apache-2.0
  #ifndef OPENTITAN_HW_DV_VERILATOR_CPP_VERILATOR_MEMUTIL_H_
  #define OPENTITAN_HW_DV_VERILATOR_CPP_VERILATOR_MEMUTIL_H_
  
  //
  // A wrapper class that converts a DpiMemutil into a SimCtrlExtension
  //
  
  #include <memory>
  
  #include "dpi_memutil.h"
  #include "sim_ctrl_extension.h"
  
  class VerilatorMemUtil : public SimCtrlExtension {
  public:
    // No-argument constructor makes a VerilatorMemUtil. Single-argument
    // constructor wraps its mem_util argument (but does not take ownership).
    VerilatorMemUtil();
    explicit VerilatorMemUtil(DpiMemUtil *mem_util);
  
    // Declared in SimCtrlExtension
    bool ParseCLIArguments(int argc, char **argv, bool &exit_app) override;
  
    // Get underlying DpiMemUtil object
    DpiMemUtil *GetUnderlying() { return mem_util_; }
  
    // Pass-thru function to underlying object
    void RegisterMemoryArea(const std::string &name, uint32_t base,
                            const MemArea *mem_area) {
      return mem_util_->RegisterMemoryArea(name, base, mem_area);
    }
  
  private:
    DpiMemUtil *mem_util_;
    std::unique_ptr<DpiMemUtil> allocation_;
  };
  
  #endif // OPENTITAN_HW_DV_VERILATOR_CPP_VERILATOR_MEMUTIL_H_
  