@@ -43,30 +43,12 @@ use crate::{instructions::riscv::constants::UInt, scheme::constants::SEPTIC_EXTE
4343
4444pub ( crate ) const Y6_LO_TOP_BYTE_LT_BOUND : u64 = 60 ;
4545
46- fn shard_ram_ec_point_record < E : ExtensionField > (
47- is_global_write : Expression < E > ,
48- ram_type : Expression < E > ,
49- addr : Expression < E > ,
50- value : impl IntoIterator < Item = Expression < E > > ,
51- shard : Expression < E > ,
52- global_clk : Expression < E > ,
53- local_clk : Expression < E > ,
54- nonce : Expression < E > ,
55- x : & [ WitIn ] ,
56- y : & [ WitIn ] ,
57- ) -> Vec < Expression < E > > {
58- [
59- CustomRWTag :: ShardRamEcPoint . expr :: < E > ( ) ,
60- is_global_write,
61- ram_type,
62- addr,
63- ]
64- . into_iter ( )
65- . chain ( value)
66- . chain ( [ shard, global_clk, local_clk, nonce] )
67- . chain ( x. iter ( ) . map ( |w| w. expr ( ) ) )
68- . chain ( y. iter ( ) . map ( |w| w. expr ( ) ) )
69- . collect ( )
46+ fn shard_ram_ec_point_record < E : ExtensionField > ( x : & [ WitIn ] , y : & [ WitIn ] ) -> Vec < Expression < E > > {
47+ [ CustomRWTag :: ShardRamEcPoint . expr :: < E > ( ) ]
48+ . into_iter ( )
49+ . chain ( x. iter ( ) . map ( |w| w. expr ( ) ) )
50+ . chain ( y. iter ( ) . map ( |w| w. expr ( ) ) )
51+ . collect ( )
7052}
7153
7254/// A record for a read/write into the shard RAM
@@ -213,7 +195,6 @@ pub struct ShardRamConfig<E: ExtensionField> {
213195 pub ( crate ) is_global_write : WitIn ,
214196 pub ( crate ) x : Vec < WitIn > ,
215197 pub ( crate ) y : Vec < WitIn > ,
216- pub ( crate ) slope : Vec < WitIn > ,
217198 // Byte limbs of `y6_lo`, the helper that binds `y[SEPTIC_EXTENSION_DEGREE - 1]`
218199 // to `is_global_write` in `configure`.
219200 pub ( crate ) y6_lo_bytes : [ WitIn ; 4 ] ,
@@ -229,9 +210,6 @@ impl<E: ExtensionField> ShardRamConfig<E> {
229210 let y: Vec < WitIn > = ( 0 ..SEPTIC_EXTENSION_DEGREE )
230211 . map ( |i| cb. create_witin ( || format ! ( "y{}" , i) ) )
231212 . collect ( ) ;
232- let slope: Vec < WitIn > = ( 0 ..SEPTIC_EXTENSION_DEGREE )
233- . map ( |i| cb. create_witin ( || format ! ( "slope{}" , i) ) )
234- . collect ( ) ;
235213 let addr = cb. create_witin ( || "addr" ) ;
236214 let is_ram_register = cb. create_witin ( || "is_ram_register" ) ;
237215 let value = UInt :: new_unchecked ( || "value" , cb) ?;
@@ -292,18 +270,7 @@ impl<E: ExtensionField> ShardRamConfig<E> {
292270 cb. rlc_chip_record ( record) ,
293271 ) ?;
294272
295- let ec_point_record = shard_ram_ec_point_record (
296- is_global_write. expr ( ) ,
297- ram_type,
298- addr. expr ( ) ,
299- value. memory_expr ( ) ,
300- shard. expr ( ) ,
301- global_clk. expr ( ) ,
302- local_clk. expr ( ) ,
303- nonce. expr ( ) ,
304- & x,
305- & y,
306- ) ;
273+ let ec_point_record = shard_ram_ec_point_record ( & x, & y) ;
307274 cb. read_record (
308275 || "shard_ram_ec_point_in" ,
309276 RAMType :: Custom ,
@@ -367,7 +334,6 @@ impl<E: ExtensionField> ShardRamConfig<E> {
367334 Ok ( ShardRamConfig {
368335 x,
369336 y,
370- slope,
371337 addr,
372338 is_ram_register,
373339 value,
@@ -383,14 +349,6 @@ impl<E: ExtensionField> ShardRamConfig<E> {
383349}
384350
385351pub struct ShardRamEcTreeConfig < E : ExtensionField > {
386- pub ( crate ) addr : WitIn ,
387- pub ( crate ) is_ram_register : WitIn ,
388- pub ( crate ) value : UInt < E > ,
389- pub ( crate ) shard : WitIn ,
390- pub ( crate ) global_clk : WitIn ,
391- pub ( crate ) local_clk : WitIn ,
392- pub ( crate ) nonce : WitIn ,
393- pub ( crate ) is_global_write : WitIn ,
394352 pub ( crate ) x : Vec < WitIn > ,
395353 pub ( crate ) y : Vec < WitIn > ,
396354 pub ( crate ) slope : Vec < WitIn > ,
@@ -399,14 +357,6 @@ pub struct ShardRamEcTreeConfig<E: ExtensionField> {
399357
400358impl < E : ExtensionField > ShardRamEcTreeConfig < E > {
401359 pub fn configure ( cb : & mut CircuitBuilder < E > ) -> Result < Self , CircuitBuilderError > {
402- let addr = cb. create_witin ( || "addr" ) ;
403- let is_ram_register = cb. create_witin ( || "is_ram_register" ) ;
404- let value = UInt :: new_unchecked ( || "value" , cb) ?;
405- let shard = cb. create_witin ( || "shard" ) ;
406- let global_clk = cb. create_witin ( || "global_clk" ) ;
407- let local_clk = cb. create_witin ( || "local_clk" ) ;
408- let nonce = cb. create_witin ( || "nonce" ) ;
409- let is_global_write = cb. create_witin ( || "is_global_write" ) ;
410360 let x: Vec < WitIn > = ( 0 ..SEPTIC_EXTENSION_DEGREE )
411361 . map ( |i| cb. create_witin ( || format ! ( "x{i}" ) ) )
412362 . collect ( ) ;
@@ -417,22 +367,7 @@ impl<E: ExtensionField> ShardRamEcTreeConfig<E> {
417367 . map ( |i| cb. create_witin ( || format ! ( "slope{i}" ) ) )
418368 . collect ( ) ;
419369
420- let is_ram_reg: Expression < E > = is_ram_register. expr ( ) ;
421- let reg: Expression < E > = RAMType :: Register . into ( ) ;
422- let mem: Expression < E > = RAMType :: Memory . into ( ) ;
423- let ram_type = is_ram_reg. clone ( ) * reg + ( 1 - is_ram_reg) * mem;
424- let ec_point_record = shard_ram_ec_point_record (
425- is_global_write. expr ( ) ,
426- ram_type,
427- addr. expr ( ) ,
428- value. memory_expr ( ) ,
429- shard. expr ( ) ,
430- global_clk. expr ( ) ,
431- local_clk. expr ( ) ,
432- nonce. expr ( ) ,
433- & x,
434- & y,
435- ) ;
370+ let ec_point_record = shard_ram_ec_point_record ( & x, & y) ;
436371 cb. read_record (
437372 || "shard_ram_ec_point_in" ,
438373 RAMType :: Custom ,
@@ -453,14 +388,6 @@ impl<E: ExtensionField> ShardRamEcTreeConfig<E> {
453388 ) ;
454389
455390 Ok ( Self {
456- addr,
457- is_ram_register,
458- value,
459- shard,
460- global_clk,
461- local_clk,
462- nonce,
463- is_global_write,
464391 x,
465392 y,
466393 slope,
@@ -573,10 +500,10 @@ impl<E: ExtensionField> ShardRamCircuit<E> {
573500 input[ 2 + k + 1 ] = E :: BaseField :: from_canonical_u64 ( record. global_clk ) ;
574501 input[ 2 + k + 2 ] = E :: BaseField :: from_canonical_u32 ( * nonce) ;
575502
576- config
577- . perm_config
578- // TODO: remove hardcoded constant 28
579- . assign_instance ( & mut instance [ 28 + UINT_LIMBS .. ] , input ) ;
503+ config. perm_config . assign_instance (
504+ & mut instance [ config . perm_config . p3_cols [ 0 ] . id as usize .. ] ,
505+ input ,
506+ ) ;
580507
581508 Ok ( ( ) )
582509 }
@@ -811,25 +738,6 @@ impl<E: ExtensionField> ShardRamEcTreeCircuit<E> {
811738 instance : & mut [ E :: BaseField ] ,
812739 input : & ShardRamInput < E > ,
813740 ) {
814- let record = & input. record ;
815- let is_ram_register = match record. ram_type {
816- RAMType :: Register => 1 ,
817- RAMType :: Memory => 0 ,
818- _ => unreachable ! ( ) ,
819- } ;
820- set_val ! ( instance, config. addr, record. addr as u64 ) ;
821- set_val ! ( instance, config. is_ram_register, is_ram_register as u64 ) ;
822- let value = Value :: new_unchecked ( record. value ) ;
823- config. value . assign_limbs ( instance, value. as_u16_limbs ( ) ) ;
824- set_val ! ( instance, config. shard, record. shard) ;
825- set_val ! ( instance, config. global_clk, record. global_clk) ;
826- set_val ! ( instance, config. local_clk, record. local_clk) ;
827- set_val ! ( instance, config. nonce, input. ec_point. nonce as u64 ) ;
828- set_val ! (
829- instance,
830- config. is_global_write,
831- record. is_to_write_set as u64
832- ) ;
833741 config
834742 . x
835743 . iter ( )
@@ -1259,6 +1167,24 @@ mod tests {
12591167 }
12601168 }
12611169
1170+ fn assert_record_rows_match (
1171+ left : & Arc < multilinear_extensions:: mle:: MultilinearExtension < ' _ , E > > ,
1172+ left_rows : std:: ops:: Range < usize > ,
1173+ right : & Arc < multilinear_extensions:: mle:: MultilinearExtension < ' _ , E > > ,
1174+ right_rows : std:: ops:: Range < usize > ,
1175+ label : & str ,
1176+ ) {
1177+ assert_eq ! ( left_rows. len( ) , right_rows. len( ) , "{label} row count" ) ;
1178+ let left_evals = left. get_ext_field_vec ( ) ;
1179+ let right_evals = right. get_ext_field_vec ( ) ;
1180+ for ( left_row, right_row) in left_rows. zip ( right_rows) {
1181+ assert_eq ! (
1182+ left_evals[ left_row] , right_evals[ right_row] ,
1183+ "{label}: left row {left_row}, right row {right_row}"
1184+ ) ;
1185+ }
1186+ }
1187+
12621188 #[ test]
12631189 fn test_shard_ram_split_selectors_and_tower_padding ( ) {
12641190 let read_count = 2 ;
@@ -1405,7 +1331,7 @@ mod tests {
14051331 build_main_witness :: < E , Pcs , CpuBackend < E , Pcs > , CpuProver < CpuBackend < E , Pcs > > > (
14061332 & ec_tree_composed,
14071333 & ec_tree_proof_input,
1408- & [ E :: ONE , E :: from_canonical_u32 ( 11 ) ] ,
1334+ & [ E :: ONE , E :: from_canonical_u32 ( 7 ) ] ,
14091335 WitnessBuildStage :: Tower ,
14101336 ) ;
14111337 let ec_tree_r_len = ec_tree_composed. zkvm_v1_css . r_expressions . len ( )
@@ -1422,6 +1348,25 @@ mod tests {
14221348 ec_tree_r_len..ec_tree_r_len + ec_tree_w_len,
14231349 ( 0 ..write_count) . chain ( write_count + read_count..ec_tree_witness[ 0 ] . height ( ) ) ,
14241350 ) ;
1351+
1352+ let leaf_custom_read = & leaf_records[ leaf_r_len - 1 ] ;
1353+ let leaf_custom_write = & leaf_records[ leaf_r_len + leaf_w_len - 1 ] ;
1354+ let ec_tree_custom_read = & ec_tree_records[ ec_tree_r_len - 1 ] ;
1355+ let ec_tree_custom_write = & ec_tree_records[ ec_tree_r_len + ec_tree_w_len - 1 ] ;
1356+ assert_record_rows_match (
1357+ leaf_custom_read,
1358+ 0 ..read_count,
1359+ ec_tree_custom_write,
1360+ write_count..write_count + read_count,
1361+ "leaf read vs ec-tree write" ,
1362+ ) ;
1363+ assert_record_rows_match (
1364+ leaf_custom_write,
1365+ read_count..read_count + write_count,
1366+ ec_tree_custom_read,
1367+ 0 ..write_count,
1368+ "leaf write vs ec-tree read" ,
1369+ ) ;
14251370 }
14261371
14271372 #[ test]
0 commit comments