Skip to content

Commit 0433535

Browse files
Yoichi Hiraisjudson
authored andcommitted
Turn Reg{1,2}Accessed into virtual columns (nexus-xyz#545)
* Replace Reg1Accessed * Replace Reg2Accessed
1 parent 633cb1b commit 0433535

5 files changed

Lines changed: 66 additions & 68 deletions

File tree

prover/src/chips/cpu.rs

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -249,15 +249,15 @@ impl MachineChip for CpuChip {
249249
// We use Reg3 for the destination because Reg{1,2,3} have to be accessed in this order.
250250
match vm_step.step.instruction.ins_type {
251251
RType => {
252-
traces.fill_columns(row_idx, true, Reg1Accessed);
252+
// Reg1Accessed has been replaced with virtual column OpBFlag
253253
traces.fill_columns(row_idx, vm_step.step.instruction.op_b as u8, Reg1Address);
254-
traces.fill_columns(row_idx, true, Reg2Accessed);
254+
// Reg2Accessed has been replaced with virtual column IsTypeR
255255
traces.fill_columns(row_idx, vm_step.step.instruction.op_c as u8, Reg2Address);
256256
traces.fill_columns(row_idx, true, Reg3Accessed);
257257
traces.fill_columns(row_idx, vm_step.step.instruction.op_a as u8, Reg3Address);
258258
}
259259
IType | ITypeShamt => {
260-
traces.fill_columns(row_idx, true, Reg1Accessed);
260+
// Reg1Accessed has been replaced with virtual column OpBFlag
261261
traces.fill_columns(row_idx, vm_step.get_op_b() as u8, Reg1Address);
262262
// Special case to handle ECALL, this work, but we must take care memory checking
263263
let syscall_code = vm_step.get_syscall_code();
@@ -280,7 +280,7 @@ impl MachineChip for CpuChip {
280280
traces.fill_columns(row_idx, vm_step.step.instruction.op_a as u8, Reg3Address);
281281
}
282282
BType | SType => {
283-
traces.fill_columns(row_idx, true, Reg1Accessed);
283+
// Reg1Accessed has been replaced with virtual column OpBFlag
284284
traces.fill_columns(row_idx, vm_step.step.instruction.op_b as u8, Reg1Address);
285285
traces.fill_columns(row_idx, true, Reg3Accessed);
286286
traces.fill_columns(row_idx, vm_step.step.instruction.op_a as u8, Reg3Address);
@@ -313,11 +313,8 @@ impl MachineChip for CpuChip {
313313
let [is_padding] = trace_eval!(trace_eval, IsPadding);
314314
// Padding rows should not access registers
315315
let [next_is_padding] = trace_eval_next_row!(trace_eval, Column::IsPadding);
316-
let [reg1_accessed] = trace_eval!(trace_eval, Column::Reg1Accessed);
317-
let [reg2_accessed] = trace_eval!(trace_eval, Column::Reg2Accessed);
316+
let [reg1_accessed] = virtual_column::OpBFlag::eval(trace_eval);
318317
let [reg3_accessed] = trace_eval!(trace_eval, Column::Reg3Accessed);
319-
eval.add_constraint(is_padding.clone() * reg1_accessed.clone());
320-
eval.add_constraint(is_padding.clone() * reg2_accessed.clone());
321318
eval.add_constraint(is_padding.clone() * reg3_accessed.clone());
322319

323320
// Padding cannot go from 1 to zero, unless the current line is the first
@@ -426,14 +423,7 @@ impl MachineChip for CpuChip {
426423
let is_type_i = is_load + is_alu_imm_no_shift + is_jalr; // TODO: Add more flags when they are available
427424

428425
// Constrain Reg{1,2,3}Accessed for type R and type I instructions
429-
let [reg1_accessed] = trace_eval!(trace_eval, Reg1Accessed);
430-
let [reg2_accessed] = trace_eval!(trace_eval, Reg2Accessed);
431426
let [reg3_accessed] = trace_eval!(trace_eval, Reg3Accessed);
432-
eval.add_constraint(
433-
(is_type_r.clone() + is_type_i.clone()) * (E::F::one() - reg1_accessed.clone()),
434-
);
435-
eval.add_constraint(is_type_i.clone() * reg2_accessed.clone());
436-
eval.add_constraint(is_type_r.clone() * (E::F::one() - reg2_accessed.clone()));
437427
eval.add_constraint(
438428
(is_type_r.clone() + is_type_i.clone()) * (E::F::one() - reg3_accessed.clone()),
439429
);
@@ -478,7 +468,6 @@ impl MachineChip for CpuChip {
478468

479469
// Constrain reg{1,2,3}_accessed for type B and type S instructions
480470
eval.add_constraint((is_type_b_s.clone()) * (E::F::one() - reg1_accessed.clone()));
481-
eval.add_constraint(is_type_b_s.clone() * reg2_accessed.clone());
482471
eval.add_constraint((is_type_b_s.clone()) * (E::F::one() - reg3_accessed.clone()));
483472

484473
// Constraint reg{1,2,3}_address uniquely for type B and type S instructions
@@ -503,13 +492,11 @@ impl MachineChip for CpuChip {
503492

504493
// Constrain only reg{3} is accessed for type J
505494
eval.add_constraint(is_type_j.clone() * reg1_accessed.clone());
506-
eval.add_constraint(is_type_j.clone() * reg2_accessed.clone());
507495
eval.add_constraint((is_type_j.clone()) * (E::F::one() - reg3_accessed.clone()));
508496

509497
// Enforcing register memory access flags for type U
510498
let is_type_u = is_lui + is_auipc;
511499
eval.add_constraint(is_type_u.clone() * reg1_accessed.clone());
512-
eval.add_constraint(is_type_u.clone() * reg2_accessed.clone());
513500
eval.add_constraint(is_type_u.clone() * (E::F::one() - reg3_accessed.clone()));
514501

515502
// Enforcing register memory access flags
@@ -525,7 +512,6 @@ impl MachineChip for CpuChip {
525512
let [is_sys_stack_reset] = trace_eval!(trace_eval, Column::IsSysStackReset);
526513
let [is_sys_heap_reset] = trace_eval!(trace_eval, Column::IsSysHeapReset);
527514
eval.add_constraint(is_type_sys.clone() * (reg1_accessed - E::F::one()));
528-
eval.add_constraint(is_type_sys.clone() * reg2_accessed);
529515
eval.add_constraint(
530516
is_type_sys.clone()
531517
* (is_sys_debug.clone() + is_sys_halt.clone() + is_sys_cycle_count.clone())

prover/src/chips/memory_check/register_mem_check.rs

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ use stwo_prover::{
1212
use crate::{
1313
column::{
1414
Column::{
15-
self, FinalRegTs, FinalRegValue, Reg1Accessed, Reg1Address, Reg1TsPrev, Reg1ValPrev,
16-
Reg2Accessed, Reg2Address, Reg2TsPrev, Reg2ValPrev, Reg3Accessed, Reg3Address,
17-
Reg3TsPrev, Reg3ValPrev, ValueA, ValueAEffective, ValueAEffectiveFlag, ValueB, ValueC,
15+
self, FinalRegTs, FinalRegValue, Reg1Address, Reg1TsPrev, Reg1ValPrev, Reg2Address,
16+
Reg2TsPrev, Reg2ValPrev, Reg3Accessed, Reg3Address, Reg3TsPrev, Reg3ValPrev, ValueA,
17+
ValueAEffective, ValueAEffectiveFlag, ValueB, ValueC,
1818
},
1919
PreprocessedColumn,
2020
},
@@ -28,6 +28,7 @@ use crate::{
2828
FinalizedTraces, PreprocessedTraces, ProgramStep, TracesBuilder,
2929
},
3030
traits::MachineChip,
31+
virtual_column::{self, IsTypeR, OpBFlag, Reg3AccessedVirtual, VirtualColumn},
3132
};
3233

3334
/// A Chip for register memory checking
@@ -70,8 +71,8 @@ impl MachineChip for RegisterMemCheckChip {
7071
let reg3_cur_ts = clk * 3 + 3;
7172

7273
// Read inputs to the chip
73-
let reg1_accessed: [BaseField; 1] = traces.column(row_idx, Reg1Accessed);
74-
let reg2_accessed: [BaseField; 1] = traces.column(row_idx, Reg2Accessed);
74+
let reg1_accessed = virtual_column::OpBFlag::read_from_traces_builder(traces, row_idx);
75+
let reg2_accessed = virtual_column::IsTypeR::read_from_traces_builder(traces, row_idx);
7576
let reg3_accessed: [BaseField; 1] = traces.column(row_idx, Reg3Accessed);
7677
let reg1_address: [BaseField; 1] = traces.column(row_idx, Reg1Address);
7778
let reg2_address: [BaseField; 1] = traces.column(row_idx, Reg2Address);
@@ -158,29 +159,32 @@ impl MachineChip for RegisterMemCheckChip {
158159
Self::constrain_add_initial_reg(eval, trace_eval, lookup_elements);
159160

160161
// Subtract previous register info
162+
let [reg1_accessed] = virtual_column::OpBFlag::eval(trace_eval);
161163
Self::constrain_subtract_prev_reg(
162164
eval,
163165
trace_eval,
164166
lookup_elements,
165-
Reg1Accessed,
167+
reg1_accessed.clone(),
166168
Reg1Address,
167169
Reg1TsPrev,
168170
Reg1ValPrev,
169171
);
172+
let [reg2_accessed] = virtual_column::IsTypeR::eval(trace_eval);
170173
Self::constrain_subtract_prev_reg(
171174
eval,
172175
trace_eval,
173176
lookup_elements,
174-
Reg2Accessed,
177+
reg2_accessed.clone(),
175178
Reg2Address,
176179
Reg2TsPrev,
177180
Reg2ValPrev,
178181
);
182+
let [reg3_accessed] = trace_eval!(trace_eval, Column::Reg3Accessed);
179183
Self::constrain_subtract_prev_reg(
180184
eval,
181185
trace_eval,
182186
lookup_elements,
183-
Reg3Accessed,
187+
reg3_accessed.clone(),
184188
Reg3Address,
185189
Reg3TsPrev,
186190
Reg3ValPrev,
@@ -191,7 +195,7 @@ impl MachineChip for RegisterMemCheckChip {
191195
eval,
192196
trace_eval,
193197
lookup_elements,
194-
Reg1Accessed,
198+
reg1_accessed,
195199
Reg1Address,
196200
PreprocessedColumn::Reg1TsCur,
197201
ValueB,
@@ -200,7 +204,7 @@ impl MachineChip for RegisterMemCheckChip {
200204
eval,
201205
trace_eval,
202206
lookup_elements,
203-
Reg2Accessed,
207+
reg2_accessed,
204208
Reg2Address,
205209
PreprocessedColumn::Reg2TsCur,
206210
ValueC,
@@ -209,7 +213,7 @@ impl MachineChip for RegisterMemCheckChip {
209213
eval,
210214
trace_eval,
211215
lookup_elements,
212-
Reg3Accessed,
216+
reg3_accessed,
213217
Reg3Address,
214218
PreprocessedColumn::Reg3TsCur,
215219
ValueAEffective,
@@ -224,8 +228,8 @@ impl MachineChip for RegisterMemCheckChip {
224228
// ValueB and ValueC are only used for reading from the registers, so they should not change the previous values.
225229
let reg1_val_prev = trace_eval!(trace_eval, Column::Reg1ValPrev);
226230
let reg2_val_prev = trace_eval!(trace_eval, Column::Reg2ValPrev);
227-
let [reg1_accessed] = trace_eval!(trace_eval, Column::Reg1Accessed);
228-
let [reg2_accessed] = trace_eval!(trace_eval, Column::Reg2Accessed);
231+
let [reg1_accessed] = virtual_column::OpBFlag::eval(trace_eval);
232+
let [reg2_accessed] = virtual_column::IsTypeR::eval(trace_eval);
229233
let value_b = trace_eval!(trace_eval, Column::ValueB);
230234
let value_c = trace_eval!(trace_eval, Column::ValueC);
231235
let [is_add] = trace_eval!(trace_eval, Column::IsAdd);
@@ -275,61 +279,55 @@ impl MachineChip for RegisterMemCheckChip {
275279
);
276280

277281
// Subtract previous register info
278-
Self::subtract_prev_reg(
282+
Self::subtract_prev_reg::<OpBFlag>(
279283
logup_trace_gen,
280284
original_traces,
281285
lookup_element,
282-
Reg1Accessed,
283286
Reg1Address,
284287
Reg1TsPrev,
285288
Reg1ValPrev,
286289
);
287-
Self::subtract_prev_reg(
290+
Self::subtract_prev_reg::<IsTypeR>(
288291
logup_trace_gen,
289292
original_traces,
290293
lookup_element,
291-
Reg2Accessed,
292294
Reg2Address,
293295
Reg2TsPrev,
294296
Reg2ValPrev,
295297
);
296-
Self::subtract_prev_reg(
298+
Self::subtract_prev_reg::<Reg3AccessedVirtual>(
297299
logup_trace_gen,
298300
original_traces,
299301
lookup_element,
300-
Reg3Accessed,
301302
Reg3Address,
302303
Reg3TsPrev,
303304
Reg3ValPrev,
304305
);
305306

306307
// Add current register info
307-
Self::add_cur_reg(
308+
Self::add_cur_reg::<OpBFlag>(
308309
logup_trace_gen,
309310
original_traces,
310311
preprocessed_trace,
311312
lookup_element,
312-
Reg1Accessed,
313313
Reg1Address,
314314
PreprocessedColumn::Reg1TsCur,
315315
ValueB,
316316
);
317-
Self::add_cur_reg(
317+
Self::add_cur_reg::<IsTypeR>(
318318
logup_trace_gen,
319319
original_traces,
320320
preprocessed_trace,
321321
lookup_element,
322-
Reg2Accessed,
323322
Reg2Address,
324323
PreprocessedColumn::Reg2TsCur,
325324
ValueC,
326325
);
327-
Self::add_cur_reg(
326+
Self::add_cur_reg::<Reg3AccessedVirtual>(
328327
logup_trace_gen,
329328
original_traces,
330329
preprocessed_trace,
331330
lookup_element,
332-
Reg3Accessed,
333331
Reg3Address,
334332
PreprocessedColumn::Reg3TsCur,
335333
ValueAEffective,
@@ -433,17 +431,15 @@ impl RegisterMemCheckChip {
433431
&tuple,
434432
));
435433
}
436-
fn subtract_prev_reg(
434+
fn subtract_prev_reg<AccessFlag: VirtualColumn<1>>(
437435
logup_trace_gen: &mut LogupTraceGenerator,
438436
original_traces: &FinalizedTraces,
439437
lookup_element: &RegisterCheckLookupElements,
440-
accessed: Column,
441438
reg_address: Column,
442439
prev_ts: Column,
443440
prev_value: Column,
444441
) {
445442
let mut logup_col_gen = logup_trace_gen.new_col();
446-
let [reg_accessed] = original_traces.get_base_column(accessed);
447443
let [reg_idx] = original_traces.get_base_column(reg_address);
448444
let reg_prev_ts: [_; WORD_SIZE] = original_traces.get_base_column(prev_ts);
449445
let reg_prev_value: [_; WORD_SIZE] = original_traces.get_base_column(prev_value);
@@ -454,7 +450,7 @@ impl RegisterMemCheckChip {
454450
}
455451
assert_eq!(tuple.len(), Self::TUPLE_SIZE);
456452
let denom = lookup_element.combine(tuple.as_slice());
457-
let numerator = -reg_accessed.data[vec_row];
453+
let numerator = -(AccessFlag::read_from_finalized_traces(original_traces, vec_row)[0]);
458454
logup_col_gen.write_frac(vec_row, numerator.into(), denom);
459455
}
460456
logup_col_gen.finalize_col();
@@ -464,12 +460,11 @@ impl RegisterMemCheckChip {
464460
eval: &mut E,
465461
trace_eval: &TraceEval<E>,
466462
lookup_elements: &RegisterCheckLookupElements,
467-
accessed: Column,
463+
reg_accessed: E::F,
468464
reg_address: Column,
469465
prev_ts: Column,
470466
prev_value: Column,
471467
) {
472-
let [reg_accessed] = trace_eval.column_eval(accessed);
473468
let [reg_idx] = trace_eval.column_eval(reg_address);
474469
let reg_prev_ts = trace_eval.column_eval::<WORD_SIZE>(prev_ts);
475470
let reg_prev_value = trace_eval.column_eval::<WORD_SIZE>(prev_value);
@@ -487,18 +482,16 @@ impl RegisterMemCheckChip {
487482
));
488483
}
489484

490-
fn add_cur_reg(
485+
fn add_cur_reg<AccessFlag: VirtualColumn<1>>(
491486
logup_trace_gen: &mut LogupTraceGenerator,
492487
original_traces: &FinalizedTraces,
493488
preprocessed_trace: &PreprocessedTraces,
494489
lookup_element: &RegisterCheckLookupElements,
495-
accessed: Column,
496490
reg_address: Column,
497491
cur_ts: PreprocessedColumn,
498492
cur_value: Column,
499493
) {
500494
let mut logup_col_gen = logup_trace_gen.new_col();
501-
let [reg_accessed] = original_traces.get_base_column(accessed);
502495
let [reg_idx] = original_traces.get_base_column(reg_address);
503496
let reg_cur_ts: [_; WORD_SIZE] = preprocessed_trace.get_preprocessed_base_column(cur_ts);
504497
let reg_cur_value: [_; WORD_SIZE] = original_traces.get_base_column(cur_value);
@@ -509,7 +502,7 @@ impl RegisterMemCheckChip {
509502
}
510503
assert_eq!(tuple.len(), Self::TUPLE_SIZE);
511504
let denom = lookup_element.combine(tuple.as_slice());
512-
let numerator = reg_accessed.data[vec_row];
505+
let [numerator] = AccessFlag::read_from_finalized_traces(original_traces, vec_row);
513506
logup_col_gen.write_frac(vec_row, numerator.into(), denom);
514507
}
515508
logup_col_gen.finalize_col();
@@ -519,12 +512,11 @@ impl RegisterMemCheckChip {
519512
eval: &mut E,
520513
trace_eval: &TraceEval<E>,
521514
lookup_elements: &RegisterCheckLookupElements,
522-
accessed: Column,
515+
reg_accessed: E::F,
523516
reg_address: Column,
524517
cur_ts: PreprocessedColumn,
525518
cur_value: Column,
526519
) {
527-
let [reg_accessed] = trace_eval.column_eval(accessed);
528520
let [reg_idx] = trace_eval.column_eval(reg_address);
529521
let reg_cur_ts = trace_eval.preprocessed_column_eval::<WORD_SIZE>(cur_ts);
530522
let reg_cur_value = trace_eval.column_eval::<WORD_SIZE>(cur_value);

prover/src/chips/range_check/range_bool.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::{
1111
IsSub, IsSw, IsSysCycleCount, IsSysDebug, IsSysHalt, IsSysHeapReset, IsSysPrivInput,
1212
IsSysStackReset, IsXor, LtFlag, OpA0, OpB0, OpB4, OpC0, OpC11, OpC12, OpC20, OpC4,
1313
PcCarry, ProgCtrCarry, Ram1Accessed, Ram2Accessed, Ram3Accessed, Ram4Accessed,
14-
RamInitFinalFlag, Reg1Accessed, Reg2Accessed, Reg3Accessed, RemAux, SgnA, SgnB, SgnC,
15-
ShiftBit1, ShiftBit2, ShiftBit3, ShiftBit4, ShiftBit5, ValueAEffectiveFlag,
14+
RamInitFinalFlag, Reg3Accessed, RemAux, SgnA, SgnB, SgnC, ShiftBit1, ShiftBit2,
15+
ShiftBit3, ShiftBit4, ShiftBit5, ValueAEffectiveFlag,
1616
},
1717
ProgramColumn,
1818
},
@@ -32,7 +32,7 @@ use crate::{
3232
/// RangeBoolChip can be located anywhere in the chip composition.
3333
pub struct RangeBoolChip;
3434

35-
const CHECKED_SINGLE: [Column; 55] = [
35+
const CHECKED_SINGLE: [Column; 53] = [
3636
ValueAEffectiveFlag,
3737
ImmC,
3838
IsAdd,
@@ -75,8 +75,6 @@ const CHECKED_SINGLE: [Column; 55] = [
7575
SgnA,
7676
SgnB,
7777
SgnC,
78-
Reg1Accessed,
79-
Reg2Accessed,
8078
Reg3Accessed,
8179
Ram1Accessed,
8280
Ram2Accessed,

prover/src/column.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,6 @@ pub enum Column {
303303
#[size = 1]
304304
ValueAEffectiveFlagAuxInv,
305305

306-
/// Flag indicating register access slot 1 is used
307-
#[size = 1]
308-
Reg1Accessed,
309-
/// Flag indicating register access slot 2 is used
310-
#[size = 1]
311-
Reg2Accessed,
312306
/// Flag indicating register access slot 3 is used
313307
#[size = 1]
314308
Reg3Accessed,

0 commit comments

Comments
 (0)