Skip to content

Commit 7046d8a

Browse files
authored
Merge pull request #2 from scroll-tech/ceno-recursion
scroll-dev: ceno-recursion-verifier
2 parents 6a5d93d + a1658f5 commit 7046d8a

File tree

5 files changed

+23
-4
lines changed

5 files changed

+23
-4
lines changed

extensions/native/compiler/src/asm/compiler.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,15 @@ impl<F: PrimeField32 + TwoAdicField, EF: ExtensionField<F> + TwoAdicField> AsmCo
617617
debug_info,
618618
);
619619
}
620+
DslIr::ExtFromBaseVec(ext, base_vec) => {
621+
assert_eq!(base_vec.len(), EF::D);
622+
for (i, base) in base_vec.into_iter().enumerate() {
623+
self.push(
624+
AsmInstruction::CopyF(ext.fp() + (i as i32), base.fp()),
625+
debug_info.clone(),
626+
);
627+
}
628+
}
620629
_ => unimplemented!(),
621630
}
622631
}

extensions/native/compiler/src/ir/builder.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,10 @@ impl<C: Config> Builder<C> {
620620
self.witness_space.get(id.value()).unwrap()
621621
}
622622

623+
pub fn ext_from_base_vec(&mut self, ext: Ext<C::F, C::EF>, base_vec: Vec<Felt<C::F>>) {
624+
self.push(DslIr::ExtFromBaseVec(ext, base_vec));
625+
}
626+
623627
/// Throws an error.
624628
pub fn error(&mut self) {
625629
self.operations.trace_push(DslIr::Error());

extensions/native/compiler/src/ir/instructions.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ pub enum DslIr<C: Config> {
229229
/// Operation to halt the program. Should be the last instruction in the program.
230230
Halt,
231231

232+
/// Packs a vector of felts into an ext.
233+
ExtFromBaseVec(Ext<C::F, C::EF>, Vec<Felt<C::F>>),
234+
232235
// Public inputs for circuits.
233236
/// Publish a field element as the ith public value. Should only be used when target is a circuit.
234237
CircuitPublish(Var<C::N>, usize),

extensions/native/compiler/tests/ext.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ fn test_ext2felt() {
3535
}
3636

3737
#[test]
38-
fn test_ext_from_base_slice() {
38+
fn test_ext_from_base_vec() {
3939
const D: usize = 4;
4040
type F = BabyBear;
4141
type EF = BinomialExtensionField<BabyBear, D>;
@@ -52,8 +52,9 @@ fn test_ext_from_base_slice() {
5252
let val = EF::from_base_slice(base_slice);
5353
let expected: Ext<_, _> = builder.constant(val);
5454

55-
let felts = base_slice.map(|e| builder.constant::<Felt<_>>(e));
56-
let actual = builder.ext_from_base_slice(&felts);
55+
let felts = base_slice.map(|e| builder.constant::<Felt<_>>(e)).to_vec();
56+
let actual = builder.uninit();
57+
builder.ext_from_base_vec(actual, felts);
5758
builder.assert_ext_eq(actual, expected);
5859

5960
builder.halt();

extensions/native/recursion/src/challenger/duplex.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ impl<C: Config> DuplexChallengerVariable<C> {
101101
let b = self.sample(builder);
102102
let c = self.sample(builder);
103103
let d = self.sample(builder);
104-
builder.ext_from_base_slice(&[a, b, c, d])
104+
let ext = builder.uninit();
105+
builder.ext_from_base_vec(ext, vec![a, b, c, d]);
106+
ext
105107
}
106108

107109
fn sample_bits(&self, builder: &mut Builder<C>, nb_bits: RVar<C::N>) -> Array<C, Var<C::N>>

0 commit comments

Comments
 (0)