Skip to content

Commit 1b0984f

Browse files
committed
group expressions by selectors
1 parent 67092de commit 1b0984f

63 files changed

Lines changed: 2618 additions & 2606 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ceno_recursion/src/zkvm_verifier/verifier.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -539,9 +539,9 @@ pub fn verify_chip_proof<C: Config>(
539539
} = &composed_cs;
540540
let one: Ext<C::F, C::EF> = builder.constant(C::EF::ONE);
541541

542-
let r_len = cs.r_expressions.len() + cs.r_table_expressions.len();
543-
let w_len = cs.w_expressions.len() + cs.w_table_expressions.len();
544-
let lk_len = cs.lk_expressions.len() + cs.lk_table_expressions.len();
542+
let r_len = cs.r_expressions_len() + cs.r_table_expressions_len();
543+
let w_len = cs.w_expressions_len() + cs.w_table_expressions_len();
544+
let lk_len = cs.lk_expressions_len() + cs.lk_table_expressions_len();
545545
let num_batched = r_len + w_len + lk_len;
546546

547547
let r_counts_per_instance: Usize<C::N> = Usize::from(r_len);
@@ -608,7 +608,7 @@ pub fn verify_chip_proof<C: Config>(
608608
);
609609
builder.cycle_tracker_end(format!("verify tower proof for opcode {circuit_name}",).as_str());
610610

