// Copyright 2023 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_SIM_GENERIC_STATE_ITEM_H_
#define MPACT_SIM_GENERIC_STATE_ITEM_H_

#include <cstdint>
#include <string>
#include <type_traits>

#include "absl/strings/string_view.h"
#include "mpact/sim/generic/operand_interface.h"

namespace mpact {
namespace sim {
namespace generic {

// Forward declarations
// ArchState is a class that holds the architectural (processor) state.
// This class is not used in the StateItem class, other than passing on a
// pointer to the BaseType. Even in the BaseClass it is only used as a
// property with a getter function.
class ArchState;

// This file contains a templated helper class used to create types for
// registers and other machine state. As such, this class doesn't have its
// own test class, but is effectively tested where those resulting types
// are defined, e.g., test/register_test.cc for register.{h,cc} where the
// register types are defined.

// Variadically templated base class for machine state classes. The
// templatization is done to enable creation of scalar, vector and array
// value typed instances of a base class such as a register or fifo.
// The base template cannot be instantiated since the constructor is
// deleted, only the partially specialized versions of the template can be
// instantiated.
template <typename BaseType, typename ElementType, typename SourceOperandType,
          typename DestinationOperandType, int... Ns>
class StateItem : public BaseType {
 public:
  StateItem() = delete;
};

// The following partial specializations of the State class are used to
// model scalar, vector and array structured values. Each has a templated
// constructor that takes a name and an optional pack of additional
// parameters. The constructor calls the BaseType class constructor
// with the name, order of the state based on scalar value, vector or array
// size, the size of the unit type and the pack of additional parameters.

// Partial specialization for a scalar state class of ElementType.
template <typename BaseType, typename ElementType, typename SourceOperandType,
          typename DestinationOperandType>
class StateItem<BaseType, ElementType, SourceOperandType,
                DestinationOperandType> : public BaseType {
 public:
  using ValueType = ElementType;
  template <typename... Ps>
  explicit StateItem(ArchState *arch_state, absl::string_view name, Ps... pargs)
      : BaseType(arch_state, name, {1}, sizeof(ElementType), pargs...) {}
  virtual SourceOperandInterface *CreateSourceOperand() {
    return new SourceOperandType(this);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(int latency) {
    return new DestinationOperandType(this, latency);
  }
  virtual SourceOperandInterface *CreateSourceOperand(std::string op_name) {
    return new SourceOperandType(this, op_name);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(
      int latency, std::string op_name) {
    return new DestinationOperandType(this, latency, op_name);
  }
};

// Partial specialization for a longer "scalar" register using an array of
// element type. The element type should be uint8_t (so it is a byte array).
template <typename BaseType, typename ElementType, typename SourceOperandType,
          typename DestinationOperandType>
class StateItem<BaseType, ElementType *, SourceOperandType,
                DestinationOperandType> : public BaseType {
 public:
  using ValueType = ElementType;
  template <typename... Ps>
  explicit StateItem(ArchState *arch_state, absl::string_view name, int width,
                     Ps... pargs)
      : BaseType(arch_state, name, {width}, sizeof(ElementType), pargs...) {
    static_assert(std::is_same<ElementType, uint8_t>::value,
                  "Element type must be 'uint8_t'");
  }
  virtual SourceOperandInterface *CreateSourceOperand() {
    return new SourceOperandType(this);
  }
  virtual SourceOperandInterface *CreateSourceOperand(std::string op_name) {
    return new SourceOperandType(this, op_name);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(
      int latency, std::string op_name) {
    return new DestinationOperandType(this, latency, op_name);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(int latency) {
    return new DestinationOperandType(this, latency);
  }
};

// Specialization used when there is no Destination operand type (i.e., it is
// void).
template <typename BaseType, typename ElementType, typename SourceOperandType>
class StateItem<BaseType, ElementType, SourceOperandType, void>
    : public BaseType {
 public:
  using ValueType = ElementType;
  template <typename... Ps>
  explicit StateItem(ArchState *arch_state, absl::string_view name, Ps... pargs)
      : BaseType(arch_state, name, {1}, sizeof(ElementType), pargs...) {}
  virtual SourceOperandInterface *CreateSourceOperand() {
    return new SourceOperandType(this);
  }
  virtual SourceOperandInterface *CreateSourceOperand(std::string op_name) {
    return new SourceOperandType(this, op_name);
  }
};

// Partial specialization for a N length vector state class of ElementType.
template <typename BaseType, typename ElementType, typename SourceOperandType,
          typename DestinationOperandType, int N>
class StateItem<BaseType, ElementType, SourceOperandType,
                DestinationOperandType, N> : public BaseType {
 public:
  using ValueType = ElementType;
  static constexpr int kNumDimensions = 1;
  static constexpr int kShape[] = {N};
  template <typename... Ps>
  explicit StateItem(ArchState *arch_state, absl::string_view name, Ps... pargs)
      : BaseType(arch_state, name, {N}, sizeof(ElementType), pargs...) {}
  // Source/destination operand creation interface.
  virtual SourceOperandInterface *CreateSourceOperand() {
    return new SourceOperandType(this);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(int latency) {
    return new DestinationOperandType(this, latency);
  }
  virtual SourceOperandInterface *CreateSourceOperand(std::string op_name) {
    return new SourceOperandType(this, op_name);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(
      int latency, std::string op_name) {
    return new DestinationOperandType(this, latency, op_name);
  }
};

// Partial specialization for a MxN size matrix state class of ElementType.
template <typename BaseType, typename ElementType, typename SourceOperandType,
          typename DestinationOperandType, int M, int N>
class StateItem<BaseType, ElementType, SourceOperandType,
                DestinationOperandType, M, N> : public BaseType {
 public:
  using ValueType = ElementType;
  static constexpr int kNumDimensions = 2;
  static constexpr int kShape[] = {M, N};
  template <typename... Ps>
  explicit StateItem(ArchState *arch_state, absl::string_view name, Ps... pargs)
      : BaseType(arch_state, name, {M, N}, sizeof(ElementType), pargs...) {}
  virtual SourceOperandInterface *CreateSourceOperand() {
    return new SourceOperandType(this);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(int latency) {
    return new DestinationOperandType(this, latency);
  }
  virtual SourceOperandInterface *CreateSourceOperand(std::string op_name) {
    return new SourceOperandType(this, op_name);
  }
  virtual DestinationOperandInterface *CreateDestinationOperand(
      int latency, std::string op_name) {
    return new DestinationOperandType(this, latency, op_name);
  }
};

}  // namespace generic
}  // namespace sim
}  // namespace mpact

#endif  // MPACT_SIM_GENERIC_STATE_ITEM_H_
