// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/lib/testing/mock_mmio.h"

#include "sw/device/lib/base/mmio.h"

namespace mock_mmio {
std::random_device MockDevice::rd;

// Definitions for the MOCK_MMIO-mode declarations in |mmio.h|.
extern "C" {
uint8_t mmio_region_read8(mmio_region_t base, ptrdiff_t offset) {
  auto *dev = static_cast<MockDevice *>(base.mock);
  return dev->Read8(offset);
}

uint16_t mmio_region_read16(mmio_region_t base, ptrdiff_t offset) {
  auto *dev = static_cast<MockDevice *>(base.mock);
  return dev->Read16(offset);
}

uint32_t mmio_region_read32(mmio_region_t base, ptrdiff_t offset) {
  auto *dev = static_cast<MockDevice *>(base.mock);
  return dev->Read32(offset);
}

void mmio_region_write8(mmio_region_t base, ptrdiff_t offset, uint8_t value) {
  auto *dev = static_cast<MockDevice *>(base.mock);
  dev->Write8(offset, value);
}

void mmio_region_write16(mmio_region_t base, ptrdiff_t offset, uint16_t value) {
  auto *dev = static_cast<MockDevice *>(base.mock);
  dev->Write16(offset, value);
}

void mmio_region_write32(mmio_region_t base, ptrdiff_t offset, uint32_t value) {
  auto *dev = static_cast<MockDevice *>(base.mock);
  dev->Write32(offset, value);
}
}  // extern "C"
}  // namespace mock_mmio
