//! Fixed-width register access through live Device capabilities.
use super::abi;

/// Compiler primitive for one checked 8-bit register read.
@intrinsic fn deviceRead8(handle: u64, offset: u64) -> u8;
/// Compiler primitive for one checked 8-bit register write.
@intrinsic fn deviceWrite8(handle: u64, offset: u64, value: u8);

/// Read an aligned 8-bit register at a byte offset within the device.
export fn read8(handle: abi::Handle, offset: u64) -> u8 {
    return deviceRead8(*handle, offset);
}

/// Write an aligned 8-bit register at a byte offset within the device.
export fn write8(handle: abi::Handle, offset: u64, value: u8) {
    deviceWrite8(*handle, offset, value);
}

/// Compiler primitive for one checked 16-bit register read.
@intrinsic fn deviceRead16(handle: u64, offset: u64) -> u16;
/// Compiler primitive for one checked 16-bit register write.
@intrinsic fn deviceWrite16(handle: u64, offset: u64, value: u16);

/// Read an aligned 16-bit register at a byte offset within the device.
export fn read16(handle: abi::Handle, offset: u64) -> u16 {
    return deviceRead16(*handle, offset);
}

/// Write an aligned 16-bit register at a byte offset within the device.
export fn write16(handle: abi::Handle, offset: u64, value: u16) {
    deviceWrite16(*handle, offset, value);
}

/// Compiler primitive for one checked 32-bit register read.
@intrinsic fn deviceRead32(handle: u64, offset: u64) -> u32;
/// Compiler primitive for one checked 32-bit register write.
@intrinsic fn deviceWrite32(handle: u64, offset: u64, value: u32);

/// Read an aligned 32-bit register at a byte offset within the device.
export fn read32(handle: abi::Handle, offset: u64) -> u32 {
    return deviceRead32(*handle, offset);
}

/// Write an aligned 32-bit register at a byte offset within the device.
export fn write32(handle: abi::Handle, offset: u64, value: u32) {
    deviceWrite32(*handle, offset, value);
}

/// Compiler primitive for one checked 64-bit register read.
@intrinsic fn deviceRead64(handle: u64, offset: u64) -> u64;
/// Compiler primitive for one checked 64-bit register write.
@intrinsic fn deviceWrite64(handle: u64, offset: u64, value: u64);

/// Read an aligned 64-bit register at a byte offset within the device.
export fn read64(handle: abi::Handle, offset: u64) -> u64 {
    return deviceRead64(*handle, offset);
}

/// Write an aligned 64-bit register at a byte offset within the device.
export fn write64(handle: abi::Handle, offset: u64, value: u64) {
    deviceWrite64(*handle, offset, value);
}
