kimchi_msm/ffa/
columns.rs

1use crate::columns::{Column, ColumnIndexer};
2
3use crate::N_LIMBS;
4
5/// Number of columns in the FFA circuits.
6pub const FFA_N_COLUMNS: usize = 5 * N_LIMBS;
7pub const FFA_NPUB_COLUMNS: usize = N_LIMBS;
8
9/// Column indexer for MSM columns.
10///
11/// They represent the equation
12///   `InputA(i) + InputB(i) = ModulusF(i) * Quotient + Carry(i) * 2^LIMB_SIZE - Carry(i-1)`
13#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
14pub enum FFAColumn {
15    InputA(usize),
16    InputB(usize),
17    ModulusF(usize),
18    Remainder(usize),
19    Carry(usize),
20    Quotient,
21}
22
23impl ColumnIndexer<usize> for FFAColumn {
24    const N_COL: usize = FFA_N_COLUMNS;
25    fn to_column(self) -> Column<usize> {
26        let to_column_inner = |offset, i| {
27            assert!(i < N_LIMBS);
28            Column::Relation(N_LIMBS * offset + i)
29        };
30        match self {
31            FFAColumn::InputA(i) => to_column_inner(0, i),
32            FFAColumn::InputB(i) => to_column_inner(1, i),
33            FFAColumn::ModulusF(i) => to_column_inner(2, i),
34            FFAColumn::Remainder(i) => to_column_inner(3, i),
35            FFAColumn::Carry(i) => {
36                assert!(i < N_LIMBS - 1);
37                to_column_inner(4, i)
38            }
39            FFAColumn::Quotient => to_column_inner(4, N_LIMBS - 1),
40        }
41    }
42}