@@ -167,7 +167,6 @@ impl<'a, T: FieldElement> BlockMachineProcessor<'a, T> {
167
167
. filter_map ( |( i, is_input) | ( !is_input) . then_some ( Variable :: Param ( i) ) )
168
168
. collect_vec ( ) ;
169
169
let mut result = Processor :: new (
170
- self . fixed_data ,
171
170
identities,
172
171
queue_items,
173
172
requested_known. iter ( ) . cloned ( ) ,
@@ -513,29 +512,31 @@ main_binary::operation_id[3] = params[0];
513
512
main_binary::A[3] = params[1];
514
513
main_binary::B[3] = params[2];
515
514
main_binary::operation_id[2] = main_binary::operation_id[3];
515
+ 2**0 * main_binary::A[2] + 2**24 * main_binary::A_byte[2] := main_binary::A[3];
516
+ 2**0 * main_binary::B[2] + 2**24 * main_binary::B_byte[2] := main_binary::B[3];
517
+ main_binary::operation_id_next[2] = main_binary::operation_id[3];
518
+ call_var(9, 2, 1) = main_binary::A_byte[2];
519
+ call_var(9, 2, 2) = main_binary::B_byte[2];
520
+ call_var(9, 2, 0) = main_binary::operation_id_next[2];
516
521
main_binary::operation_id[1] = main_binary::operation_id[2];
522
+ 2**0 * main_binary::A[1] + 2**16 * main_binary::A_byte[1] := main_binary::A[2];
523
+ 2**0 * main_binary::B[1] + 2**16 * main_binary::B_byte[1] := main_binary::B[2];
524
+ main_binary::operation_id_next[1] = main_binary::operation_id[2];
517
525
main_binary::operation_id[0] = main_binary::operation_id[1];
518
- main_binary::operation_id_next[-1] = main_binary::operation_id[0];
519
- call_var(9, -1, 0) = main_binary::operation_id_next[-1];
520
526
main_binary::operation_id_next[0] = main_binary::operation_id[1];
521
- call_var(9, 0, 0) = main_binary::operation_id_next[0];
522
- main_binary::operation_id_next[1] = main_binary::operation_id[2];
523
- call_var(9, 1, 0) = main_binary::operation_id_next[1];
524
- 2**24 * main_binary::A_byte[2] + 2**0 * main_binary::A[2] := main_binary::A[3];
525
- call_var(9, 2, 1) = main_binary::A_byte[2];
526
- 2**16 * main_binary::A_byte[1] + 2**0 * main_binary::A[1] := main_binary::A[2];
527
+ 2**0 * main_binary::A[0] + 2**8 * main_binary::A_byte[0] := main_binary::A[1];
527
528
call_var(9, 1, 1) = main_binary::A_byte[1];
528
- 2**8 * main_binary::A_byte[0] + 2**0 * main_binary::A[0] := main_binary::A[1];
529
- call_var(9, 0, 1) = main_binary::A_byte[0];
530
- main_binary::A_byte[-1] = main_binary::A[0];
531
- call_var(9, -1, 1) = main_binary::A_byte[-1];
532
- 2**24 * main_binary::B_byte[2] + 2**0 * main_binary::B[2] := main_binary::B[3];
533
- call_var(9, 2, 2) = main_binary::B_byte[2];
534
- 2**16 * main_binary::B_byte[1] + 2**0 * main_binary::B[1] := main_binary::B[2];
529
+ 2**0 * main_binary::B[0] + 2**8 * main_binary::B_byte[0] := main_binary::B[1];
535
530
call_var(9, 1, 2) = main_binary::B_byte[1];
536
- 2**8 * main_binary::B_byte[0] + 2**0 * main_binary::B[0] := main_binary::B[1];
537
- call_var(9, 0, 2) = main_binary::B_byte[0];
531
+ call_var(9, 1, 0) = main_binary::operation_id_next[1];
532
+ main_binary::operation_id_next[-1] = main_binary::operation_id[0];
533
+ call_var(9, 0, 0) = main_binary::operation_id_next[0];
534
+ main_binary::A_byte[-1] = main_binary::A[0];
535
+ call_var(9, 0, 1) = main_binary::A_byte[0];
538
536
main_binary::B_byte[-1] = main_binary::B[0];
537
+ call_var(9, 0, 2) = main_binary::B_byte[0];
538
+ call_var(9, -1, 0) = main_binary::operation_id_next[-1];
539
+ call_var(9, -1, 1) = main_binary::A_byte[-1];
539
540
call_var(9, -1, 2) = main_binary::B_byte[-1];
540
541
machine_call(2, [Known(call_var(9, -1, 0)), Known(call_var(9, -1, 1)), Known(call_var(9, -1, 2)), Unknown(call_var(9, -1, 3))]);
541
542
main_binary::C_byte[-1] = call_var(9, -1, 3);
@@ -546,8 +547,6 @@ main_binary::C[1] = (main_binary::C[0] + (main_binary::C_byte[0] * 256));
546
547
machine_call(2, [Known(call_var(9, 1, 0)), Known(call_var(9, 1, 1)), Known(call_var(9, 1, 2)), Unknown(call_var(9, 1, 3))]);
547
548
main_binary::C_byte[1] = call_var(9, 1, 3);
548
549
main_binary::C[2] = (main_binary::C[1] + (main_binary::C_byte[1] * 65536));
549
- main_binary::operation_id_next[2] = main_binary::operation_id[3];
550
- call_var(9, 2, 0) = main_binary::operation_id_next[2];
551
550
machine_call(2, [Known(call_var(9, 2, 0)), Known(call_var(9, 2, 1)), Known(call_var(9, 2, 2)), Unknown(call_var(9, 2, 3))]);
552
551
main_binary::C_byte[2] = call_var(9, 2, 3);
553
552
main_binary::C[3] = (main_binary::C[2] + (main_binary::C_byte[2] * 16777216));
@@ -608,16 +607,16 @@ params[1] = Sub::b[0];"
608
607
assert_eq ! (
609
608
format_code( & code) ,
610
609
"SubM::a[0] = params[0];
611
- 2**8 * SubM::b [0] + 2**0 * SubM::c [0] := SubM::a[0];
610
+ 2**0 * SubM::c [0] + 2**8 * SubM::b [0] := SubM::a[0];
612
611
params[1] = SubM::b[0];
613
612
params[2] = SubM::c[0];
614
613
call_var(1, 0, 0) = SubM::c[0];
615
- machine_call(2, [Known(call_var(1, 0, 0))]) ;
614
+ SubM::c[1] = SubM::c[0] ;
616
615
SubM::b[1] = SubM::b[0];
617
616
call_var(1, 1, 0) = SubM::b[1];
618
- SubM::c [1] = SubM::c[0] ;
619
- machine_call(2, [Known(call_var(1, 1 , 0))]);
620
- SubM::a[1] = ((SubM::b[1] * 256) + SubM::c[1 ]);"
617
+ SubM::a [1] = (( SubM::b[1] * 256) + SubM::c[1]) ;
618
+ machine_call(2, [Known(call_var(1, 0 , 0))]);
619
+ machine_call(2, [Known(call_var(1, 1, 0)) ]);"
621
620
) ;
622
621
}
623
622
@@ -671,15 +670,15 @@ machine_call(3, [Known(call_var(3, 0, 0))]);"
671
670
code,
672
671
"S::a[0] = params[0];
673
672
S::b[0] = 0;
674
- params[1] = 0;
675
673
S::b[1] = 0;
676
674
S::c[0] = 1;
677
- params[2] = 1;
678
675
S::b[2] = 0;
679
676
S::c[1] = 1;
680
677
S::b[3] = 8;
681
678
S::c[2] = 1;
682
- S::c[3] = 9;"
679
+ S::c[3] = 9;
680
+ params[1] = 0;
681
+ params[2] = 1;"
683
682
) ;
684
683
}
685
684
@@ -817,4 +816,68 @@ S::Z[0] = params[1];
817
816
params[2] = S::carry[0];"
818
817
) ;
819
818
}
819
+
820
+ #[ test]
821
+ fn bit_decomp_negative_concrete ( ) {
822
+ let input = "
823
+ namespace Main(256);
824
+ col witness a, b, c;
825
+ [a, b, c] is [S.Y, S.Z, S.carry];
826
+ namespace S(256);
827
+ let BYTE: col = |i| i & 0xff;
828
+ let X;
829
+ let Y;
830
+ let Z;
831
+ Y = 19;
832
+ Z = 16;
833
+ let carry;
834
+ carry * (1 - carry) = 0;
835
+ [ X ] in [ BYTE ];
836
+ [ Y ] in [ BYTE ];
837
+ [ Z ] in [ BYTE ];
838
+ X + Y = Z + 256 * carry;
839
+ " ;
840
+ let code = format_code ( & generate_for_block_machine ( input, "S" , 2 , 1 ) . unwrap ( ) . code ) ;
841
+ assert_eq ! (
842
+ code,
843
+ "\
844
+ S::Y[0] = params[0];
845
+ S::Z[0] = params[1];
846
+ S::X[0] = 253;
847
+ S::carry[0] = 1;
848
+ params[2] = 1;"
849
+ ) ;
850
+ }
851
+
852
+ #[ test]
853
+ fn bit_decomp_negative_concrete_2 ( ) {
854
+ let input = "
855
+ namespace Main(256);
856
+ col witness a, b, c;
857
+ [a, b, c] is [S.Y, S.Z, S.carry];
858
+ namespace S(256);
859
+ let BYTE: col = |i| i & 0xff;
860
+ let X;
861
+ let Y;
862
+ let Z;
863
+ Y = 1;
864
+ Z = 16;
865
+ let carry;
866
+ carry * (1 - carry) = 0;
867
+ [ X ] in [ BYTE ];
868
+ [ Y ] in [ BYTE ];
869
+ [ Z ] in [ BYTE ];
870
+ X + Y = Z + 256 * carry;
871
+ " ;
872
+ let code = format_code ( & generate_for_block_machine ( input, "S" , 2 , 1 ) . unwrap ( ) . code ) ;
873
+ assert_eq ! (
874
+ code,
875
+ "\
876
+ S::Y[0] = params[0];
877
+ S::Z[0] = params[1];
878
+ S::X[0] = 15;
879
+ S::carry[0] = 0;
880
+ params[2] = 0;"
881
+ ) ;
882
+ }
820
883
}
0 commit comments