diff --git a/plonky2/src/gadgets/lookup.rs b/plonky2/src/gadgets/lookup.rs index cc60cbe7..b71b7808 100644 --- a/plonky2/src/gadgets/lookup.rs +++ b/plonky2/src/gadgets/lookup.rs @@ -77,7 +77,7 @@ impl, const D: usize> CircuitBuilder { pub fn add_all_lookups(&mut self) { for lut_index in 0..self.num_luts() { assert!( - !self.get_lut_lookups(lut_index).is_empty() || lut_index >= self.get_luts_length(), + !self.get_lut_lookups(lut_index).is_empty(), "LUT number {:?} is unused", lut_index ); diff --git a/plonky2/src/gates/lookup_table.rs b/plonky2/src/gates/lookup_table.rs index f3ed842d..9f9d967e 100644 --- a/plonky2/src/gates/lookup_table.rs +++ b/plonky2/src/gates/lookup_table.rs @@ -81,7 +81,7 @@ impl, const D: usize> Gate for LookupTableGat fn id(&self) -> String { // Custom implementation to not have the entire lookup table format!( - "LookupGate {{num_slots: {}, lut_hash: {:?}, last_lut_row: {}}}", + "LookupTableGate {{num_slots: {}, lut_hash: {:?}, last_lut_row: {}}}", self.num_slots, self.lut_hash, self.last_lut_row ) } diff --git a/plonky2/src/lookup_test.rs b/plonky2/src/lookup_test.rs index 04b57203..c575417e 100644 --- a/plonky2/src/lookup_test.rs +++ b/plonky2/src/lookup_test.rs @@ -40,6 +40,49 @@ mod tests { Ok(()) } + #[should_panic] + #[test] + fn test_lookup_table_not_used() { + LOGGER_INITIALIZED.call_once(|| init_logger().unwrap()); + use crate::plonk::circuit_builder::CircuitBuilder; + use crate::plonk::circuit_data::CircuitConfig; + use crate::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; + + const D: usize = 2; + type C = PoseidonGoldilocksConfig; + type F = >::F; + + let config = CircuitConfig::standard_recursion_config(); + let mut builder = CircuitBuilder::::new(config); + + let tip5_table = TIP5_TABLE.to_vec(); + let table: LookupTable = Arc::new((0..256).zip_eq(tip5_table).collect()); + builder.add_lookup_table_from_pairs(table); + + builder.build::(); + } + + #[should_panic] + #[test] + fn test_lookup_without_table() { + LOGGER_INITIALIZED.call_once(|| init_logger().unwrap()); + use crate::plonk::circuit_builder::CircuitBuilder; + use crate::plonk::circuit_data::CircuitConfig; + use crate::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; + + const D: usize = 2; + type C = PoseidonGoldilocksConfig; + type F = >::F; + + let config = CircuitConfig::standard_recursion_config(); + let mut builder = CircuitBuilder::::new(config); + + let dummy = builder.add_virtual_target(); + builder.add_lookup_from_index(dummy, 0); + + builder.build::(); + } + // Tests two lookups in one lookup table. #[test] fn test_one_lookup() -> anyhow::Result<()> { diff --git a/plonky2/src/plonk/circuit_builder.rs b/plonky2/src/plonk/circuit_builder.rs index d8f9e32c..3cf48de0 100644 --- a/plonky2/src/plonk/circuit_builder.rs +++ b/plonky2/src/plonk/circuit_builder.rs @@ -244,7 +244,7 @@ impl, const D: usize> CircuitBuilder { self.lut_to_lookups[lut_index].push((looking_in, looking_out)); } - pub fn num_luts(&mut self) -> usize { + pub fn num_luts(&self) -> usize { self.lut_to_lookups.len() }