@@ -13,7 +13,7 @@ use stwo_prover::core::pcs::TreeBuilder;
1313use stwo_prover:: core:: utils:: bit_reverse_coset_to_circle_domain_order;
1414use stwo_prover:: core:: vcs:: blake2_merkle:: Blake2sMerkleChannel ;
1515
16- use super :: component:: { Claim , InteractionClaim , RET_INSTRUCTION } ;
16+ use super :: component:: { Claim , InteractionClaim , INSTRUCTION_BASE } ;
1717use crate :: components:: memory;
1818use crate :: input:: instructions:: VmState ;
1919use crate :: relations:: { MemoryRelation , StateRelation , N_MEMORY_ELEMS , STATE_SIZE } ;
@@ -77,7 +77,7 @@ impl ClaimGenerator {
7777 ) -> ( Claim , InteractionClaimGenerator ) {
7878 let ( trace, lookup_data) = write_trace_simd ( & self . inputs , memory_trace_generator) ;
7979
80- let n_rows = self . inputs . len ( ) ;
80+ let n_rows = self . inputs . len ( ) * N_LANES ;
8181 assert_ne ! ( n_rows, 0 ) ;
8282
8383 lookup_data. memory . iter ( ) . for_each ( |c| {
@@ -116,9 +116,13 @@ impl InteractionClaimGenerator {
116116 let log_size = std:: cmp:: max ( self . n_rows . next_power_of_two ( ) . ilog2 ( ) , LOG_N_LANES ) ;
117117 let mut logup_gen = LogupTraceGenerator :: new ( log_size) ;
118118
119- let mut col0 = logup_gen. new_col ( ) ;
120119 let state_use = & self . lookup_data . state [ 0 ] ;
121120 let read_pc = & self . lookup_data . memory [ 0 ] ;
121+ let fp_minus_one = & self . lookup_data . memory [ 1 ] ;
122+ let fp_minus_two = & self . lookup_data . memory [ 2 ] ;
123+ let state_yield = & self . lookup_data . state [ 1 ] ;
124+
125+ let mut col0 = logup_gen. new_col ( ) ;
122126 for ( i, ( x, y) ) in zip_eq ( state_use, read_pc) . enumerate ( ) {
123127 let denom_x: PackedQM31 = state_relation. combine ( x) ;
124128 let denom_y: PackedQM31 = memory_relation. combine ( y) ;
@@ -127,13 +131,22 @@ impl InteractionClaimGenerator {
127131 }
128132 col0. finalize_col ( ) ;
129133
130- let mut col_gen = logup_gen. new_col ( ) ;
131- let state_yield = & self . lookup_data . state [ 1 ] ;
132- for ( i, values) in state_yield. iter ( ) . enumerate ( ) {
133- let denom: PackedQM31 = state_relation. combine ( values) ;
134- col_gen. write_frac ( i, -PackedQM31 :: one ( ) , denom) ;
134+ let mut col1 = logup_gen. new_col ( ) ;
135+ for ( i, ( x, y) ) in zip_eq ( fp_minus_one, fp_minus_two) . enumerate ( ) {
136+ let denom_x: PackedQM31 = memory_relation. combine ( x) ;
137+ let denom_y: PackedQM31 = memory_relation. combine ( y) ;
138+
139+ col1. write_frac ( i, denom_x + denom_y, denom_x * denom_y)
140+ }
141+ col1. finalize_col ( ) ;
142+
143+ let mut col2 = logup_gen. new_col ( ) ;
144+ for ( i, x) in state_yield. iter ( ) . enumerate ( ) {
145+ let denom_x: PackedQM31 = state_relation. combine ( x) ;
146+
147+ col2. write_frac ( i, -PackedQM31 :: one ( ) , denom_x)
135148 }
136- col_gen . finalize_col ( ) ;
149+ col2 . finalize_col ( ) ;
137150
138151 let ( trace, claimed_sum) = logup_gen. finalize_last ( ) ;
139152 tree_builder. extend_evals ( trace) ;
@@ -164,13 +177,13 @@ fn write_trace_simd(
164177 . par_iter_mut ( )
165178 . zip ( inputs. par_iter ( ) )
166179 . zip ( lookup_data. par_iter_mut ( ) )
167- . for_each ( |( ( row, ret_opcode_input ) , lookup_data) | {
168- let col0_pc = ret_opcode_input . pc ;
180+ . for_each ( |( ( row, input ) , lookup_data) | {
181+ let col0_pc = input . pc ;
169182 * row[ 0 ] = col0_pc;
170183 // Not added to memory inputs: `ap` not part of constraint yet.
171- let col1_ap = ret_opcode_input . ap ;
184+ let col1_ap = input . ap ;
172185 * row[ 1 ] = col1_ap;
173- let col2_fp = ret_opcode_input . fp ;
186+ let col2_fp = input . fp ;
174187 * row[ 2 ] = col2_fp;
175188 let mem_fp_minus_one = memory_trace_generator
176189 . deduce_output ( ( col2_fp) - ( PackedM31 :: broadcast ( M31 :: one ( ) ) ) ) ;
@@ -184,18 +197,31 @@ fn write_trace_simd(
184197
185198 * lookup_data. memory [ 0 ] = std:: array:: from_fn ( |i| match i {
186199 0 => col0_pc,
187- 1 => PackedM31 :: broadcast ( RET_INSTRUCTION ) ,
200+ 1 => PackedM31 :: broadcast ( INSTRUCTION_BASE ) ,
188201 _ => PackedM31 :: zero ( ) ,
189202 } ) ;
190203
191- let [ v0, v1, v2, v3] = mem_fp_minus_one. into_packed_m31s ( ) ;
192- * lookup_data. memory [ 1 ] = [ col2_fp - PackedM31 :: broadcast ( M31 :: one ( ) ) , v0, v1, v2, v3] ;
193-
194- let [ v0, v1, v2, v3] = mem_fp_minus_two. into_packed_m31s ( ) ;
195- * lookup_data. memory [ 2 ] = [ col2_fp - PackedM31 :: broadcast ( M31 :: from ( 2 ) ) , v0, v1, v2, v3] ;
204+ let [ new_pc, _, _, _] = mem_fp_minus_one. into_packed_m31s ( ) ;
205+ * lookup_data. memory [ 1 ] = [
206+ col2_fp - PackedM31 :: broadcast ( M31 :: one ( ) ) ,
207+ new_pc,
208+ PackedM31 :: zero ( ) ,
209+ PackedM31 :: zero ( ) ,
210+ PackedM31 :: zero ( ) ,
211+ ] ;
212+
213+ let [ new_fp, _, _, _] = mem_fp_minus_two. into_packed_m31s ( ) ;
214+ * lookup_data. memory [ 2 ] = [
215+ col2_fp - PackedM31 :: broadcast ( M31 :: from ( 2 ) ) ,
216+ new_fp,
217+ PackedM31 :: zero ( ) ,
218+ PackedM31 :: zero ( ) ,
219+ PackedM31 :: zero ( ) ,
220+ ] ;
196221
197222 let col4 = mem_fp_minus_two;
198223 * row[ 4 ] = col4. into_packed_m31s ( ) [ 0 ] ;
224+ * lookup_data. state [ 1 ] = [ new_pc, input. ap , new_fp] ;
199225 } ) ;
200226
201227 ( trace, lookup_data)
0 commit comments