Skip to content

Commit 6d190ca

Browse files
chore: replace more tables with boolean types (#80)
Co-authored-by: Jialin Li <[email protected]>
1 parent 10146b0 commit 6d190ca

File tree

1 file changed

+30
-31
lines changed

1 file changed

+30
-31
lines changed

src/_string_tools/slice_packed_field.nr

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -374,12 +374,18 @@ global LAST_LIMB_PATH: [Field; 36] = [
374374
0x3ffffffff,
375375
];
376376

377-
global INTEGER_UP_TO_62_IS_GREATER_THAN_31: [Field; 63] = [
378-
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
379-
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
377+
global INTEGER_UP_TO_62_IS_GREATER_THAN_31: [bool; 63] = [
378+
false, false, false, false, false, false, false, false, false, false, false, false, false,
379+
false, false, false, false, false, false, false, false, false, false, false, false, false,
380+
false, false, false, false, false, false, true, true, true, true, true, true, true, true, true,
381+
true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
382+
true, true, true, true, true, true,
383+
];
384+
global NUM_BYTES_MOD_31_IS_ZERO: [bool; 31] = [
385+
true, false, false, false, false, false, false, false, false, false, false, false, false, false,
386+
false, false, false, false, false, false, false, false, false, false, false, false, false,
387+
false, false, false, false,
380388
];
381-
global NUM_BYTES_MOD_31_IS_ZERO: [Field; 31] =
382-
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
383389
global BYTE_SHIFT: [Field; 32] = [
384390
1,
385391
0x1000000000000000000000000000000000000000000000000000000000000,
@@ -692,17 +698,19 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
692698
let num_bytes_div_31_is_0 = NUM_BYTES_MOD_31_IS_ZERO[num_bytes_div_31 as u32];
693699

694700
// 1, 12
695-
let lookup = (-num_bytes_div_31_is_0 * num_bytes) - start_mod_31 as Field + 62;
701+
let lookup = 62 - num_bytes_div_31_is_0 as Field * num_bytes - start_mod_31 as Field;
696702
std::as_witness(lookup);
697703
// 3, 15
698704
let bytes_fit_into_limb =
699-
INTEGER_UP_TO_62_IS_GREATER_THAN_31[cast_num_to_u32(lookup)] * num_bytes_div_31_is_0;
700-
std::as_witness(bytes_fit_into_limb);
705+
INTEGER_UP_TO_62_IS_GREATER_THAN_31[cast_num_to_u32(lookup)] & num_bytes_div_31_is_0;
706+
std::as_witness(bytes_fit_into_limb as Field);
701707

702708
// 2, 17
703-
let num_unused_bytes_in_start_limb = (num_bytes + start_mod_31 as Field - 31)
704-
* bytes_fit_into_limb
705-
+ (31 - start_mod_31 as Field);
709+
let num_unused_bytes_in_start_limb = if bytes_fit_into_limb {
710+
num_bytes
711+
} else {
712+
(31 - start_mod_31 as Field)
713+
};
706714
std::as_witness(num_unused_bytes_in_start_limb);
707715
let num_remaining_bytes = num_bytes - num_unused_bytes_in_start_limb;
708716

@@ -712,25 +720,22 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
712720
// 44, 65.5
713721
let (_, tail) = slice_field(data[start_index as u32], num_underflow_bytes as u32);
714722

715-
let mut previous = tail;
716-
717-
let mut result = [0; OutputFields];
718-
719723
// 4, 69.5
720-
let extra_head_section = INTEGER_UP_TO_62_IS_GREATER_THAN_31[(
721-
31 + num_overflow_bytes - start_mod_31
722-
) as u32]
723-
* (1 - bytes_fit_into_limb);
724+
let int_greater_than_61 =
725+
INTEGER_UP_TO_62_IS_GREATER_THAN_31[(31 + num_overflow_bytes - start_mod_31) as u32];
726+
let extra_head_section = int_greater_than_61 & !bytes_fit_into_limb;
724727

725728
// 1, 70.5
726-
let index_of_output_limb: Field = (num_bytes_div_31 as Field - num_bytes_mod_31_is_0);
729+
let index_of_output_limb: Field = (num_bytes_div_31 as Field - num_bytes_mod_31_is_0 as Field);
727730
// 5, 75.5
728731
let path_valid_output: [Field; OutputFields] = get_last_limb_path(index_of_output_limb);
729732

730733
// 2, 77.5
731734
let tail_shift = BYTE_SHIFT[cast_num_to_u32(num_unused_bytes_in_start_limb)];
732735

733736
// 51, 128.5
737+
let mut result = [0; OutputFields];
738+
let mut previous = tail;
734739
for i in 0..(OutputFields - 1) {
735740
// 0
736741
let slice_valid = path_valid_output[i];
@@ -749,11 +754,12 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
749754
}
750755

751756
// 2, 130.5
752-
let slice_size =
753-
(num_bytes + start_mod_31 as Field) * bytes_fit_into_limb + num_overflow_bytes as Field;
757+
let slice_size = (bytes_fit_into_limb as Field) * (num_bytes + start_mod_31 as Field)
758+
+ num_overflow_bytes as Field;
754759

755760
// 1, 131.5
756-
let use_previous_for_last_limb: Field = extra_head_section + bytes_fit_into_limb;
761+
let use_previous_for_last_limb: Field =
762+
extra_head_section as Field + bytes_fit_into_limb as Field;
757763

758764
// 1, 132.5
759765
let index_of_overflow_limb = start_index + num_whole_limbs + 1;
@@ -781,21 +787,14 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
781787
std::as_witness(last_limb);
782788

783789
let mut path: [Field; OutputFields] = [0; OutputFields];
784-
// 2, 190.5
790+
path[0] = (1 - path_valid_output[0]);
785791
for i in 1..OutputFields {
786792
path[i] = path_valid_output[i] * -path_valid_output[i - 1] + path_valid_output[i - 1];
787793
}
788-
// 1, 191.5
789-
path[0] = (1 - path_valid_output[0]);
790794

791-
// 4, 195.5
792-
// actual valud = 182, missing gates?
793795
for i in 0..OutputFields {
794-
// 2
795796
result[i] = (last_limb - result[i]) * path[i] + result[i];
796-
// std::as_witness(result[i]);
797797
}
798-
// actual value = 182?
799798
result
800799
}
801800

0 commit comments

Comments
 (0)