sp1_recursion_core/air/
range_check.rs

1use p3_field::Field;
2use serde::{Deserialize, Serialize};
3
4/// The number of different range check operations.
5pub const NUM_RANGE_CHECK_OPS: usize = 2;
6
7/// A byte opcode which the chip can process.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
9pub enum RangeCheckOpcode {
10    /// U12 range check
11    U12 = 0,
12
13    /// U16 range check
14    U16 = 1,
15}
16
17impl RangeCheckOpcode {
18    /// Get all the range check opcodes.
19    pub fn all() -> Vec<Self> {
20        let opcodes = vec![RangeCheckOpcode::U12, RangeCheckOpcode::U16];
21        assert_eq!(opcodes.len(), NUM_RANGE_CHECK_OPS);
22        opcodes
23    }
24
25    /// Convert the opcode to a field element.
26    pub fn as_field<F: Field>(self) -> F {
27        F::from_canonical_u8(self as u8)
28    }
29}