611-
if cs.lk_table_expressions.is_empty() {
611+
if cs.lk_table_expressions_len() == 0 {
612612
builder
613613
.range(0, logup_p_evals.len())
614614
.for_each(|idx_vec, builder| {
@@ -623,7 +623,7 @@ pub fn verify_chip_proof<C: Config>(
623623
builder.assert_usize_eq(logup_q_evals.len(), lk_counts_per_instance.clone());
624624

625625
// GKR circuit
626-
let out_evals_len: Usize<C::N> = if cs.lk_table_expressions.is_empty() {
626+
let out_evals_len: Usize<C::N> = if cs.lk_table_expressions_len() == 0 {
627627
builder.eval(record_evals.len() + logup_q_evals.len())
628628
} else {
629629
builder.eval(record_evals.len() + logup_p_evals.len() + logup_q_evals.len())
@@ -638,7 +638,7 @@ pub fn verify_chip_proof<C: Config>(
638638
});
639639

640640
let end: Usize<C::N> = Usize::uninit(builder);
641-
if !cs.lk_table_expressions.is_empty() {
641+
if cs.lk_table_expressions_len() > 0 {
642642
builder.assign(&end, record_evals.len() + logup_p_evals.len());
643643
let p_slice = out_evals.slice(builder, record_evals.len(), end.clone());
644644

@@ -687,7 +687,7 @@ pub fn verify_chip_proof<C: Config>(
687687
gkr_circuit
688688
.layers
689689
.first()
690-
.map(|layer| layer.out_sel_and_eval_exprs.len())
690+
.map(|layer| layer.selector_ctxs_len())
691691
.unwrap_or(0)
692692
]
693693
} else {

ceno_zkvm/src/chip_handler.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use ff_ext::ExtensionField;
2-
use gkr_iop::{error::CircuitBuilderError, gadgets::AssertLtConfig};
2+
use gkr_iop::{error::CircuitBuilderError, gadgets::AssertLtConfig, selector::SelectorType};
33

44
use crate::instructions::riscv::constants::UINT_LIMBS;
55
use multilinear_extensions::{Expression, ToExpr};
@@ -73,4 +73,16 @@ pub trait MemoryChipOperations<E: ExtensionField, NR: Into<String>, N: FnOnce()
7373
prev_values: MemoryExpr<E>,
7474
value: MemoryExpr<E>,
7575
) -> Result<(Expression<E>, AssertLtConfig), CircuitBuilderError>;
76+
77+
fn memory_write_with_rw_selectors(
78+
&mut self,
79+
name_fn: N,
80+
memory_addr: &AddressExpr<E>,
81+
prev_ts: Expression<E>,
82+
ts: Expression<E>,
83+
prev_values: MemoryExpr<E>,
84+
value: MemoryExpr<E>,
85+
r_selector: &SelectorType<E>,
86+
w_selector: &SelectorType<E>,
87+
) -> Result<(Expression<E>, AssertLtConfig), CircuitBuilderError>;
7688
}

ceno_zkvm/src/chip_handler/memory.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
structs::RAMType,
66
};
77
use ff_ext::ExtensionField;
8-
use gkr_iop::error::CircuitBuilderError;
8+
use gkr_iop::{error::CircuitBuilderError, selector::SelectorType};
99
use multilinear_extensions::Expression;
1010

1111
impl<E: ExtensionField, NR: Into<String>, N: FnOnce() -> NR> MemoryChipOperations<E, NR, N>
@@ -48,4 +48,28 @@ impl<E: ExtensionField, NR: Into<String>, N: FnOnce() -> NR> MemoryChipOperation
4848
value,
4949
)
5050
}
51+
52+
fn memory_write_with_rw_selectors(
53+
&mut self,
54+
name_fn: N,
55+
memory_addr: &AddressExpr<E>,
56+
prev_ts: Expression<E>,
57+
ts: Expression<E>,
58+
prev_values: MemoryExpr<E>,
59+
value: MemoryExpr<E>,
60+
r_selector: &SelectorType<E>,
61+
w_selector: &SelectorType<E>,
62+
) -> Result<(Expression<E>, AssertLtConfig), CircuitBuilderError> {
63+
self.ram_type_write_with_rw_selectors(
64+
name_fn,
65+
RAMType::Memory,
66+
memory_addr.clone(),
67+
prev_ts,
68+
ts,
69+
prev_values,
70+
value,
71+
r_selector,
72+
w_selector,
73+
)
74+
}
5175
}

ceno_zkvm/src/instructions.rs

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use ceno_emul::StepRecord;
66
use ff_ext::ExtensionField;
77
use gkr_iop::{
88
chip::Chip,
9+
default_out_eval_groups,
910
gkr::{GKRCircuit, layer::Layer},
1011
selector::SelectorType,
1112
utils::lk_multiplicity::Multiplicity,
@@ -44,35 +45,16 @@ pub trait Instruction<E: ExtensionField> {
4445
param: &ProgramParams,
4546
) -> Result<(Self::InstructionConfig, GKRCircuit<E>), ZKVMError> {
4647
let config = Self::construct_circuit(cb, param)?;
47-
let w_len = cb.cs.w_expressions.len();
48-
let r_len = cb.cs.r_expressions.len();
49-
let lk_len = cb.cs.lk_expressions.len();
50-
let zero_len =
51-
cb.cs.assert_zero_expressions.len() + cb.cs.assert_zero_sumcheck_expressions.len();
5248

5349
let selector = cb.create_placeholder_structural_witin(|| "selector");
5450
let selector_type = SelectorType::Prefix(selector.expr());
51+
cb.cs.set_default_read_selector(selector_type.clone());
52+
cb.cs.set_default_write_selector(selector_type.clone());
53+
cb.cs.set_default_lookup_selector(selector_type.clone());
54+
cb.cs.set_default_zero_selector(selector_type.clone());
5555

56-
// all shared the same selector
57-
let (out_evals, mut chip) = (
58-
[
59-
// r_record
60-
(0..r_len).collect_vec(),
61-
// w_record
62-
(r_len..r_len + w_len).collect_vec(),
63-
// lk_record
64-
(r_len + w_len..r_len + w_len + lk_len).collect_vec(),
65-
// zero_record
66-
(0..zero_len).collect_vec(),
67-
],
68-
Chip::new_from_cb(cb, 0),
69-
);
70-
71-
// register selector to legacy constrain system
72-
cb.cs.r_selector = Some(selector_type.clone());
73-
cb.cs.w_selector = Some(selector_type.clone());
74-
cb.cs.lk_selector = Some(selector_type.clone());
75-
cb.cs.zero_selector = Some(selector_type.clone());
56+
let out_evals = default_out_eval_groups(cb);
57+
let mut chip = Chip::new_from_cb(cb, 0);
7658

7759
let layer = Layer::from_circuit_builder(cb, format!("{}_main", Self::name()), 0, out_evals);
7860
chip.add_layer(layer);

ceno_zkvm/src/instructions/riscv/arith.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,6 @@ mod test {
218218
)
219219
.unwrap();
220220

221-
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], None, Some(lkm));
221+
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], 1, None, Some(lkm));
222222
}
223223
}

