Skip to content

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 &param);

  ~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