diff --git a/ceno_zkvm/src/instructions/global.rs b/ceno_zkvm/src/instructions/global.rs index c98cb3634..887594c9b 100644 --- a/ceno_zkvm/src/instructions/global.rs +++ b/ceno_zkvm/src/instructions/global.rs @@ -27,7 +27,7 @@ use multilinear_extensions::{ }; use p3::{ field::{Field, FieldAlgebra}, - matrix::dense::RowMajorMatrix, + matrix::{Matrix, dense::RowMajorMatrix}, symmetric::Permutation, }; use rayon::{ @@ -370,6 +370,21 @@ impl GlobalChip { Ok(()) } + + fn extract_ec_sum( + config: &GlobalConfig, + rmm: &witness::RowMajorMatrix<::BaseField>, + ) -> Vec<::BaseField> { + assert!(rmm.height() >= 2); + let instance = &rmm[rmm.height() - 2]; + + config + .x + .iter() + .chain(config.y.iter()) + .map(|witin| instance[witin.id as usize]) + .collect_vec() + } } impl TableCircuit for GlobalChip { @@ -665,7 +680,10 @@ mod tests { use crate::{ circuit_builder::{CircuitBuilder, ConstraintSystem}, - instructions::global::{GlobalChip, GlobalChipInput, GlobalRecord}, + instructions::{ + global::{GlobalChip, GlobalChipInput, GlobalRecord}, + riscv::constants::GLOBAL_RW_SUM_IDX, + }, scheme::{ PublicValues, create_backend, create_prover, hal::ProofInput, prover::ZKVMProver, septic_curve::SepticPoint, verifier::ZKVMVerifier, @@ -779,6 +797,17 @@ mod tests { ) .unwrap(); + // api extract ec sum from rmm witness + assert_eq!( + public_value + .to_vec::() + .into_iter() + .skip(GLOBAL_RW_SUM_IDX) + .flatten() + .collect_vec(), + GlobalChip::extract_ec_sum(&config, &witness[0]) + ); + let composed_cs = ComposedConstrainSystem { zkvm_v1_css: cs, gkr_circuit,