use p3_field::Field;
use serde::{Deserialize, Serialize};
use crate::{bytes::NUM_BYTE_OPS, runtime::Opcode};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum ByteOpcode {
AND = 0,
OR = 1,
XOR = 2,
SLL = 3,
U8Range = 4,
ShrCarry = 5,
LTU = 6,
MSB = 7,
U16Range = 8,
}
impl ByteOpcode {
pub fn all() -> Vec<Self> {
let opcodes = vec![
ByteOpcode::AND,
ByteOpcode::OR,
ByteOpcode::XOR,
ByteOpcode::SLL,
ByteOpcode::U8Range,
ByteOpcode::ShrCarry,
ByteOpcode::LTU,
ByteOpcode::MSB,
ByteOpcode::U16Range,
];
assert_eq!(opcodes.len(), NUM_BYTE_OPS);
opcodes
}
pub fn as_field<F: Field>(self) -> F {
F::from_canonical_u8(self as u8)
}
}
impl From<Opcode> for ByteOpcode {
fn from(value: Opcode) -> Self {
match value {
Opcode::AND => Self::AND,
Opcode::OR => Self::OR,
Opcode::XOR => Self::XOR,
Opcode::SLL => Self::SLL,
_ => panic!("Invalid opcode for ByteChip: {:?}", value),
}
}
}