// 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_TOKEN_FIFO_H_
#define MPACT_SIM_GENERIC_TOKEN_FIFO_H_

#include <vector>

#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "mpact/sim/generic/arch_state.h"
#include "mpact/sim/generic/data_buffer.h"
#include "mpact/sim/generic/fifo.h"
#include "mpact/sim/generic/program_error.h"
#include "mpact/sim/generic/state_item.h"
#include "mpact/sim/generic/state_item_base.h"

// Contains the definition for classes required to model a group of fifos that
// operate independently except that their total capacity is based on a shared
// resource (RAM), so that the total size of all the fifos sharing the resource
// cannot exceed the size of the resource.

namespace mpact {
namespace sim {
namespace generic {

// The fifo uses a token based approach. Each token allows for one element to
// be pushed into the fifo. The token is released when the element is pop'ed
// off the fifo and returned to the token store.

class FifoTokenStore {
 public:
  explicit FifoTokenStore(unsigned size) : capacity_(size), available_(size) {}

  absl::Status Acquire();
  absl::Status Release();
  unsigned available() const { return available_; }
  unsigned capacity() const { return capacity_; }

 private:
  unsigned capacity_;
  unsigned available_;
};

class TokenFifoBase : public FifoBase {
 protected:
  TokenFifoBase(ArchState *arch_state, absl::string_view name,
                const std::vector<int> &shape, int element_size,
                unsigned capacity, FifoTokenStore *tokens);
  TokenFifoBase() = delete;
  TokenFifoBase(const TokenFifoBase &) = delete;

 public:
  bool IsOverSubscribed() const override;
  bool IsFull() const override;
  bool Push(DataBuffer *db) override;
  void Pop() override;

 private:
  FifoTokenStore *token_store_;
};

template <typename ElementType>
using TokenFifo =
    StateItem<TokenFifoBase, ElementType, FifoSourceOperand<ElementType>,
              FifoDestinationOperand<ElementType>>;

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

#endif  // MPACT_SIM_GENERIC_TOKEN_FIFO_H_
