1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use p3_field::Field;
use serde::{Deserialize, Serialize};

use crate::range_check::NUM_RANGE_CHECK_OPS;

/// A byte opcode which the chip can process.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub enum RangeCheckOpcode {
    /// U12 range check
    U12 = 0,

    /// U16 range check
    U16 = 1,
}

impl RangeCheckOpcode {
    /// Get all the range check opcodes.
    pub fn all() -> Vec<Self> {
        let opcodes = vec![RangeCheckOpcode::U12, RangeCheckOpcode::U16];
        assert_eq!(opcodes.len(), NUM_RANGE_CHECK_OPS);
        opcodes
    }

    /// Convert the opcode to a field element.
    pub fn as_field<F: Field>(self) -> F {
        F::from_canonical_u8(self as u8)
    }
}