openvm_instructions/
lib.rs#![allow(non_camel_case_types)]
use openvm_instructions_derive::LocalOpcode;
use openvm_stark_backend::p3_field::Field;
use serde::{Deserialize, Serialize};
use strum_macros::{EnumCount, EnumIter, FromRepr};
pub mod exe;
pub mod instruction;
mod phantom;
pub mod program;
pub mod riscv;
pub mod utils;
pub use phantom::*;
pub trait LocalOpcode {
const CLASS_OFFSET: usize;
fn from_usize(value: usize) -> Self;
fn local_usize(&self) -> usize;
fn global_opcode(&self) -> VmOpcode {
VmOpcode::from_usize(self.local_usize() + Self::CLASS_OFFSET)
}
}
#[repr(C)]
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, derive_new::new, Serialize, Deserialize)]
pub struct VmOpcode(usize);
impl VmOpcode {
pub fn local_opcode_idx(&self, offset: usize) -> usize {
self.as_usize() - offset
}
pub fn as_usize(&self) -> usize {
self.0
}
pub fn from_usize(value: usize) -> Self {
Self(value)
}
pub fn to_field<F: Field>(&self) -> F {
F::from_canonical_usize(self.as_usize())
}
}
impl std::fmt::Display for VmOpcode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(
Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, EnumCount, EnumIter, FromRepr, LocalOpcode,
)]
#[opcode_offset = 0]
#[repr(usize)]
pub enum SystemOpcode {
TERMINATE,
PHANTOM,
}
#[derive(
Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, EnumCount, EnumIter, FromRepr, LocalOpcode,
)]
#[opcode_offset = 0x020]
#[repr(usize)]
pub enum PublishOpcode {
PUBLISH,
}
#[derive(
Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, EnumCount, EnumIter, FromRepr, LocalOpcode,
)]
#[opcode_offset = 0xdeadaf]
#[repr(usize)]
pub enum UnimplementedOpcode {
REPLACE_ME,
}