o1vm/interpreters/keccak/
helpers.rs1use crate::{
2    interpreters::keccak::interpreter::Interpreter,
3    lookups::{Lookup, LookupTableIDs::*},
4};
5use ark_ff::{One, Zero};
6use std::fmt::Debug;
7
8pub trait LogupHelpers<F: One + Debug + Zero>
11where
12    Self: Interpreter<F>,
13{
14    fn lookup_rc16(&mut self, flag: Self::Variable, value: Self::Variable) {
16        self.add_lookup(flag, Lookup::read_one(RangeCheck16Lookup, vec![value]));
17    }
18
19    fn lookup_reset(
21        &mut self,
22        flag: Self::Variable,
23        dense: Self::Variable,
24        sparse: Self::Variable,
25    ) {
26        self.add_lookup(flag, Lookup::read_one(ResetLookup, vec![dense, sparse]));
27    }
28
29    fn lookup_sparse(&mut self, flag: Self::Variable, value: Self::Variable) {
31        self.add_lookup(flag, Lookup::read_one(SparseLookup, vec![value]));
32    }
33
34    fn lookup_byte(&mut self, flag: Self::Variable, value: Self::Variable) {
36        self.add_lookup(flag, Lookup::read_one(ByteLookup, vec![value]));
37    }
38
39    fn lookup_pad(&mut self, flag: Self::Variable, value: Vec<Self::Variable>) {
41        self.add_lookup(flag, Lookup::read_one(PadLookup, value));
42    }
43
44    fn lookup_round_constants(&mut self, flag: Self::Variable, value: Vec<Self::Variable>) {
46        self.add_lookup(flag, Lookup::read_one(RoundConstantsLookup, value));
47    }
48
49    fn read_syscall(&mut self, flag: Self::Variable, value: Vec<Self::Variable>) {
50        self.add_lookup(flag, Lookup::read_one(SyscallLookup, value));
51    }
52
53    fn write_syscall(&mut self, flag: Self::Variable, value: Vec<Self::Variable>) {
54        self.add_lookup(flag, Lookup::write_one(SyscallLookup, value));
55    }
56}
57
58pub trait BoolHelpers<F: One + Debug + Zero>
60where
61    Self: Interpreter<F>,
62{
63    fn is_boolean(x: Self::Variable) -> Self::Variable {
65        x.clone() * (x - Self::Variable::one())
66    }
67
68    fn not(x: Self::Variable) -> Self::Variable {
71        Self::Variable::one() - x
72    }
73
74    fn is_one(x: Self::Variable) -> Self::Variable {
76        Self::not(x)
77    }
78
79    fn is_nonzero(x: Self::Variable, x_inv: Self::Variable) -> Self::Variable {
83        Self::is_one(x * x_inv)
84    }
85
86    fn is_zero(
94        x: Self::Variable,
95        x_inv: Self::Variable,
96        z: Self::Variable,
97    ) -> (Self::Variable, Self::Variable) {
98        (
99            x.clone() * x_inv.clone() - z.clone() + Self::Variable::one(),
100            x * z,
101        )
102    }
103
104    fn xor(x: Self::Variable, y: Self::Variable) -> Self::Variable {
106        x.clone() + y.clone() - Self::constant(2) * x * y
107    }
108
109    fn or(x: Self::Variable, y: Self::Variable) -> Self::Variable {
111        x.clone() + y.clone() - x * y
112    }
113
114    fn either_zero(x: Self::Variable, y: Self::Variable) -> Self::Variable {
116        x * y
117    }
118}
119
120pub trait ArithHelpers<F: One + Debug + Zero>
122where
123    Self: Interpreter<F>,
124{
125    fn zero() -> Self::Variable {
127        Self::constant(0)
128    }
129    fn one() -> Self::Variable {
131        Self::constant(1)
132    }
133    fn two() -> Self::Variable {
135        Self::constant(2)
136    }
137
138    fn two_pow(x: u64) -> Self::Variable;
140}