blob: b74c901037a0e063b9a59ba82ee52d10ec845824 [file]
#ifndef MPACT_SIM_UTIL_MEMORY_TEST_DUMMY_MEMORY_H_
#define MPACT_SIM_UTIL_MEMORY_TEST_DUMMY_MEMORY_H_
#include <cstdint>
#include "absl/status/status.h"
#include "mpact/sim/generic/data_buffer.h"
#include "mpact/sim/generic/instruction.h"
#include "mpact/sim/generic/ref_count.h"
#include "mpact/sim/util/memory/memory_interface.h"
#include "mpact/sim/util/memory/tagged_memory_interface.h"
namespace mpact::sim::util::test {
using ::mpact::sim::generic::DataBuffer;
using ::mpact::sim::generic::DataBufferFactory;
using ::mpact::sim::generic::Instruction;
using ::mpact::sim::generic::ReferenceCount;
using ::mpact::sim::util::AtomicMemoryOpInterface;
using ::mpact::sim::util::MemoryInterface;
using ::mpact::sim::util::TaggedMemoryInterface;
// Define a class that implements the memory interfaces, but only captures the
// memory addresses used in accesses.
class DummyMemory : public TaggedMemoryInterface,
public AtomicMemoryOpInterface {
public:
DummyMemory() = default;
~DummyMemory() override = default;
// Memory interface methods.
// Plain load.
void Load(uint64_t address, DataBuffer *db, Instruction *inst,
ReferenceCount *context) override {
load_address_ = address;
}
// Vector load.
void Load(DataBuffer *address_db, DataBuffer *mask_db, int el_size,
DataBuffer *db, Instruction *inst,
ReferenceCount *context) override {
vector_load_address_ = address_db->Get<uint64_t>(0);
}
// Tagged load.
void Load(uint64_t address, DataBuffer *db, DataBuffer *tags,
Instruction *inst, ReferenceCount *context) override {
tagged_load_address_ = address;
}
// Plain store.
void Store(uint64_t address, DataBuffer *db) override {
store_address_ = address;
}
// Vector store.
void Store(DataBuffer *address_db, DataBuffer *mask_db, int el_size,
DataBuffer *db) override {
vector_store_address_ = address_db->Get<uint64_t>(0);
}
// Tagged store.
void Store(uint64_t address, DataBuffer *db, DataBuffer *tags) override {
tagged_store_address_ = address;
}
// Atomic memory operation.
absl::Status PerformMemoryOp(uint64_t address, Operation op, DataBuffer *db,
Instruction *inst,
ReferenceCount *context) override {
memory_op_address_ = address;
return absl::OkStatus();
}
void ClearValues() {
load_address_ = 0;
store_address_ = 0;
vector_load_address_ = 0;
vector_store_address_ = 0;
tagged_load_address_ = 0;
tagged_store_address_ = 0;
memory_op_address_ = 0;
}
// Accessors.
uint64_t load_address() const { return load_address_; }
uint64_t store_address() const { return store_address_; }
uint64_t vector_load_address() const { return vector_load_address_; }
uint64_t vector_store_address() const { return vector_store_address_; }
uint64_t tagged_load_address() const { return tagged_load_address_; }
uint64_t tagged_store_address() const { return tagged_store_address_; }
uint64_t memory_op_address() const { return memory_op_address_; }
private:
uint64_t load_address_ = 0;
uint64_t store_address_ = 0;
uint64_t vector_load_address_ = 0;
uint64_t vector_store_address_ = 0;
uint64_t tagged_load_address_ = 0;
uint64_t tagged_store_address_ = 0;
uint64_t memory_op_address_ = 0;
};
} // namespace mpact::sim::util::test
#endif // MPACT_SIM_UTIL_MEMORY_TEST_DUMMY_MEMORY_H_