Skip to content

Commit

Permalink
Introduce Value::as_i32 (scroll-tech#732)
Browse files Browse the repository at this point in the history
To help make scroll-tech#596 easier to read
and reason about.

Also introduce a few more conversion helpers.
  • Loading branch information
matthiasgoergens authored and 10to4 committed Dec 12, 2024
1 parent cf15c14 commit e28e557
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
4 changes: 1 addition & 3 deletions ceno_zkvm/src/instructions/riscv/mul.rs
Original file line number Diff line number Diff line change
Expand Up @@ -432,9 +432,7 @@ impl<E: ExtensionField> Signed<E> {
lkm,
*val.as_u16_limbs().last().unwrap() as u64,
)?;
let signed_val = val.as_u32() as i32;

Ok(signed_val)
Ok(i32::from(val))
}

pub fn expr(&self) -> Expression<E> {
Expand Down
34 changes: 30 additions & 4 deletions ceno_zkvm/src/uint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -606,6 +606,30 @@ pub struct Value<'a, T: Into<u64> + From<u32> + Copy + Default> {
pub limbs: Cow<'a, [u16]>,
}

impl<'a, T: Into<u64> + From<u32> + Copy + Default> From<&'a Value<'a, T>> for &'a [u16] {
fn from(v: &'a Value<'a, T>) -> Self {
v.as_u16_limbs()
}
}

impl<'a, T: Into<u64> + From<u32> + Copy + Default> From<&Value<'a, T>> for u64 {
fn from(v: &Value<'a, T>) -> Self {
v.as_u64()
}
}

impl<'a, T: Into<u64> + From<u32> + Copy + Default> From<&Value<'a, T>> for u32 {
fn from(v: &Value<'a, T>) -> Self {
v.as_u32()
}
}

impl<'a, T: Into<u64> + From<u32> + Copy + Default> From<&Value<'a, T>> for i32 {
fn from(v: &Value<'a, T>) -> Self {
v.as_i32()
}
}

// TODO generalize to support non 16 bit limbs
// TODO optimize api with fixed size array
impl<'a, T: Into<u64> + From<u32> + Copy + Default> Value<'a, T> {
Expand All @@ -616,10 +640,7 @@ impl<'a, T: Into<u64> + From<u32> + Copy + Default> Value<'a, T> {
const LIMBS: usize = (Self::M + 15) / 16;

pub fn new(val: T, lkm: &mut LkMultiplicity) -> Self {
let uint = Value::<T> {
val,
limbs: Cow::Owned(Self::split_to_u16(val)),
};
let uint = Self::new_unchecked(val);
Self::assert_u16(&uint.limbs, lkm);
uint
}
Expand Down Expand Up @@ -684,6 +705,11 @@ impl<'a, T: Into<u64> + From<u32> + Copy + Default> Value<'a, T> {
self.as_u64() as u32
}

/// Convert the limbs to an i32 value
pub fn as_i32(&self) -> i32 {
self.as_u32() as i32
}

pub fn u16_fields<F: SmallField>(&self) -> Vec<F> {
self.limbs.iter().map(|v| F::from(*v as u64)).collect_vec()
}
Expand Down

0 comments on commit e28e557

Please sign in to comment.