blob: daf9e00306c1ff58cbdfc5d2aa9f7f43c22a3883 [file]
// Copyright 2025 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_WRAPPER_OPERAND_H_
#define MPACT_SIM_GENERIC_WRAPPER_OPERAND_H_
#include <any>
#include <cstdint>
#include <string>
#include <vector>
#include "mpact/sim/generic/data_buffer.h"
#include "mpact/sim/generic/operand_interface.h"
namespace mpact {
namespace sim {
namespace generic {
// Source operand interface for used to wrap a pointer to a value of type T.
// This class is used to provide the means to access the underlying object
// itself using the GetObject() method. None of the other methods are intended
// to be used.
template <typename T>
class WrapperSourceOperand : public SourceOperandInterface {
public:
WrapperSourceOperand(T* value, const std::vector<int>& shape)
: value_(value), shape_(shape) {}
WrapperSourceOperand() = delete;
WrapperSourceOperand(const WrapperSourceOperand&) = delete;
WrapperSourceOperand& operator=(const WrapperSourceOperand&) = delete;
bool AsBool(int index) override { return false; }
int8_t AsInt8(int index) override { return 0; }
uint8_t AsUint8(int index) override { return 0; }
int16_t AsInt16(int index) override { return 0; }
uint16_t AsUint16(int) override { return 0; }
int32_t AsInt32(int index) override { return 0; }
uint32_t AsUint32(int index) override { return 0; }
int64_t AsInt64(int index) override { return 0; }
uint64_t AsUint64(int index) override { return 0; }
// Return a pointer to the MR object.
std::any GetObject() const override { return std::any(value_); }
// Return the shape of the MR.
std::vector<int> shape() const override { return shape_; }
// Return the name of the MR.
std::string AsString() const override { return value_->AsString(); }
private:
T* value_;
std::vector<int> shape_;
};
// Destination operand interface for object of type T. This class is used to
// provide the means to access the underlying object itself using the
// GetObject() method. None of the other methods are intended to be used.
template <typename T>
class WrapperDestinationOperand : public DestinationOperandInterface {
public:
WrapperDestinationOperand(T* value, const std::vector<int>& shape)
: value_(value), shape_(shape) {}
WrapperDestinationOperand() = delete;
WrapperDestinationOperand(const WrapperDestinationOperand&) = delete;
WrapperDestinationOperand& operator=(const WrapperDestinationOperand&) =
delete;
~WrapperDestinationOperand() override = default;
DataBuffer* AllocateDataBuffer() override { return nullptr; }
void InitializeDataBuffer(DataBuffer* db) override { /* Do nothing. */ }
DataBuffer* CopyDataBuffer() override { return nullptr; }
int latency() const override { return 0; }
// Return a pointer to the MR object.
std::any GetObject() const override { return std::any(value_); }
// Return the shape of the MR.
std::vector<int> shape() const override { return shape_; }
// Return the name of the MR.
std::string AsString() const override { return value_->AsString(); }
private:
T* value_;
std::vector<int> shape_;
};
} // namespace generic
} // namespace sim
} // namespace mpact
#endif // MPACT_SIM_GENERIC_WRAPPER_OPERAND_H_