@@ -12,9 +12,9 @@ use stwo_prover::{
1212use 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) ;
0 commit comments