kimchi_msm/test/test_circuit/
lookups.rs1use crate::logup::LookupTableID;
2use ark_ff::PrimeField;
3use num_bigint::BigUint;
4use o1_utils::FieldHelpers;
5use strum_macros::EnumIter;
6
7#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq, Ord, PartialOrd, EnumIter)]
8pub enum LookupTable {
9 RangeCheck15,
11 RuntimeTable1,
13 RuntimeTable2,
15}
16
17impl LookupTableID for LookupTable {
18 fn to_u32(&self) -> u32 {
19 match self {
20 Self::RangeCheck15 => 1,
21 Self::RuntimeTable1 => 2,
22 Self::RuntimeTable2 => 3,
23 }
24 }
25
26 fn from_u32(value: u32) -> Self {
27 match value {
28 1 => Self::RangeCheck15,
29 2 => Self::RuntimeTable1,
30 3 => Self::RuntimeTable2,
31 _ => panic!("Invalid lookup table id"),
32 }
33 }
34
35 fn is_fixed(&self) -> bool {
36 match self {
37 Self::RangeCheck15 => true,
38 Self::RuntimeTable1 => false,
39 Self::RuntimeTable2 => false,
40 }
41 }
42
43 fn runtime_create_column(&self) -> bool {
44 match self {
45 Self::RuntimeTable1 => true,
46 Self::RuntimeTable2 => false,
47 _ => panic!("runtime_create_column was called on a non-runtime table"),
48 }
49 }
50
51 fn length(&self) -> usize {
52 match self {
53 Self::RangeCheck15 => 1 << 15,
54 Self::RuntimeTable1 => 1 << 15,
55 Self::RuntimeTable2 => 1 << 15,
56 }
57 }
58
59 fn ix_by_value<F: PrimeField>(&self, value: &[F]) -> Option<usize> {
61 let value = value[0];
62 if self.is_fixed() {
63 assert!(self.is_member(value).unwrap());
64 }
65
66 match self {
67 Self::RangeCheck15 => Some(TryFrom::try_from(value.to_biguint()).unwrap()),
68 Self::RuntimeTable1 => None,
69 Self::RuntimeTable2 => None,
70 }
71 }
72
73 fn all_variants() -> Vec<Self> {
74 vec![Self::RangeCheck15, Self::RuntimeTable1, Self::RuntimeTable2]
75 }
76}
77
78impl LookupTable {
79 pub fn entries<F: PrimeField>(&self, domain_d1_size: u64) -> Option<Vec<F>> {
81 assert!(domain_d1_size >= (1 << 15));
82 match self {
83 Self::RangeCheck15 => Some((0..domain_d1_size).map(|i| F::from(i)).collect()),
84 _ => panic!("not possible"),
85 }
86 }
87
88 pub fn is_member<F: PrimeField>(&self, value: F) -> Option<bool> {
90 match self {
91 Self::RangeCheck15 => Some(value.to_biguint() < BigUint::from(2u128.pow(15))),
92 Self::RuntimeTable1 => None,
93 Self::RuntimeTable2 => None,
94 }
95 }
96}