diff --git a/src/circuit/gadget/ecc/chip/add.rs b/src/circuit/gadget/ecc/chip/add.rs index 0ae7f094..d2d47f12 100644 --- a/src/circuit/gadget/ecc/chip/add.rs +++ b/src/circuit/gadget/ecc/chip/add.rs @@ -70,6 +70,10 @@ impl Config { .collect() } + pub(crate) fn output_columns(&self) -> HashSet> { + core::array::IntoIter::new([self.x_qr, self.y_qr]).collect() + } + pub(crate) fn create_gate(&self, meta: &mut ConstraintSystem) { meta.create_gate("complete addition gates", |meta| { let q_add = meta.query_selector(self.q_add); diff --git a/src/circuit/gadget/ecc/chip/mul.rs b/src/circuit/gadget/ecc/chip/mul.rs index c54d38bb..2672bca0 100644 --- a/src/circuit/gadget/ecc/chip/mul.rs +++ b/src/circuit/gadget/ecc/chip/mul.rs @@ -80,15 +80,20 @@ impl From<&EccConfig> for Config { "y_p is shared across hi and lo halves." ); - let add_config_advices = config.add_config.advice_columns(); - assert!( - !add_config_advices.contains(&config.hi_config.z), - "hi_config z cannot overlap with complete addition columns." - ); - assert!( - !add_config_advices.contains(&config.complete_config.z_complete), - "complete_config z cannot overlap with complete addition columns." - ); + // For both hi_config and lo_config: + // z and lambda1 are assigned on the same row as the add_config output. + // Therefore, z and lambda1 must not overlap with add_config.x_qr, add_config.y_qr. + let add_config_outputs = config.add_config.output_columns(); + for config in [&(*config.hi_config), &(*config.lo_config)].iter() { + assert!( + !add_config_outputs.contains(&config.z), + "incomplete config z cannot overlap with complete addition columns." + ); + assert!( + !add_config_outputs.contains(&config.lambda1), + "incomplete config lambda1 cannot overlap with complete addition columns." + ); + } config }