File data_array.h
File List > cache > data_array.h
Go to the documentation of this file
#pragma once
#include <simtix/mem.h>
namespace simtix {
namespace mem {
class DataArray {
public:
explicit DataArray(const Cache::Param ¶m);
~DataArray();
// Handle a core request
bool Read(Cache::Payload payload, uint32_t way);
bool Write(Cache::Payload payload, uint32_t way);
// Read/Fill a line
void Read(uint64_t addr, uint8_t *line, uint32_t way);
void Write(uint64_t addr, uint8_t *line, uint32_t way);
bool IsOutOfBound(uint64_t addr, size_t size) {
return size > kBlockSizeBytes ||
ToLineAddr(addr) != ToLineAddr(addr + size - 1);
}
protected:
inline uint64_t ToLineAddr(uint64_t addr) { return addr / kBlockSizeBytes; }
inline uint32_t ToLineOffset(uint64_t addr) { return addr % kBlockSizeBytes; }
inline uint64_t ToBankAddr(uint64_t addr) {
return ToLineAddr(addr) / kBanks;
}
inline uint32_t ToSetIndex(uint64_t addr) { return ToBankAddr(addr) % kSets; }
uint8_t *GetWay(uint64_t addr, uint32_t way) {
return &arr_[(ToSetIndex(addr) * kWays + way) * kBlockSizeBytes];
}
const size_t kSizeBytes;
const size_t kBlockSizeBytes;
const uint8_t kWays;
const size_t kSets;
const size_t kBanks;
uint8_t *arr_;
};
} // namespace mem
} // namespace simtix