ceno_zkvm/src/instructions/riscv/arith_imm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,6 @@ mod test {
8989
)
9090
.unwrap();
9191

92-
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], None, Some(lkm));
92+
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], 1, None, Some(lkm));
9393
}
9494
}

ceno_zkvm/src/instructions/riscv/auipc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,6 @@ mod tests {
272272
)
273273
.unwrap();
274274

275-
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], None, Some(lkm));
275+
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], 1, None, Some(lkm));
276276
}
277277
}

ceno_zkvm/src/instructions/riscv/branch/test.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fn impl_opcode_beq(take_branch: bool, a: u32, b: u32) {
5252
)
5353
.unwrap();
5454

55-
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], None, Some(lkm));
55+
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], 1, None, Some(lkm));
5656
}
5757

5858
#[test]
@@ -94,7 +94,7 @@ fn impl_opcode_bne(take_branch: bool, a: u32, b: u32) {
9494
)
9595
.unwrap();
9696

97-
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], None, Some(lkm));
97+
MockProver::assert_satisfied_raw(&cb, raw_witin, &[insn_code], 1, None, Some(lkm));
9898
}
9999

100100
#[test]
@@ -138,7 +138,7 @@ fn impl_bltu_circuit(taken: bool, a: u32, b: u32) -> Result<(), ZKVMError> {
138138
)
139139
.unwrap();
140140

141-
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], None, Some(lkm));
141+
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], 1, None, Some(lkm));
142142
Ok(())
143143
}
144144

@@ -183,7 +183,7 @@ fn impl_bgeu_circuit(taken: bool, a: u32, b: u32) -> Result<(), ZKVMError> {
183183
)
184184
.unwrap();
185185

186-
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], None, Some(lkm));
186+
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], 1, None, Some(lkm));
187187
Ok(())
188188
}
189189

@@ -235,7 +235,7 @@ fn impl_blt_circuit<E: ExtensionField>(taken: bool, a: i32, b: i32) -> Result<()
235235
)
236236
.unwrap();
237237

238-
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], None, Some(lkm));
238+
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], 1, None, Some(lkm));
239239
Ok(())
240240
}
241241

@@ -287,6 +287,6 @@ fn impl_bge_circuit<E: ExtensionField>(taken: bool, a: i32, b: i32) -> Result<()
287287
)
288288
.unwrap();
289289

290-
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], None, Some(lkm));
290+
MockProver::assert_satisfied_raw(&circuit_builder, raw_witin, &[insn_code], 1, None, Some(lkm));
291291
Ok(())
292292
}

ceno_zkvm/src/instructions/riscv/div.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ mod test {
180180
.expect("instruction must declare at least one InsnKind");
181181
let insn_code = encode_rv32(insn_kind, 2, 3, 4, 0);
182182
// values assignment
183-
let ([raw_witin, _], lkm) = Insn::assign_instances(
183+
let ([raw_witin, raw_structural_witin], lkm) = Insn::assign_instances(
184184
&config,
185185
&mut ShardContext::default(),
186186
cb.cs.num_witin as usize,
@@ -215,9 +215,14 @@ mod test {
215215
.into_iter()
216216
.map(|v| v.into())
217217
.collect_vec(),
218-
&[],
218+
&raw_structural_witin
219+
.to_mles()
220+
.into_iter()
221+
.map(|v| v.into())
222+
.collect_vec(),
219223
&[insn_code],
220224
expected_errors,
225+
1,
221226
None,
222227
Some(lkm),
223228
);

ceno_zkvm/src/instructions/riscv/dummy/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ fn test_large_ecall_dummy_keccak() {
2828
)
2929
.unwrap();
3030

31-
MockProver::assert_satisfied_raw(&cb, raw_witin, &program, None, Some(lkm));
31+
MockProver::assert_satisfied_raw(&cb, raw_witin, &program, 1, None, Some(lkm));
3232
}

0 commit comments

Comments
 (0)