vyre_runtime/megakernel/protocol/
opcode.rs1pub const NOP: u32 = 0;
3pub const STORE_U32: u32 = 1;
5pub const ATOMIC_ADD: u32 = 2;
7pub const LOAD_U32: u32 = 3;
9pub const COMPARE_SWAP: u32 = 4;
11pub const MEMCPY: u32 = 5;
13pub const DFA_STEP: u32 = 6;
15pub const BATCH_FENCE: u32 = 7;
17pub const LOAD_MISS: u32 = 0x0000_FFFD;
23#[deprecated(
27 since = "0.5.0",
28 note = "vyre is a generic GPU substrate - use `LOAD_MISS`. The wire \
29 format is unchanged; only the symbolic name moves."
30)]
31pub const EXPERT_LOAD_MISS: u32 = LOAD_MISS;
32pub const PACKED_SLOT: u32 = 0x8000_0001;
34pub const PRINTF: u32 = 0x0000_FFFE;
36pub const SHUTDOWN: u32 = u32::MAX;
38pub const SYSTEM_MASK: u32 = 0x8000_0000;
40pub const RESERVED_MAX_RANGE_MIN: u32 = 0x0000_FFF0;
42
43#[must_use]
45pub const fn is_system(op: u32) -> bool {
46 (op & SYSTEM_MASK) != 0
47 || (op >= RESERVED_MAX_RANGE_MIN && op <= 0x0000_FFFF)
48 || op <= BATCH_FENCE
49}
50
51#[must_use]
53pub const fn is_builtin(op: u32) -> bool {
54 op <= BATCH_FENCE || op == PACKED_SLOT || op == PRINTF || op == SHUTDOWN
55}
56
57pub const fn validate_user_opcode(op: u32) -> Result<(), &'static str> {
63 if is_system(op) {
64 Err("User opcode overlaps with reserved system range or uses the high bit.")
65 } else {
66 Ok(())
67 }
68}
69
70pub const fn validate_publish_opcode(op: u32) -> Result<(), &'static str> {
72 if is_builtin(op) {
73 Ok(())
74 } else {
75 validate_user_opcode(op)
76 }
77}
78
79const _: () = {
80 let opcodes = [
81 NOP,
82 STORE_U32,
83 ATOMIC_ADD,
84 LOAD_U32,
85 COMPARE_SWAP,
86 MEMCPY,
87 DFA_STEP,
88 BATCH_FENCE,
89 LOAD_MISS,
90 PACKED_SLOT,
91 PRINTF,
92 SHUTDOWN,
93 ];
94 let mut i = 0;
95 while i < opcodes.len() {
96 let mut j = i + 1;
97 while j < opcodes.len() {
98 assert!(opcodes[i] != opcodes[j], "Duplicate opcode");
99 j += 1;
100 }
101 assert!(is_system(opcodes[i]), "Opcode is not system");
102 i += 1;
103 }
104};