// 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
//
//     https://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_RVV_FP_GETTERS_H_
#define MPACT_CHERIOT_CHERIOT_RVV_FP_GETTERS_H_

#include "absl/container/flat_hash_map.h"
#include "absl/functional/any_invocable.h"
#include "absl/strings/str_cat.h"
#include "cheriot/cheriot_getter_helpers.h"
#include "cheriot/riscv_cheriot_encoding_common.h"
#include "mpact/sim/generic/operand_interface.h"
#include "riscv//riscv_register.h"
#include "riscv//riscv_state.h"

namespace mpact {
namespace sim {
namespace cheriot {
using ::mpact::sim::cheriot::RiscVCheriotEncodingCommon;
using ::mpact::sim::generic::DestinationOperandInterface;
using ::mpact::sim::generic::SourceOperandInterface;
using ::mpact::sim::riscv::RiscVState;
using ::mpact::sim::riscv::RVFpRegister;

using SourceOpGetterMap =
    absl::flat_hash_map<int, absl::AnyInvocable<SourceOperandInterface*()>>;
using DestOpGetterMap =
    absl::flat_hash_map<int,
                        absl::AnyInvocable<DestinationOperandInterface*(int)>>;

template <typename Enum, typename Extractors>
void AddCheriotRVVFPSourceGetters(SourceOpGetterMap& getter_map,
                                  RiscVCheriotEncodingCommon* common) {
  Insert(getter_map, *Enum::kFs1, [common]() {
    int num = Extractors::VArith::ExtractRs1(common->inst_word());
    return GetRegisterSourceOp<RVFpRegister>(
        common->state(), absl::StrCat(RiscVState::kFregPrefix, num));
  });
}

template <typename Enum, typename Extractors>
void AddCheriotRVVFPDestGetters(DestOpGetterMap& getter_map,
                                RiscVCheriotEncodingCommon* common) {
  Insert(getter_map, *Enum::kFd, [common](int latency) {
    int num = Extractors::VArith::ExtractRd(common->inst_word());
    return GetRegisterDestinationOp<RVFpRegister>(
        common->state(), absl::StrCat(RiscVState::kFregPrefix, num), latency);
  });
}

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

#endif  // MPACT_CHERIOT_CHERIOT_RVV_FP_GETTERS_H_
