Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
alu_arithmetic.hpp
Go to the documentation of this file.
1 
14 #ifndef ALU_ARITHMETIC_HPP_
15 #define ALU_ARITHMETIC_HPP_
19 #include <memory>
20 
21 namespace libsnark
22 {
23 
24 /* arithmetic gadgets */
25 template<typename FieldT>
27 {
28 public:
36 
46  const std::string &annotation_prefix = "")
49  , desval(desval)
50  , arg1val(arg1val)
51  , arg2val(arg2val)
52  , flag(flag)
53  , result(result)
55  {
56  }
57 };
58 
59 template<typename FieldT>
60 class ALU_and_gadget : public ALU_arithmetic_gadget<FieldT>
61 {
62 private:
64  std::shared_ptr<packing_gadget<FieldT>> pack_result;
65  std::shared_ptr<disjunction_gadget<FieldT>> not_all_zeros;
66  pb_variable<FieldT> not_all_zeros_result;
67 
68 public:
78  const std::string &annotation_prefix = "")
79  : ALU_arithmetic_gadget<FieldT>(
80  pb,
82  desval,
83  arg1val,
84  arg2val,
85  flag,
86  result,
89  {
90  res_word.allocate(
91  pb, pb.ap.w, FMT(this->annotation_prefix, " res_bit"));
92  not_all_zeros_result.allocate(
93  pb, FMT(this->annotation_prefix, " not_all_zeros_result"));
94 
95  pack_result.reset(new packing_gadget<FieldT>(
96  pb,
97  res_word,
98  result,
99  FMT(this->annotation_prefix, " pack_result")));
100  not_all_zeros.reset(new disjunction_gadget<FieldT>(
101  pb,
102  res_word,
103  not_all_zeros_result,
104  FMT(this->annotation_prefix, "not_all_zeros")));
105  }
106 
108  void generate_r1cs_witness();
109 };
110 
111 template<typename FieldT> void test_ALU_and_gadget(const size_t w);
112 
113 template<typename FieldT>
114 class ALU_or_gadget : public ALU_arithmetic_gadget<FieldT>
115 {
116 private:
117  pb_variable_array<FieldT> res_word;
118  std::shared_ptr<packing_gadget<FieldT>> pack_result;
119  std::shared_ptr<disjunction_gadget<FieldT>> not_all_zeros;
120  pb_variable<FieldT> not_all_zeros_result;
121 
122 public:
129  const pb_variable<FieldT> &flag,
132  const std::string &annotation_prefix = "")
133  : ALU_arithmetic_gadget<FieldT>(
134  pb,
136  desval,
137  arg1val,
138  arg2val,
139  flag,
140  result,
141  result_flag,
143  {
144  res_word.allocate(
145  pb, pb.ap.w, FMT(this->annotation_prefix, " res_bit"));
146  not_all_zeros_result.allocate(
147  pb, FMT(this->annotation_prefix, " not_all_zeros_result"));
148 
149  pack_result.reset(new packing_gadget<FieldT>(
150  pb,
151  res_word,
152  result,
153  FMT(this->annotation_prefix, " pack_result")));
154  not_all_zeros.reset(new disjunction_gadget<FieldT>(
155  pb,
156  res_word,
157  not_all_zeros_result,
158  FMT(this->annotation_prefix, "not_all_zeros")));
159  }
160 
162  void generate_r1cs_witness();
163 };
164 
165 template<typename FieldT> void test_ALU_or_gadget(const size_t w);
166 
167 template<typename FieldT>
168 class ALU_xor_gadget : public ALU_arithmetic_gadget<FieldT>
169 {
170 private:
171  pb_variable_array<FieldT> res_word;
172  std::shared_ptr<packing_gadget<FieldT>> pack_result;
173  std::shared_ptr<disjunction_gadget<FieldT>> not_all_zeros;
174  pb_variable<FieldT> not_all_zeros_result;
175 
176 public:
183  const pb_variable<FieldT> &flag,
186  const std::string &annotation_prefix = "")
187  : ALU_arithmetic_gadget<FieldT>(
188  pb,
190  desval,
191  arg1val,
192  arg2val,
193  flag,
194  result,
195  result_flag,
197  {
198  res_word.allocate(
199  pb, pb.ap.w, FMT(this->annotation_prefix, " res_bit"));
200  not_all_zeros_result.allocate(
201  pb, FMT(this->annotation_prefix, " not_all_zeros_result"));
202 
203  pack_result.reset(new packing_gadget<FieldT>(
204  pb,
205  res_word,
206  result,
207  FMT(this->annotation_prefix, " pack_result")));
208  not_all_zeros.reset(new disjunction_gadget<FieldT>(
209  pb,
210  res_word,
211  not_all_zeros_result,
212  FMT(this->annotation_prefix, "not_all_zeros")));
213  }
214 
216  void generate_r1cs_witness();
217 };
218 
219 template<typename FieldT> void test_ALU_xor_gadget(const size_t w);
220 
221 template<typename FieldT>
222 class ALU_not_gadget : public ALU_arithmetic_gadget<FieldT>
223 {
224  /* we do bitwise not, because we need to compute flag */
225 private:
226  pb_variable_array<FieldT> res_word;
227  std::shared_ptr<packing_gadget<FieldT>> pack_result;
228  std::shared_ptr<disjunction_gadget<FieldT>> not_all_zeros;
229  pb_variable<FieldT> not_all_zeros_result;
230 
231 public:
238  const pb_variable<FieldT> &flag,
241  const std::string &annotation_prefix = "")
242  : ALU_arithmetic_gadget<FieldT>(
243  pb,
245  desval,
246  arg1val,
247  arg2val,
248  flag,
249  result,
250  result_flag,
252  {
253  res_word.allocate(
254  pb, pb.ap.w, FMT(this->annotation_prefix, " res_bit"));
255  not_all_zeros_result.allocate(
256  pb, FMT(this->annotation_prefix, " not_all_zeros_result"));
257 
258  pack_result.reset(new packing_gadget<FieldT>(
259  pb,
260  res_word,
261  result,
262  FMT(this->annotation_prefix, " pack_result")));
263  not_all_zeros.reset(new disjunction_gadget<FieldT>(
264  pb,
265  res_word,
266  not_all_zeros_result,
267  FMT(this->annotation_prefix, "not_all_zeros")));
268  }
269 
271  void generate_r1cs_witness();
272 };
273 
274 template<typename FieldT> void test_ALU_not_gadget(const size_t w);
275 
276 template<typename FieldT>
277 class ALU_add_gadget : public ALU_arithmetic_gadget<FieldT>
278 {
279 private:
280  pb_variable<FieldT> addition_result;
281  pb_variable_array<FieldT> res_word;
282  pb_variable_array<FieldT> res_word_and_flag;
283  std::shared_ptr<packing_gadget<FieldT>> unpack_addition, pack_result;
284 
285 public:
292  const pb_variable<FieldT> &flag,
295  const std::string &annotation_prefix = "")
296  : ALU_arithmetic_gadget<FieldT>(
297  pb,
299  desval,
300  arg1val,
301  arg2val,
302  flag,
303  result,
304  result_flag,
306  {
307  addition_result.allocate(
308  pb, FMT(this->annotation_prefix, " addition_result"));
309  res_word.allocate(
310  pb, pb.ap.w, FMT(this->annotation_prefix, " res_word"));
311 
312  res_word_and_flag = res_word;
313  res_word_and_flag.emplace_back(result_flag);
314 
315  unpack_addition.reset(new packing_gadget<FieldT>(
316  pb,
317  res_word_and_flag,
318  addition_result,
319  FMT(this->annotation_prefix, " unpack_addition")));
320  pack_result.reset(new packing_gadget<FieldT>(
321  pb,
322  res_word,
323  result,
324  FMT(this->annotation_prefix, " pack_result")));
325  }
326 
328  void generate_r1cs_witness();
329 };
330 
331 void test_ALU_add_gadget(const size_t w);
332 
333 template<typename FieldT>
334 class ALU_sub_gadget : public ALU_arithmetic_gadget<FieldT>
335 {
336 private:
337  pb_variable<FieldT> intermediate_result;
338  pb_variable<FieldT> negated_flag;
339  pb_variable_array<FieldT> res_word;
340  pb_variable_array<FieldT> res_word_and_negated_flag;
341 
342  std::shared_ptr<packing_gadget<FieldT>> unpack_intermediate, pack_result;
343 
344 public:
351  const pb_variable<FieldT> &flag,
354  const std::string &annotation_prefix = "")
355  : ALU_arithmetic_gadget<FieldT>(
356  pb,
358  desval,
359  arg1val,
360  arg2val,
361  flag,
362  result,
363  result_flag,
365  {
366  intermediate_result.allocate(
367  pb, FMT(this->annotation_prefix, " intermediate_result"));
368  negated_flag.allocate(
369  pb, FMT(this->annotation_prefix, " negated_flag"));
370  res_word.allocate(
371  pb, pb.ap.w, FMT(this->annotation_prefix, " res_word"));
372 
373  res_word_and_negated_flag = res_word;
374  res_word_and_negated_flag.emplace_back(negated_flag);
375 
376  unpack_intermediate.reset(new packing_gadget<FieldT>(
377  pb,
378  res_word_and_negated_flag,
379  intermediate_result,
380  FMT(this->annotation_prefix, " unpack_intermediate")));
381  pack_result.reset(new packing_gadget<FieldT>(
382  pb,
383  res_word,
384  result,
385  FMT(this->annotation_prefix, " pack_result")));
386  }
387 
389  void generate_r1cs_witness();
390 };
391 
392 void test_ALU_sub_gadget(const size_t w);
393 
394 template<typename FieldT>
395 class ALU_mov_gadget : public ALU_arithmetic_gadget<FieldT>
396 {
397 public:
404  const pb_variable<FieldT> &flag,
407  const std::string &annotation_prefix = "")
408  : ALU_arithmetic_gadget<FieldT>(
409  pb,
411  desval,
412  arg1val,
413  arg2val,
414  flag,
415  result,
416  result_flag,
418  {
419  }
420 
422  void generate_r1cs_witness();
423 };
424 
425 template<typename FieldT> void test_ALU_mov_gadget(const size_t w);
426 
427 template<typename FieldT>
429 {
430 public:
437  const pb_variable<FieldT> &flag,
440  const std::string &annotation_prefix = "")
441  : ALU_arithmetic_gadget<FieldT>(
442  pb,
444  desval,
445  arg1val,
446  arg2val,
447  flag,
448  result,
449  result_flag,
451  {
452  }
453 
455  void generate_r1cs_witness();
456 };
457 
458 template<typename FieldT> void test_ALU_cmov_gadget(const size_t w);
459 
460 template<typename FieldT>
461 class ALU_cmp_gadget : public ALU_arithmetic_gadget<FieldT>
462 {
463 private:
464  comparison_gadget<FieldT> comparator;
465 
466 public:
473 
480  const pb_variable<FieldT> &flag,
487  const std::string &annotation_prefix = "")
488  : ALU_arithmetic_gadget<FieldT>(
489  pb,
491  desval,
492  arg1val,
493  arg2val,
494  flag,
495  cmpa_result,
498  , comparator(
499  pb,
500  pb.ap.w,
501  arg2val.packed,
502  arg1val.packed,
505  FMT(this->annotation_prefix, " comparator"))
512  {
513  }
514 
516  void generate_r1cs_witness();
517 };
518 
519 template<typename FieldT> void test_ALU_cmpe_gadget(const size_t w);
520 
521 template<typename FieldT> void test_ALU_cmpa_gadget(const size_t w);
522 
523 template<typename FieldT> void test_ALU_cmpae_gadget(const size_t w);
524 
525 template<typename FieldT>
527 {
528 private:
529  pb_variable<FieldT> negated_arg1val_sign;
530  pb_variable<FieldT> negated_arg2val_sign;
531  pb_variable_array<FieldT> modified_arg1;
532  pb_variable_array<FieldT> modified_arg2;
533  pb_variable<FieldT> packed_modified_arg1;
534  pb_variable<FieldT> packed_modified_arg2;
535  std::shared_ptr<packing_gadget<FieldT>> pack_modified_arg1;
536  std::shared_ptr<packing_gadget<FieldT>> pack_modified_arg2;
537  std::shared_ptr<comparison_gadget<FieldT>> comparator;
538 
539 public:
544 
551  const pb_variable<FieldT> &flag,
556  const std::string &annotation_prefix = "")
557  : ALU_arithmetic_gadget<FieldT>(
558  pb,
560  desval,
561  arg1val,
562  arg2val,
563  flag,
564  cmpg_result,
571  {
572  negated_arg1val_sign.allocate(
573  pb, FMT(this->annotation_prefix, " negated_arg1val_sign"));
574  negated_arg2val_sign.allocate(
575  pb, FMT(this->annotation_prefix, " negated_arg2val_sign"));
576 
577  modified_arg1 = pb_variable_array<FieldT>(
578  arg1val.bits.begin(), --arg1val.bits.end());
579  modified_arg1.emplace_back(negated_arg1val_sign);
580 
581  modified_arg2 = pb_variable_array<FieldT>(
582  arg2val.bits.begin(), --arg2val.bits.end());
583  modified_arg2.emplace_back(negated_arg2val_sign);
584 
585  packed_modified_arg1.allocate(
586  pb, FMT(this->annotation_prefix, " packed_modified_arg1"));
587  packed_modified_arg2.allocate(
588  pb, FMT(this->annotation_prefix, " packed_modified_arg2"));
589 
590  pack_modified_arg1.reset(new packing_gadget<FieldT>(
591  pb,
592  modified_arg1,
593  packed_modified_arg1,
594  FMT(this->annotation_prefix, " pack_modified_arg1")));
595  pack_modified_arg2.reset(new packing_gadget<FieldT>(
596  pb,
597  modified_arg2,
598  packed_modified_arg2,
599  FMT(this->annotation_prefix, " pack_modified_arg2")));
600 
601  comparator.reset(new comparison_gadget<FieldT>(
602  pb,
603  pb.ap.w,
604  packed_modified_arg2,
605  packed_modified_arg1,
608  FMT(this->annotation_prefix, " comparator")));
609  }
611  void generate_r1cs_witness();
612 };
613 
614 template<typename FieldT> void test_ALU_cmpg_gadget(const size_t w);
615 
616 template<typename FieldT> void test_ALU_cmpge_gadget(const size_t w);
617 
618 template<typename FieldT>
620 {
621 private:
622  dual_variable_gadget<FieldT> mul_result;
623  pb_variable_array<FieldT> mull_bits;
624  pb_variable_array<FieldT> umulh_bits;
625  pb_variable<FieldT> result_flag;
626  std::shared_ptr<packing_gadget<FieldT>> pack_mull_result;
627  std::shared_ptr<packing_gadget<FieldT>> pack_umulh_result;
628  std::shared_ptr<disjunction_gadget<FieldT>> compute_flag;
629 
630 public:
635 
642  const pb_variable<FieldT> &flag,
647  const std::string &annotation_prefix = "")
648  : ALU_arithmetic_gadget<FieldT>(
649  pb,
651  desval,
652  arg1val,
653  arg2val,
654  flag,
655  mull_result,
656  mull_flag,
658  , mul_result(
659  pb, 2 * pb.ap.w, FMT(this->annotation_prefix, " mul_result"))
664  {
665  mull_bits.insert(
666  mull_bits.end(),
667  mul_result.bits.begin(),
668  mul_result.bits.begin() + pb.ap.w);
669  umulh_bits.insert(
670  umulh_bits.end(),
671  mul_result.bits.begin() + pb.ap.w,
672  mul_result.bits.begin() + 2 * pb.ap.w);
673 
674  pack_mull_result.reset(new packing_gadget<FieldT>(
675  pb,
676  mull_bits,
677  mull_result,
678  FMT(this->annotation_prefix, " pack_mull_result")));
679  pack_umulh_result.reset(new packing_gadget<FieldT>(
680  pb,
681  umulh_bits,
682  umulh_result,
683  FMT(this->annotation_prefix, " pack_umulh_result")));
684 
685  result_flag.allocate(pb, FMT(this->annotation_prefix, " result_flag"));
686  compute_flag.reset(new disjunction_gadget<FieldT>(
687  pb,
688  umulh_bits,
689  result_flag,
690  FMT(this->annotation_prefix, " compute_flag")));
691  }
693  void generate_r1cs_witness();
694 };
695 
696 template<typename FieldT> void test_ALU_mull_gadget(const size_t w);
697 
698 template<typename FieldT> void test_ALU_umulh_gadget(const size_t w);
699 
700 template<typename FieldT>
702 {
703 private:
704  dual_variable_gadget<FieldT> mul_result;
705  pb_variable_array<FieldT> smulh_bits;
706 
708  std::shared_ptr<packing_gadget<FieldT>> pack_top;
709 
710  pb_variable<FieldT> is_top_empty, is_top_empty_aux;
711  pb_variable<FieldT> is_top_full, is_top_full_aux;
712 
713  pb_variable<FieldT> result_flag;
714  std::shared_ptr<packing_gadget<FieldT>> pack_smulh_result;
715 
716 public:
719 
726  const pb_variable<FieldT> &flag,
729  const std::string &annotation_prefix = "")
730  : ALU_arithmetic_gadget<FieldT>(
731  pb,
733  desval,
734  arg1val,
735  arg2val,
736  flag,
737  smulh_result,
738  smulh_flag,
740  , mul_result(
741  pb, 2 * pb.ap.w + 1, FMT(this->annotation_prefix, " mul_result"))
742  , /* see witness map for explanation for 2w+1 */
745  {
746  smulh_bits.insert(
747  smulh_bits.end(),
748  mul_result.bits.begin() + pb.ap.w,
749  mul_result.bits.begin() + 2 * pb.ap.w);
750 
751  pack_smulh_result.reset(new packing_gadget<FieldT>(
752  pb,
753  smulh_bits,
754  smulh_result,
755  FMT(this->annotation_prefix, " pack_smulh_result")));
756 
757  top.allocate(pb, FMT(this->annotation_prefix, " top"));
758  pack_top.reset(new packing_gadget<FieldT>(
759  pb,
761  mul_result.bits.begin() + pb.ap.w - 1,
762  mul_result.bits.begin() + 2 * pb.ap.w),
763  top,
764  FMT(this->annotation_prefix, " pack_top")));
765 
766  is_top_empty.allocate(
767  pb, FMT(this->annotation_prefix, " is_top_empty"));
768  is_top_empty_aux.allocate(
769  pb, FMT(this->annotation_prefix, " is_top_empty_aux"));
770 
771  is_top_full.allocate(pb, FMT(this->annotation_prefix, " is_top_full"));
772  is_top_full_aux.allocate(
773  pb, FMT(this->annotation_prefix, " is_top_full_aux"));
774 
775  result_flag.allocate(pb, FMT(this->annotation_prefix, " result_flag"));
776  }
778  void generate_r1cs_witness();
779 };
780 
781 template<typename FieldT> void test_ALU_smulh_gadget(const size_t w);
782 
783 template<typename FieldT>
785 {
786  /*
787  <<<<<<< Updated upstream
788  B * q + r = A_aux = A * B_nonzero
789  q * (1-B_nonzero) = 0
790  A<B_gadget<FieldT>(r < B, less=B_nonzero, leq=ONE)
791  =======
792  B * q + r = A
793 
794  r <= B
795  >>>>>>> Stashed changes
796  */
797 private:
798  pb_variable<FieldT> B_inv;
799  pb_variable<FieldT> B_nonzero;
800  pb_variable<FieldT> A_aux;
801  std::shared_ptr<comparison_gadget<FieldT>> r_less_B;
802 
803 public:
808 
815  const pb_variable<FieldT> &flag,
820  const std::string &annotation_prefix = "")
821  : ALU_arithmetic_gadget<FieldT>(
822  pb,
824  desval,
825  arg1val,
826  arg2val,
827  flag,
828  udiv_result,
829  udiv_flag,
835  {
836  B_inv.allocate(pb, FMT(this->annotation_prefix, " B_inv"));
837  B_nonzero.allocate(pb, FMT(this->annotation_prefix, " B_nonzer"));
838  A_aux.allocate(pb, FMT(this->annotation_prefix, " A_aux"));
839  r_less_B.reset(new comparison_gadget<FieldT>(
840  pb,
841  pb.ap.w,
842  umod_result,
843  arg2val.packed,
844  B_nonzero,
845  ONE,
846  FMT(this->annotation_prefix, " r_less_B")));
847  }
849  void generate_r1cs_witness();
850 };
851 
852 template<typename FieldT> void test_ALU_udiv_gadget(const size_t w);
853 
854 template<typename FieldT> void test_ALU_umod_gadget(const size_t w);
855 
856 template<typename FieldT>
858 {
859 private:
860  pb_variable<FieldT> reversed_input;
861  std::shared_ptr<packing_gadget<FieldT>> pack_reversed_input;
862 
863  pb_variable_array<FieldT> barrel_right_internal;
864  std::vector<pb_variable_array<FieldT>> shifted_out_bits;
865 
866  pb_variable<FieldT> is_oversize_shift;
867  std::shared_ptr<disjunction_gadget<FieldT>> check_oversize_shift;
868  pb_variable<FieldT> result;
869 
870  pb_variable_array<FieldT> result_bits;
871  std::shared_ptr<packing_gadget<FieldT>> unpack_result;
872  pb_variable<FieldT> reversed_result;
873  std::shared_ptr<packing_gadget<FieldT>> pack_reversed_result;
874 
875 public:
880 
881  size_t logw;
882 
889  const pb_variable<FieldT> &flag,
894  const std::string &annotation_prefix = "")
895  : ALU_arithmetic_gadget<FieldT>(
896  pb,
898  desval,
899  arg1val,
900  arg2val,
901  flag,
902  shr_result,
903  shr_flag,
906  , shr_flag(shr_flag)
908  , shl_flag(shl_flag)
909  {
910  logw = libff::log2(pb.ap.w);
911 
912  reversed_input.allocate(
913  pb, FMT(this->annotation_prefix, " reversed_input"));
914  pack_reversed_input.reset(new packing_gadget<FieldT>(
915  pb,
917  arg1val.bits.rbegin(), arg1val.bits.rend()),
918  reversed_input,
919  FMT(this->annotation_prefix, " pack_reversed_input")));
920 
921  barrel_right_internal.allocate(
922  pb,
923  logw + 1,
924  FMT(this->annotation_prefix, " barrel_right_internal"));
925 
926  shifted_out_bits.resize(logw);
927  for (size_t i = 0; i < logw; ++i) {
928  shifted_out_bits[i].allocate(
929  pb,
930  1ul << i,
931  FMT(this->annotation_prefix, " shifted_out_bits_%zu", i));
932  }
933 
934  is_oversize_shift.allocate(
935  pb, FMT(this->annotation_prefix, " is_oversize_shift"));
936  check_oversize_shift.reset(new disjunction_gadget<FieldT>(
937  pb,
939  arg2val.bits.begin() + logw, arg2val.bits.end()),
940  is_oversize_shift,
941  FMT(this->annotation_prefix, " check_oversize_shift")));
942  result.allocate(pb, FMT(this->annotation_prefix, " result"));
943 
944  result_bits.allocate(
945  pb, pb.ap.w, FMT(this->annotation_prefix, " result_bits"));
946  unpack_result.reset(new packing_gadget<FieldT>(
947  pb,
948  result_bits,
949  result, // barrel_right_internal[logw],
950  FMT(this->annotation_prefix, " unpack_result")));
951 
952  reversed_result.allocate(
953  pb, FMT(this->annotation_prefix, " reversed_result"));
954  pack_reversed_result.reset(new packing_gadget<FieldT>(
955  pb,
956  pb_variable_array<FieldT>(result_bits.rbegin(), result_bits.rend()),
957  reversed_result,
958  FMT(this->annotation_prefix, " pack_reversed_result")));
959  }
961  void generate_r1cs_witness();
962 };
963 
964 template<typename FieldT> void test_ALU_shr_gadget(const size_t w);
965 
966 template<typename FieldT> void test_ALU_shl_gadget(const size_t w);
967 
968 } // namespace libsnark
969 
971 
972 #endif // ALU_ARITHMETIC_HPP_
libsnark::ALU_cmov_gadget
Definition: alu_arithmetic.hpp:428
libsnark::ALU_xor_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::pb_variable_array::allocate
void allocate(protoboard< FieldT > &pb, const size_t n, const std::string &annotation_prefix)
libsnark::test_ALU_cmov_gadget
void test_ALU_cmov_gadget(const size_t w)
libsnark::ALU_cmps_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_arithmetic_gadget::arg2val
const word_variable_gadget< FieldT > arg2val
Definition: alu_arithmetic.hpp:32
libsnark::dual_variable_gadget
Definition: basic_gadgets.hpp:130
libsnark::gadget::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::ALU_cmov_gadget::ALU_cmov_gadget
ALU_cmov_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:431
libsnark::ALU_cmp_gadget::ALU_cmp_gadget
ALU_cmp_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &cmpe_result, const pb_variable< FieldT > &cmpe_result_flag, const pb_variable< FieldT > &cmpa_result, const pb_variable< FieldT > &cmpa_result_flag, const pb_variable< FieldT > &cmpae_result, const pb_variable< FieldT > &cmpae_result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:474
libsnark::ALU_not_gadget::ALU_not_gadget
ALU_not_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:232
libsnark::ALU_arithmetic_gadget::result
const pb_variable< FieldT > result
Definition: alu_arithmetic.hpp:34
libsnark::ALU_shr_shl_gadget::ALU_shr_shl_gadget
ALU_shr_shl_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &shr_result, const pb_variable< FieldT > &shr_flag, const pb_variable< FieldT > &shl_result, const pb_variable< FieldT > &shl_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:883
libsnark::ALU_arithmetic_gadget::desval
const word_variable_gadget< FieldT > desval
Definition: alu_arithmetic.hpp:30
libsnark::dual_variable_gadget::bits
pb_variable_array< FieldT > bits
Definition: basic_gadgets.hpp:137
libsnark::ALU_not_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_cmps_gadget
Definition: alu_arithmetic.hpp:526
libsnark::ALU_cmov_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark
Definition: accumulation_vector.hpp:18
libsnark::ALU_or_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::pb_variable::allocate
void allocate(protoboard< FieldT > &pb, const std::string &annotation)
libsnark::ALU_cmp_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_arithmetic_gadget::ALU_arithmetic_gadget
ALU_arithmetic_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:37
libsnark::ALU_and_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::test_ALU_sub_gadget
void test_ALU_sub_gadget(const size_t w)
libsnark::test_ALU_cmpe_gadget
void test_ALU_cmpe_gadget(const size_t w)
libsnark::ALU_mov_gadget::ALU_mov_gadget
ALU_mov_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:398
libsnark::ALU_cmov_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::test_ALU_not_gadget
void test_ALU_not_gadget(const size_t w)
libsnark::test_ALU_and_gadget
void test_ALU_and_gadget(const size_t w)
libsnark::ALU_arithmetic_gadget
Definition: alu_arithmetic.hpp:26
libsnark::ALU_arithmetic_gadget::opcode_indicators
const pb_variable_array< FieldT > opcode_indicators
Definition: alu_arithmetic.hpp:29
libsnark::ALU_not_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_shr_shl_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::test_ALU_mov_gadget
void test_ALU_mov_gadget(const size_t w)
libsnark::ALU_cmps_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_smul_gadget::ALU_smul_gadget
ALU_smul_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &smulh_result, const pb_variable< FieldT > &smulh_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:720
libsnark::ALU_divmod_gadget::umod_flag
const pb_variable< FieldT > umod_flag
Definition: alu_arithmetic.hpp:807
libsnark::comparison_gadget
Definition: basic_gadgets.hpp:246
libsnark::ALU_cmps_gadget::cmpg_result
const pb_variable< FieldT > cmpg_result
Definition: alu_arithmetic.hpp:540
libsnark::ALU_umul_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_and_gadget
Definition: alu_arithmetic.hpp:60
libsnark::ALU_sub_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_umul_gadget::ALU_umul_gadget
ALU_umul_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &mull_result, const pb_variable< FieldT > &mull_flag, const pb_variable< FieldT > &umulh_result, const pb_variable< FieldT > &umulh_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:636
libsnark::test_ALU_umulh_gadget
void test_ALU_umulh_gadget(const size_t w)
libsnark::ALU_divmod_gadget::umod_result
const pb_variable< FieldT > umod_result
Definition: alu_arithmetic.hpp:806
libsnark::ALU_cmps_gadget::cmpg_result_flag
const pb_variable< FieldT > cmpg_result_flag
Definition: alu_arithmetic.hpp:541
word_variable_gadget.hpp
libsnark::test_ALU_cmpae_gadget
void test_ALU_cmpae_gadget(const size_t w)
libsnark::ALU_shr_shl_gadget::shr_flag
pb_variable< FieldT > shr_flag
Definition: alu_arithmetic.hpp:877
libsnark::ALU_or_gadget::ALU_or_gadget
ALU_or_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:123
libsnark::ALU_cmps_gadget::cmpge_result
const pb_variable< FieldT > cmpge_result
Definition: alu_arithmetic.hpp:542
libsnark::ALU_cmp_gadget
Definition: alu_arithmetic.hpp:461
libsnark::ALU_smul_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_mov_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_shr_shl_gadget
Definition: alu_arithmetic.hpp:857
libsnark::ALU_umul_gadget::umulh_result
const pb_variable< FieldT > umulh_result
Definition: alu_arithmetic.hpp:633
libsnark::ALU_cmp_gadget::cmpa_result_flag
const pb_variable< FieldT > cmpa_result_flag
Definition: alu_arithmetic.hpp:470
libsnark::ALU_divmod_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_umul_gadget::umulh_flag
const pb_variable< FieldT > umulh_flag
Definition: alu_arithmetic.hpp:634
libsnark::test_ALU_cmpg_gadget
void test_ALU_cmpg_gadget(const size_t w)
libsnark::test_ALU_mull_gadget
void test_ALU_mull_gadget(const size_t w)
libsnark::ALU_xor_gadget::ALU_xor_gadget
ALU_xor_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:177
libsnark::ALU_shr_shl_gadget::shr_result
pb_variable< FieldT > shr_result
Definition: alu_arithmetic.hpp:876
libsnark::ALU_add_gadget::ALU_add_gadget
ALU_add_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:286
libsnark::test_ALU_udiv_gadget
void test_ALU_udiv_gadget(const size_t w)
libsnark::test_ALU_shl_gadget
void test_ALU_shl_gadget(const size_t w)
tinyram_protoboard.hpp
libsnark::ALU_not_gadget
Definition: alu_arithmetic.hpp:222
libsnark::ALU_cmp_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_divmod_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::test_ALU_add_gadget
void test_ALU_add_gadget(const size_t w)
libsnark::ALU_add_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_mov_gadget
Definition: alu_arithmetic.hpp:395
libsnark::test_ALU_cmpge_gadget
void test_ALU_cmpge_gadget(const size_t w)
libsnark::test_ALU_smulh_gadget
void test_ALU_smulh_gadget(const size_t w)
libsnark::ALU_umul_gadget::mull_result
const pb_variable< FieldT > mull_result
Definition: alu_arithmetic.hpp:631
libsnark::ALU_umul_gadget::mull_flag
const pb_variable< FieldT > mull_flag
Definition: alu_arithmetic.hpp:632
libsnark::ALU_divmod_gadget::udiv_flag
const pb_variable< FieldT > udiv_flag
Definition: alu_arithmetic.hpp:805
libsnark::ALU_umul_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::tinyram_gadget::pb
tinyram_protoboard< FieldT > & pb
Definition: tinyram_protoboard.hpp:34
libsnark::ALU_or_gadget
Definition: alu_arithmetic.hpp:114
libsnark::ALU_cmp_gadget::cmpa_result
const pb_variable< FieldT > cmpa_result
Definition: alu_arithmetic.hpp:469
libsnark::test_ALU_or_gadget
void test_ALU_or_gadget(const size_t w)
libsnark::tinyram_protoboard
Definition: tinyram_protoboard.hpp:23
libsnark::ALU_xor_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::ALU_cmp_gadget::cmpae_result
const pb_variable< FieldT > cmpae_result
Definition: alu_arithmetic.hpp:471
libsnark::packing_gadget
Definition: basic_gadgets.hpp:36
basic_gadgets.hpp
libsnark::ALU_cmps_gadget::ALU_cmps_gadget
ALU_cmps_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &cmpg_result, const pb_variable< FieldT > &cmpg_result_flag, const pb_variable< FieldT > &cmpge_result, const pb_variable< FieldT > &cmpge_result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:545
libsnark::pb_variable_array
Definition: pb_variable.hpp:44
libsnark::test_ALU_shr_gadget
void test_ALU_shr_gadget(const size_t w)
libsnark::ALU_shr_shl_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_divmod_gadget
Definition: alu_arithmetic.hpp:784
libsnark::ALU_xor_gadget
Definition: alu_arithmetic.hpp:168
libsnark::ALU_smul_gadget::smulh_flag
const pb_variable< FieldT > smulh_flag
Definition: alu_arithmetic.hpp:718
libsnark::ALU_smul_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::tinyram_standard_gadget
Definition: tinyram_protoboard.hpp:45
libsnark::ALU_arithmetic_gadget::arg1val
const word_variable_gadget< FieldT > arg1val
Definition: alu_arithmetic.hpp:31
libsnark::word_variable_gadget
Definition: word_variable_gadget.hpp:24
libsnark::ALU_mov_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_divmod_gadget::udiv_result
const pb_variable< FieldT > udiv_result
Definition: alu_arithmetic.hpp:804
libsnark::ALU_smul_gadget::smulh_result
const pb_variable< FieldT > smulh_result
Definition: alu_arithmetic.hpp:717
libsnark::test_ALU_xor_gadget
void test_ALU_xor_gadget(const size_t w)
libsnark::test_ALU_umod_gadget
void test_ALU_umod_gadget(const size_t w)
libsnark::ALU_smul_gadget
Definition: alu_arithmetic.hpp:701
libsnark::ALU_shr_shl_gadget::shl_result
pb_variable< FieldT > shl_result
Definition: alu_arithmetic.hpp:878
alu_arithmetic.tcc
libsnark::ALU_cmp_gadget::cmpe_result
const pb_variable< FieldT > cmpe_result
Definition: alu_arithmetic.hpp:467
libsnark::ALU_add_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::ALU_cmp_gadget::cmpae_result_flag
const pb_variable< FieldT > cmpae_result_flag
Definition: alu_arithmetic.hpp:472
libsnark::ALU_arithmetic_gadget::flag
const pb_variable< FieldT > flag
Definition: alu_arithmetic.hpp:33
libsnark::disjunction_gadget
Output is 0 iff the sum of inputs is 0. Output is 1 otherwise.
Definition: basic_gadgets.hpp:198
libsnark::ALU_arithmetic_gadget::result_flag
const pb_variable< FieldT > result_flag
Definition: alu_arithmetic.hpp:35
libsnark::ALU_shr_shl_gadget::shl_flag
pb_variable< FieldT > shl_flag
Definition: alu_arithmetic.hpp:879
libsnark::test_ALU_cmpa_gadget
void test_ALU_cmpa_gadget(const size_t w)
libsnark::ALU_divmod_gadget::ALU_divmod_gadget
ALU_divmod_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &udiv_result, const pb_variable< FieldT > &udiv_flag, const pb_variable< FieldT > &umod_result, const pb_variable< FieldT > &umod_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:809
libsnark::ALU_sub_gadget::ALU_sub_gadget
ALU_sub_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:345
libsnark::ALU_add_gadget
Definition: alu_arithmetic.hpp:277
libsnark::ALU_sub_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
ONE
#define ONE
Definition: pb_variable.hpp:98
libsnark::ALU_shr_shl_gadget::logw
size_t logw
Definition: alu_arithmetic.hpp:881
libsnark::ALU_sub_gadget
Definition: alu_arithmetic.hpp:334
libsnark::ALU_umul_gadget
Definition: alu_arithmetic.hpp:619
libsnark::ALU_and_gadget::ALU_and_gadget
ALU_and_gadget(tinyram_protoboard< FieldT > &pb, const pb_variable_array< FieldT > &opcode_indicators, const word_variable_gadget< FieldT > &desval, const word_variable_gadget< FieldT > &arg1val, const word_variable_gadget< FieldT > &arg2val, const pb_variable< FieldT > &flag, const pb_variable< FieldT > &result, const pb_variable< FieldT > &result_flag, const std::string &annotation_prefix="")
Definition: alu_arithmetic.hpp:69
libsnark::ALU_or_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::ALU_cmp_gadget::cmpe_result_flag
const pb_variable< FieldT > cmpe_result_flag
Definition: alu_arithmetic.hpp:468
libsnark::ALU_cmps_gadget::cmpge_result_flag
const pb_variable< FieldT > cmpge_result_flag
Definition: alu_arithmetic.hpp:543
libsnark::ALU_and_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()