diff --git a/halo2-base/src/gates/circuit/builder.rs b/halo2-base/src/gates/circuit/builder.rs index ae7e188d..20f73900 100644 --- a/halo2-base/src/gates/circuit/builder.rs +++ b/halo2-base/src/gates/circuit/builder.rs @@ -302,7 +302,10 @@ impl BaseCircuitBuilder { let copy_manager = self.core.copy_manager.lock().unwrap(); let cell = copy_manager.assigned_advices.get(&cell).expect("instance not assigned"); + #[cfg(feature = "halo2-axiom")] layouter.constrain_instance(*cell, *instance_col, i); + #[cfg(not(feature = "halo2-axiom"))] + layouter.constrain_instance(*cell, *instance_col, i).unwrap(); } } } diff --git a/halo2-base/src/utils/halo2.rs b/halo2-base/src/utils/halo2.rs index 750787f1..78219d12 100644 --- a/halo2-base/src/utils/halo2.rs +++ b/halo2-base/src/utils/halo2.rs @@ -100,7 +100,10 @@ pub fn constrain_virtual_equals_external( match copy_manager.assigned_advices.entry(ctx_cell) { Entry::Occupied(acell) => { // The virtual cell has already been assigned, so we can constrain it to equal the external cell. + #[cfg(feature = "halo2-axiom")] region.constrain_equal(*acell.get(), external_cell); + #[cfg(not(feature = "halo2-axiom"))] + region.constrain_equal(*acell.get(), external_cell).unwrap(); } Entry::Vacant(assigned) => { // The virtual cell **must** be an external cell diff --git a/halo2-base/src/utils/mod.rs b/halo2-base/src/utils/mod.rs index 87404349..86c1a217 100644 --- a/halo2-base/src/utils/mod.rs +++ b/halo2-base/src/utils/mod.rs @@ -88,6 +88,16 @@ pub trait ScalarField: PrimeField + FromUniformBytes<64> + From + Hash + O } lower_64 } + + /// Gets the least significant 128 bits of the field element. + fn get_lower_128(&self) -> u128 { + let bytes = self.to_bytes_le(); + let mut lower_128 = 0u128; + for (i, byte) in bytes.into_iter().enumerate().take(16) { + lower_128 |= (byte as u128) << (i * 8); + } + lower_128 + } } // See below for implementations