pub const NOP: u32 = 0;
pub const STORE_U32: u32 = 1;
pub const ATOMIC_ADD: u32 = 2;
pub const LOAD_U32: u32 = 3;
pub const COMPARE_SWAP: u32 = 4;
pub const MEMCPY: u32 = 5;
pub const DFA_STEP: u32 = 6;
pub const BATCH_FENCE: u32 = 7;
pub const LOAD_MISS: u32 = 0x0000_FFFD;
#[deprecated(
since = "0.5.0",
note = "vyre is a generic GPU substrate - use `LOAD_MISS`. The wire \
format is unchanged; only the symbolic name moves."
)]
pub const EXPERT_LOAD_MISS: u32 = LOAD_MISS;
pub const PACKED_SLOT: u32 = 0x8000_0001;
pub const PRINTF: u32 = 0x0000_FFFE;
pub const SHUTDOWN: u32 = u32::MAX;
pub const SYSTEM_MASK: u32 = 0x8000_0000;
pub const RESERVED_MAX_RANGE_MIN: u32 = 0x0000_FFF0;
#[must_use]
pub const fn is_system(op: u32) -> bool {
(op & SYSTEM_MASK) != 0
|| (op >= RESERVED_MAX_RANGE_MIN && op <= 0x0000_FFFF)
|| op <= BATCH_FENCE
}
#[must_use]
pub const fn is_builtin(op: u32) -> bool {
op <= BATCH_FENCE || op == PACKED_SLOT || op == PRINTF || op == SHUTDOWN
}
pub const fn validate_user_opcode(op: u32) -> Result<(), &'static str> {
if is_system(op) {
Err("User opcode overlaps with reserved system range or uses the high bit.")
} else {
Ok(())
}
}
pub const fn validate_publish_opcode(op: u32) -> Result<(), &'static str> {
if is_builtin(op) {
Ok(())
} else {
validate_user_opcode(op)
}
}
const _: () = {
let opcodes = [
NOP,
STORE_U32,
ATOMIC_ADD,
LOAD_U32,
COMPARE_SWAP,
MEMCPY,
DFA_STEP,
BATCH_FENCE,
LOAD_MISS,
PACKED_SLOT,
PRINTF,
SHUTDOWN,
];
let mut i = 0;
while i < opcodes.len() {
let mut j = i + 1;
while j < opcodes.len() {
assert!(opcodes[i] != opcodes[j], "Duplicate opcode");
j += 1;
}
assert!(is_system(opcodes[i]), "Opcode is not system");
i += 1;
}
};