/*
 * Copyright 2024 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MPACT_CHERIOT__CHERIOT_RENODE_CLI_TOP_H_
#define MPACT_CHERIOT__CHERIOT_RENODE_CLI_TOP_H_

#include <cstddef>
#include <cstdint>

#include "absl/functional/any_invocable.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "cheriot/cheriot_debug_interface.h"
#include "cheriot/cheriot_top.h"
#include "mpact/sim/util/renode/renode_cli_top.h"

namespace mpact {
namespace sim {
namespace cheriot {

// This class extends the RenodeCLITop with a few features specific to the
// CherIoT CLI.
class CheriotRenodeCLITop : public util::renode::RenodeCLITop {
 public:
  CheriotRenodeCLITop(CheriotTop *cheriot_top, bool wait_for_cli);

  absl::StatusOr<size_t> CLIReadTagMemory(uint64_t address, void *buf,
                                          size_t length);

  absl::Status CLISetDataWatchpoint(uint64_t address, size_t length,
                                    AccessType access_type);
  absl::Status CLIClearDataWatchpoint(uint64_t address, AccessType access_type);
  void CLISetBreakOnControlFlowChange(bool value);
  bool CLIBreakOnControlFlowChange();

  absl::StatusOr<int> CLISetActionPoint(
      uint64_t address, absl::AnyInvocable<void(uint64_t, int)> action);
  absl::Status CLIClearActionPoint(uint64_t address, int id);
  absl::Status CLIEnableAction(uint64_t address, int id);
  absl::Status CLIDisableAction(uint64_t address, int id);

 private:
  CheriotTop *cheriot_top_ = nullptr;
};

}  // namespace cheriot
}  // namespace sim
}  // namespace mpact

#endif  // MPACT_CHERIOT__CHERIOT_RENODE_CLI_TOP_H_
