From a2a548b2a97ae1c789e618a99c02ea2b1734ffa9 Mon Sep 17 00:00:00 2001
From: soham <soham@zemse.in>
Date: Fri, 26 Jul 2024 14:26:51 +0530
Subject: [PATCH] add util and fix warning when compiling with halo2-pse
 feature mode (#253)

* add `get_lower_128` with impl to `ScalarField` trait

* fix warning
---
 halo2-base/src/gates/circuit/builder.rs |  3 +++
 halo2-base/src/utils/halo2.rs           |  3 +++
 halo2-base/src/utils/mod.rs             | 10 ++++++++++
 3 files changed, 16 insertions(+)

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<F: ScalarField> BaseCircuitBuilder<F> {
                     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<F: Field + Ord>(
     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<bool> + 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