diff --git a/evm/src/all_stark.rs b/evm/src/all_stark.rs index d355bdae..4c36b5b6 100644 --- a/evm/src/all_stark.rs +++ b/evm/src/all_stark.rs @@ -107,9 +107,9 @@ mod tests { looking_tables: vec![TableWithColumns::new( Table::Cpu, vec![cpu::columns::OPCODE], - None, + vec![], )], - looked_table: TableWithColumns::new(Table::Keccak, vec![keccak_looked_col], None), + looked_table: TableWithColumns::new(Table::Keccak, vec![keccak_looked_col], vec![]), default, }]; diff --git a/evm/src/cross_table_lookup.rs b/evm/src/cross_table_lookup.rs index be4c0371..c5a0e20a 100644 --- a/evm/src/cross_table_lookup.rs +++ b/evm/src/cross_table_lookup.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use anyhow::{ensure, Result}; use plonky2::field::extension_field::{Extendable, FieldExtension}; use plonky2::field::field_types::Field; @@ -22,17 +24,24 @@ use crate::vars::{StarkEvaluationTargets, StarkEvaluationVars}; #[derive(Clone)] pub struct TableWithColumns { - pub table: Table, - pub columns: Vec, - pub filter_column: Option, + table: Table, + columns: Vec, + /// Vector of columns `{c_1,...,c_k}` used as a filter using the sum `c_1 + ... + c_k`. + /// An empty vector corresponds to no filter. + filter_columns: Vec, } impl TableWithColumns { - pub fn new(table: Table, columns: Vec, filter_column: Option) -> Self { + pub fn new(table: Table, columns: Vec, filter_columns: Vec) -> Self { + debug_assert_eq!( + filter_columns.iter().collect::>().len(), + filter_columns.len(), + "Duplicate filter columns." + ); Self { table, columns, - filter_column, + filter_columns, } } }