Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "serde.hpp"
5
6namespace Acir {
7struct Helpers {
8 static std::map<std::string, msgpack::object const*> make_kvmap(msgpack::object const& o, std::string const& name)
9 {
10 if (o.type != msgpack::type::MAP) {
11 std::cerr << o << std::endl;
12 throw_or_abort("expected MAP for " + name);
13 }
15 for (uint32_t i = 0; i < o.via.map.size; ++i) {
16 if (o.via.map.ptr[i].key.type != msgpack::type::STR) {
17 std::cerr << o << std::endl;
18 throw_or_abort("expected STR for keys of " + name);
19 }
20 kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size),
21 &o.via.map.ptr[i].val);
22 }
23 return kvmap;
24 }
25
26 template <typename T>
28 std::string const& struct_name,
29 std::string const& field_name,
30 T& field,
31 bool is_optional)
32 {
33 auto it = kvmap.find(field_name);
34 if (it != kvmap.end()) {
35 try {
36 it->second->convert(field);
37 } catch (const msgpack::type_error&) {
38 std::cerr << *it->second << std::endl;
39 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
40 }
41 } else if (!is_optional) {
42 throw_or_abort("missing field: " + struct_name + "::" + field_name);
43 }
44 }
45
46 template <typename T>
47 static void conv_fld_from_array(msgpack::object_array const& array,
48 std::string const& struct_name,
49 std::string const& field_name,
50 T& field,
51 uint32_t index)
52 {
53 if (index >= array.size) {
54 throw_or_abort("index out of bounds: " + struct_name + "::" + field_name + " at " + std::to_string(index));
55 }
56 auto element = array.ptr[index];
57 try {
58 element.convert(field);
59 } catch (const msgpack::type_error&) {
60 std::cerr << element << std::endl;
61 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
62 }
63 }
64};
65} // namespace Acir
66
67namespace Acir {
68
70
71 struct Add {
72 friend bool operator==(const Add&, const Add&);
73
74 void msgpack_pack(auto& packer) const {}
75 void msgpack_unpack(msgpack::object const& o) {}
76 };
77
78 struct Sub {
79 friend bool operator==(const Sub&, const Sub&);
80
81 void msgpack_pack(auto& packer) const {}
82 void msgpack_unpack(msgpack::object const& o) {}
83 };
84
85 struct Mul {
86 friend bool operator==(const Mul&, const Mul&);
87
88 void msgpack_pack(auto& packer) const {}
89 void msgpack_unpack(msgpack::object const& o) {}
90 };
91
92 struct Div {
93 friend bool operator==(const Div&, const Div&);
94
95 void msgpack_pack(auto& packer) const {}
96 void msgpack_unpack(msgpack::object const& o) {}
97 };
98
99 struct IntegerDiv {
100 friend bool operator==(const IntegerDiv&, const IntegerDiv&);
101
102 void msgpack_pack(auto& packer) const {}
103 void msgpack_unpack(msgpack::object const& o) {}
104 };
105
106 struct Equals {
107 friend bool operator==(const Equals&, const Equals&);
108
109 void msgpack_pack(auto& packer) const {}
110 void msgpack_unpack(msgpack::object const& o) {}
111 };
112
113 struct LessThan {
114 friend bool operator==(const LessThan&, const LessThan&);
115
116 void msgpack_pack(auto& packer) const {}
117 void msgpack_unpack(msgpack::object const& o) {}
118 };
119
121 friend bool operator==(const LessThanEquals&, const LessThanEquals&);
122
123 void msgpack_pack(auto& packer) const {}
124 void msgpack_unpack(msgpack::object const& o) {}
125 };
126
128
129 friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&);
130
131 void msgpack_pack(auto& packer) const
132 {
133 std::string tag;
134 bool is_unit;
135 switch (value.index()) {
136
137 case 0:
138 tag = "Add";
139 is_unit = true;
140 break;
141 case 1:
142 tag = "Sub";
143 is_unit = true;
144 break;
145 case 2:
146 tag = "Mul";
147 is_unit = true;
148 break;
149 case 3:
150 tag = "Div";
151 is_unit = true;
152 break;
153 case 4:
154 tag = "IntegerDiv";
155 is_unit = true;
156 break;
157 case 5:
158 tag = "Equals";
159 is_unit = true;
160 break;
161 case 6:
162 tag = "LessThan";
163 is_unit = true;
164 break;
165 case 7:
166 tag = "LessThanEquals";
167 is_unit = true;
168 break;
169 default:
170 throw_or_abort("unknown enum 'BinaryFieldOp' variant index: " + std::to_string(value.index()));
171 }
172 if (is_unit) {
173 packer.pack(tag);
174 } else {
175 std::visit(
176 [&packer, tag](const auto& arg) {
177 packer.pack_map(1);
178 packer.pack(tag);
179 packer.pack(arg);
180 },
181 value);
182 }
183 }
184
185 void msgpack_unpack(msgpack::object const& o)
186 {
187
188 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
189 std::cerr << o << std::endl;
190 throw_or_abort("expected MAP or STR for enum 'BinaryFieldOp'; got type " + std::to_string(o.type));
191 }
192 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
193 throw_or_abort("expected 1 entry for enum 'BinaryFieldOp'; got " + std::to_string(o.via.map.size));
194 }
195 std::string tag;
196 try {
197 if (o.type == msgpack::type::object_type::MAP) {
198 o.via.map.ptr[0].key.convert(tag);
199 } else {
200 o.convert(tag);
201 }
202 } catch (const msgpack::type_error&) {
203 std::cerr << o << std::endl;
204 throw_or_abort("error converting tag to string for enum 'BinaryFieldOp'");
205 }
206 if (tag == "Add") {
207 Add v;
208 value = v;
209 } else if (tag == "Sub") {
210 Sub v;
211 value = v;
212 } else if (tag == "Mul") {
213 Mul v;
214 value = v;
215 } else if (tag == "Div") {
216 Div v;
217 value = v;
218 } else if (tag == "IntegerDiv") {
219 IntegerDiv v;
220 value = v;
221 } else if (tag == "Equals") {
222 Equals v;
223 value = v;
224 } else if (tag == "LessThan") {
225 LessThan v;
226 value = v;
227 } else if (tag == "LessThanEquals") {
229 value = v;
230 } else {
231 std::cerr << o << std::endl;
232 throw_or_abort("unknown 'BinaryFieldOp' enum variant: " + tag);
233 }
234 }
235};
236
238
239 struct Add {
240 friend bool operator==(const Add&, const Add&);
241
242 void msgpack_pack(auto& packer) const {}
243 void msgpack_unpack(msgpack::object const& o) {}
244 };
245
246 struct Sub {
247 friend bool operator==(const Sub&, const Sub&);
248
249 void msgpack_pack(auto& packer) const {}
250 void msgpack_unpack(msgpack::object const& o) {}
251 };
252
253 struct Mul {
254 friend bool operator==(const Mul&, const Mul&);
255
256 void msgpack_pack(auto& packer) const {}
257 void msgpack_unpack(msgpack::object const& o) {}
258 };
259
260 struct Div {
261 friend bool operator==(const Div&, const Div&);
262
263 void msgpack_pack(auto& packer) const {}
264 void msgpack_unpack(msgpack::object const& o) {}
265 };
266
267 struct Equals {
268 friend bool operator==(const Equals&, const Equals&);
269
270 void msgpack_pack(auto& packer) const {}
271 void msgpack_unpack(msgpack::object const& o) {}
272 };
273
274 struct LessThan {
275 friend bool operator==(const LessThan&, const LessThan&);
276
277 void msgpack_pack(auto& packer) const {}
278 void msgpack_unpack(msgpack::object const& o) {}
279 };
280
282 friend bool operator==(const LessThanEquals&, const LessThanEquals&);
283
284 void msgpack_pack(auto& packer) const {}
285 void msgpack_unpack(msgpack::object const& o) {}
286 };
287
288 struct And {
289 friend bool operator==(const And&, const And&);
290
291 void msgpack_pack(auto& packer) const {}
292 void msgpack_unpack(msgpack::object const& o) {}
293 };
294
295 struct Or {
296 friend bool operator==(const Or&, const Or&);
297
298 void msgpack_pack(auto& packer) const {}
299 void msgpack_unpack(msgpack::object const& o) {}
300 };
301
302 struct Xor {
303 friend bool operator==(const Xor&, const Xor&);
304
305 void msgpack_pack(auto& packer) const {}
306 void msgpack_unpack(msgpack::object const& o) {}
307 };
308
309 struct Shl {
310 friend bool operator==(const Shl&, const Shl&);
311
312 void msgpack_pack(auto& packer) const {}
313 void msgpack_unpack(msgpack::object const& o) {}
314 };
315
316 struct Shr {
317 friend bool operator==(const Shr&, const Shr&);
318
319 void msgpack_pack(auto& packer) const {}
320 void msgpack_unpack(msgpack::object const& o) {}
321 };
322
324
325 friend bool operator==(const BinaryIntOp&, const BinaryIntOp&);
326
327 void msgpack_pack(auto& packer) const
328 {
329 std::string tag;
330 bool is_unit;
331 switch (value.index()) {
332
333 case 0:
334 tag = "Add";
335 is_unit = true;
336 break;
337 case 1:
338 tag = "Sub";
339 is_unit = true;
340 break;
341 case 2:
342 tag = "Mul";
343 is_unit = true;
344 break;
345 case 3:
346 tag = "Div";
347 is_unit = true;
348 break;
349 case 4:
350 tag = "Equals";
351 is_unit = true;
352 break;
353 case 5:
354 tag = "LessThan";
355 is_unit = true;
356 break;
357 case 6:
358 tag = "LessThanEquals";
359 is_unit = true;
360 break;
361 case 7:
362 tag = "And";
363 is_unit = true;
364 break;
365 case 8:
366 tag = "Or";
367 is_unit = true;
368 break;
369 case 9:
370 tag = "Xor";
371 is_unit = true;
372 break;
373 case 10:
374 tag = "Shl";
375 is_unit = true;
376 break;
377 case 11:
378 tag = "Shr";
379 is_unit = true;
380 break;
381 default:
382 throw_or_abort("unknown enum 'BinaryIntOp' variant index: " + std::to_string(value.index()));
383 }
384 if (is_unit) {
385 packer.pack(tag);
386 } else {
387 std::visit(
388 [&packer, tag](const auto& arg) {
389 packer.pack_map(1);
390 packer.pack(tag);
391 packer.pack(arg);
392 },
393 value);
394 }
395 }
396
397 void msgpack_unpack(msgpack::object const& o)
398 {
399
400 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
401 std::cerr << o << std::endl;
402 throw_or_abort("expected MAP or STR for enum 'BinaryIntOp'; got type " + std::to_string(o.type));
403 }
404 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
405 throw_or_abort("expected 1 entry for enum 'BinaryIntOp'; got " + std::to_string(o.via.map.size));
406 }
407 std::string tag;
408 try {
409 if (o.type == msgpack::type::object_type::MAP) {
410 o.via.map.ptr[0].key.convert(tag);
411 } else {
412 o.convert(tag);
413 }
414 } catch (const msgpack::type_error&) {
415 std::cerr << o << std::endl;
416 throw_or_abort("error converting tag to string for enum 'BinaryIntOp'");
417 }
418 if (tag == "Add") {
419 Add v;
420 value = v;
421 } else if (tag == "Sub") {
422 Sub v;
423 value = v;
424 } else if (tag == "Mul") {
425 Mul v;
426 value = v;
427 } else if (tag == "Div") {
428 Div v;
429 value = v;
430 } else if (tag == "Equals") {
431 Equals v;
432 value = v;
433 } else if (tag == "LessThan") {
434 LessThan v;
435 value = v;
436 } else if (tag == "LessThanEquals") {
438 value = v;
439 } else if (tag == "And") {
440 And v;
441 value = v;
442 } else if (tag == "Or") {
443 Or v;
444 value = v;
445 } else if (tag == "Xor") {
446 Xor v;
447 value = v;
448 } else if (tag == "Shl") {
449 Shl v;
450 value = v;
451 } else if (tag == "Shr") {
452 Shr v;
453 value = v;
454 } else {
455 std::cerr << o << std::endl;
456 throw_or_abort("unknown 'BinaryIntOp' enum variant: " + tag);
457 }
458 }
459};
460
462
463 struct U1 {
464 friend bool operator==(const U1&, const U1&);
465
466 void msgpack_pack(auto& packer) const {}
467 void msgpack_unpack(msgpack::object const& o) {}
468 };
469
470 struct U8 {
471 friend bool operator==(const U8&, const U8&);
472
473 void msgpack_pack(auto& packer) const {}
474 void msgpack_unpack(msgpack::object const& o) {}
475 };
476
477 struct U16 {
478 friend bool operator==(const U16&, const U16&);
479
480 void msgpack_pack(auto& packer) const {}
481 void msgpack_unpack(msgpack::object const& o) {}
482 };
483
484 struct U32 {
485 friend bool operator==(const U32&, const U32&);
486
487 void msgpack_pack(auto& packer) const {}
488 void msgpack_unpack(msgpack::object const& o) {}
489 };
490
491 struct U64 {
492 friend bool operator==(const U64&, const U64&);
493
494 void msgpack_pack(auto& packer) const {}
495 void msgpack_unpack(msgpack::object const& o) {}
496 };
497
498 struct U128 {
499 friend bool operator==(const U128&, const U128&);
500
501 void msgpack_pack(auto& packer) const {}
502 void msgpack_unpack(msgpack::object const& o) {}
503 };
504
506
507 friend bool operator==(const IntegerBitSize&, const IntegerBitSize&);
508
509 void msgpack_pack(auto& packer) const
510 {
511 std::string tag;
512 bool is_unit;
513 switch (value.index()) {
514
515 case 0:
516 tag = "U1";
517 is_unit = true;
518 break;
519 case 1:
520 tag = "U8";
521 is_unit = true;
522 break;
523 case 2:
524 tag = "U16";
525 is_unit = true;
526 break;
527 case 3:
528 tag = "U32";
529 is_unit = true;
530 break;
531 case 4:
532 tag = "U64";
533 is_unit = true;
534 break;
535 case 5:
536 tag = "U128";
537 is_unit = true;
538 break;
539 default:
540 throw_or_abort("unknown enum 'IntegerBitSize' variant index: " + std::to_string(value.index()));
541 }
542 if (is_unit) {
543 packer.pack(tag);
544 } else {
545 std::visit(
546 [&packer, tag](const auto& arg) {
547 packer.pack_map(1);
548 packer.pack(tag);
549 packer.pack(arg);
550 },
551 value);
552 }
553 }
554
555 void msgpack_unpack(msgpack::object const& o)
556 {
557
558 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
559 std::cerr << o << std::endl;
560 throw_or_abort("expected MAP or STR for enum 'IntegerBitSize'; got type " + std::to_string(o.type));
561 }
562 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
563 throw_or_abort("expected 1 entry for enum 'IntegerBitSize'; got " + std::to_string(o.via.map.size));
564 }
565 std::string tag;
566 try {
567 if (o.type == msgpack::type::object_type::MAP) {
568 o.via.map.ptr[0].key.convert(tag);
569 } else {
570 o.convert(tag);
571 }
572 } catch (const msgpack::type_error&) {
573 std::cerr << o << std::endl;
574 throw_or_abort("error converting tag to string for enum 'IntegerBitSize'");
575 }
576 if (tag == "U1") {
577 U1 v;
578 value = v;
579 } else if (tag == "U8") {
580 U8 v;
581 value = v;
582 } else if (tag == "U16") {
583 U16 v;
584 value = v;
585 } else if (tag == "U32") {
586 U32 v;
587 value = v;
588 } else if (tag == "U64") {
589 U64 v;
590 value = v;
591 } else if (tag == "U128") {
592 U128 v;
593 value = v;
594 } else {
595 std::cerr << o << std::endl;
596 throw_or_abort("unknown 'IntegerBitSize' enum variant: " + tag);
597 }
598 }
599};
600
601struct BitSize {
602
603 struct Field {
604 friend bool operator==(const Field&, const Field&);
605
606 void msgpack_pack(auto& packer) const {}
607 void msgpack_unpack(msgpack::object const& o) {}
608 };
609
610 struct Integer {
612
613 friend bool operator==(const Integer&, const Integer&);
614
615 void msgpack_pack(auto& packer) const { packer.pack(value); }
616
617 void msgpack_unpack(msgpack::object const& o)
618 {
619 try {
620 o.convert(value);
621 } catch (const msgpack::type_error&) {
622 std::cerr << o << std::endl;
623 throw_or_abort("error converting into newtype 'Integer'");
624 }
625 }
626 };
627
629
630 friend bool operator==(const BitSize&, const BitSize&);
631
632 void msgpack_pack(auto& packer) const
633 {
634 std::string tag;
635 bool is_unit;
636 switch (value.index()) {
637
638 case 0:
639 tag = "Field";
640 is_unit = true;
641 break;
642 case 1:
643 tag = "Integer";
644 is_unit = false;
645 break;
646 default:
647 throw_or_abort("unknown enum 'BitSize' variant index: " + std::to_string(value.index()));
648 }
649 if (is_unit) {
650 packer.pack(tag);
651 } else {
652 std::visit(
653 [&packer, tag](const auto& arg) {
654 packer.pack_map(1);
655 packer.pack(tag);
656 packer.pack(arg);
657 },
658 value);
659 }
660 }
661
662 void msgpack_unpack(msgpack::object const& o)
663 {
664
665 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
666 std::cerr << o << std::endl;
667 throw_or_abort("expected MAP or STR for enum 'BitSize'; got type " + std::to_string(o.type));
668 }
669 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
670 throw_or_abort("expected 1 entry for enum 'BitSize'; got " + std::to_string(o.via.map.size));
671 }
672 std::string tag;
673 try {
674 if (o.type == msgpack::type::object_type::MAP) {
675 o.via.map.ptr[0].key.convert(tag);
676 } else {
677 o.convert(tag);
678 }
679 } catch (const msgpack::type_error&) {
680 std::cerr << o << std::endl;
681 throw_or_abort("error converting tag to string for enum 'BitSize'");
682 }
683 if (tag == "Field") {
684 Field v;
685 value = v;
686 } else if (tag == "Integer") {
687 Integer v;
688 try {
689 o.via.map.ptr[0].val.convert(v);
690 } catch (const msgpack::type_error&) {
691 std::cerr << o << std::endl;
692 throw_or_abort("error converting into enum variant 'BitSize::Integer'");
693 }
694
695 value = v;
696 } else {
697 std::cerr << o << std::endl;
698 throw_or_abort("unknown 'BitSize' enum variant: " + tag);
699 }
700 }
701};
702
704
705 struct Direct {
706 uint32_t value;
707
708 friend bool operator==(const Direct&, const Direct&);
709
710 void msgpack_pack(auto& packer) const { packer.pack(value); }
711
712 void msgpack_unpack(msgpack::object const& o)
713 {
714 try {
715 o.convert(value);
716 } catch (const msgpack::type_error&) {
717 std::cerr << o << std::endl;
718 throw_or_abort("error converting into newtype 'Direct'");
719 }
720 }
721 };
722
723 struct Relative {
724 uint32_t value;
725
726 friend bool operator==(const Relative&, const Relative&);
727
728 void msgpack_pack(auto& packer) const { packer.pack(value); }
729
730 void msgpack_unpack(msgpack::object const& o)
731 {
732 try {
733 o.convert(value);
734 } catch (const msgpack::type_error&) {
735 std::cerr << o << std::endl;
736 throw_or_abort("error converting into newtype 'Relative'");
737 }
738 }
739 };
740
742
743 friend bool operator==(const MemoryAddress&, const MemoryAddress&);
744
745 void msgpack_pack(auto& packer) const
746 {
747 std::string tag;
748 bool is_unit;
749 switch (value.index()) {
750
751 case 0:
752 tag = "Direct";
753 is_unit = false;
754 break;
755 case 1:
756 tag = "Relative";
757 is_unit = false;
758 break;
759 default:
760 throw_or_abort("unknown enum 'MemoryAddress' variant index: " + std::to_string(value.index()));
761 }
762 if (is_unit) {
763 packer.pack(tag);
764 } else {
765 std::visit(
766 [&packer, tag](const auto& arg) {
767 packer.pack_map(1);
768 packer.pack(tag);
769 packer.pack(arg);
770 },
771 value);
772 }
773 }
774
775 void msgpack_unpack(msgpack::object const& o)
776 {
777
778 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
779 std::cerr << o << std::endl;
780 throw_or_abort("expected MAP or STR for enum 'MemoryAddress'; got type " + std::to_string(o.type));
781 }
782 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
783 throw_or_abort("expected 1 entry for enum 'MemoryAddress'; got " + std::to_string(o.via.map.size));
784 }
785 std::string tag;
786 try {
787 if (o.type == msgpack::type::object_type::MAP) {
788 o.via.map.ptr[0].key.convert(tag);
789 } else {
790 o.convert(tag);
791 }
792 } catch (const msgpack::type_error&) {
793 std::cerr << o << std::endl;
794 throw_or_abort("error converting tag to string for enum 'MemoryAddress'");
795 }
796 if (tag == "Direct") {
797 Direct v;
798 try {
799 o.via.map.ptr[0].val.convert(v);
800 } catch (const msgpack::type_error&) {
801 std::cerr << o << std::endl;
802 throw_or_abort("error converting into enum variant 'MemoryAddress::Direct'");
803 }
804
805 value = v;
806 } else if (tag == "Relative") {
807 Relative v;
808 try {
809 o.via.map.ptr[0].val.convert(v);
810 } catch (const msgpack::type_error&) {
811 std::cerr << o << std::endl;
812 throw_or_abort("error converting into enum variant 'MemoryAddress::Relative'");
813 }
814
815 value = v;
816 } else {
817 std::cerr << o << std::endl;
818 throw_or_abort("unknown 'MemoryAddress' enum variant: " + tag);
819 }
820 }
821};
822
824 uint32_t value;
825
826 friend bool operator==(const SemiFlattenedLength&, const SemiFlattenedLength&);
827
828 void msgpack_pack(auto& packer) const { packer.pack(value); }
829
830 void msgpack_unpack(msgpack::object const& o)
831 {
832 try {
833 o.convert(value);
834 } catch (const msgpack::type_error&) {
835 std::cerr << o << std::endl;
836 throw_or_abort("error converting into newtype 'SemiFlattenedLength'");
837 }
838 }
839};
840
841struct HeapArray {
844
845 friend bool operator==(const HeapArray&, const HeapArray&);
846
847 void msgpack_pack(auto& packer) const
848 {
849 packer.pack_array(2);
850 packer.pack(pointer);
851 packer.pack(size);
852 }
853
854 void msgpack_unpack(msgpack::object const& o)
855 {
856 std::string name = "HeapArray";
857 if (o.type == msgpack::type::MAP) {
858 auto kvmap = Helpers::make_kvmap(o, name);
859 Helpers::conv_fld_from_kvmap(kvmap, name, "pointer", pointer, false);
860 Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false);
861 } else if (o.type == msgpack::type::ARRAY) {
862 auto array = o.via.array;
863 Helpers::conv_fld_from_array(array, name, "pointer", pointer, 0);
864 Helpers::conv_fld_from_array(array, name, "size", size, 1);
865 } else {
866 throw_or_abort("expected MAP or ARRAY for " + name);
867 }
868 }
869};
870
872
878
879 friend bool operator==(const AES128Encrypt&, const AES128Encrypt&);
880
881 void msgpack_pack(auto& packer) const
882 {
883 packer.pack_array(4);
884 packer.pack(inputs);
885 packer.pack(iv);
886 packer.pack(key);
887 packer.pack(outputs);
888 }
889
890 void msgpack_unpack(msgpack::object const& o)
891 {
892 std::string name = "AES128Encrypt";
893 if (o.type == msgpack::type::MAP) {
894 auto kvmap = Helpers::make_kvmap(o, name);
895 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
896 Helpers::conv_fld_from_kvmap(kvmap, name, "iv", iv, false);
897 Helpers::conv_fld_from_kvmap(kvmap, name, "key", key, false);
898 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
899 } else if (o.type == msgpack::type::ARRAY) {
900 auto array = o.via.array;
901 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
902 Helpers::conv_fld_from_array(array, name, "iv", iv, 1);
903 Helpers::conv_fld_from_array(array, name, "key", key, 2);
904 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
905 } else {
906 throw_or_abort("expected MAP or ARRAY for " + name);
907 }
908 }
909 };
910
911 struct Blake2s {
914
915 friend bool operator==(const Blake2s&, const Blake2s&);
916
917 void msgpack_pack(auto& packer) const
918 {
919 packer.pack_array(2);
920 packer.pack(message);
921 packer.pack(output);
922 }
923
924 void msgpack_unpack(msgpack::object const& o)
925 {
926 std::string name = "Blake2s";
927 if (o.type == msgpack::type::MAP) {
928 auto kvmap = Helpers::make_kvmap(o, name);
929 Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false);
930 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
931 } else if (o.type == msgpack::type::ARRAY) {
932 auto array = o.via.array;
933 Helpers::conv_fld_from_array(array, name, "message", message, 0);
934 Helpers::conv_fld_from_array(array, name, "output", output, 1);
935 } else {
936 throw_or_abort("expected MAP or ARRAY for " + name);
937 }
938 }
939 };
940
941 struct Blake3 {
944
945 friend bool operator==(const Blake3&, const Blake3&);
946
947 void msgpack_pack(auto& packer) const
948 {
949 packer.pack_array(2);
950 packer.pack(message);
951 packer.pack(output);
952 }
953
954 void msgpack_unpack(msgpack::object const& o)
955 {
956 std::string name = "Blake3";
957 if (o.type == msgpack::type::MAP) {
958 auto kvmap = Helpers::make_kvmap(o, name);
959 Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false);
960 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
961 } else if (o.type == msgpack::type::ARRAY) {
962 auto array = o.via.array;
963 Helpers::conv_fld_from_array(array, name, "message", message, 0);
964 Helpers::conv_fld_from_array(array, name, "output", output, 1);
965 } else {
966 throw_or_abort("expected MAP or ARRAY for " + name);
967 }
968 }
969 };
970
971 struct Keccakf1600 {
974
975 friend bool operator==(const Keccakf1600&, const Keccakf1600&);
976
977 void msgpack_pack(auto& packer) const
978 {
979 packer.pack_array(2);
980 packer.pack(input);
981 packer.pack(output);
982 }
983
984 void msgpack_unpack(msgpack::object const& o)
985 {
986 std::string name = "Keccakf1600";
987 if (o.type == msgpack::type::MAP) {
988 auto kvmap = Helpers::make_kvmap(o, name);
989 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
990 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
991 } else if (o.type == msgpack::type::ARRAY) {
992 auto array = o.via.array;
993 Helpers::conv_fld_from_array(array, name, "input", input, 0);
994 Helpers::conv_fld_from_array(array, name, "output", output, 1);
995 } else {
996 throw_or_abort("expected MAP or ARRAY for " + name);
997 }
998 }
999 };
1000
1007
1008 friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&);
1009
1010 void msgpack_pack(auto& packer) const
1011 {
1012 packer.pack_array(5);
1013 packer.pack(hashed_msg);
1014 packer.pack(public_key_x);
1015 packer.pack(public_key_y);
1016 packer.pack(signature);
1017 packer.pack(result);
1018 }
1019
1020 void msgpack_unpack(msgpack::object const& o)
1021 {
1022 std::string name = "EcdsaSecp256k1";
1023 if (o.type == msgpack::type::MAP) {
1024 auto kvmap = Helpers::make_kvmap(o, name);
1025 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_msg", hashed_msg, false);
1026 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
1027 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
1028 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
1029 Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false);
1030 } else if (o.type == msgpack::type::ARRAY) {
1031 auto array = o.via.array;
1032 Helpers::conv_fld_from_array(array, name, "hashed_msg", hashed_msg, 0);
1033 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 1);
1034 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 2);
1035 Helpers::conv_fld_from_array(array, name, "signature", signature, 3);
1036 Helpers::conv_fld_from_array(array, name, "result", result, 4);
1037 } else {
1038 throw_or_abort("expected MAP or ARRAY for " + name);
1039 }
1040 }
1041 };
1042
1049
1050 friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&);
1051
1052 void msgpack_pack(auto& packer) const
1053 {
1054 packer.pack_array(5);
1055 packer.pack(hashed_msg);
1056 packer.pack(public_key_x);
1057 packer.pack(public_key_y);
1058 packer.pack(signature);
1059 packer.pack(result);
1060 }
1061
1062 void msgpack_unpack(msgpack::object const& o)
1063 {
1064 std::string name = "EcdsaSecp256r1";
1065 if (o.type == msgpack::type::MAP) {
1066 auto kvmap = Helpers::make_kvmap(o, name);
1067 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_msg", hashed_msg, false);
1068 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
1069 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
1070 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
1071 Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false);
1072 } else if (o.type == msgpack::type::ARRAY) {
1073 auto array = o.via.array;
1074 Helpers::conv_fld_from_array(array, name, "hashed_msg", hashed_msg, 0);
1075 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 1);
1076 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 2);
1077 Helpers::conv_fld_from_array(array, name, "signature", signature, 3);
1078 Helpers::conv_fld_from_array(array, name, "result", result, 4);
1079 } else {
1080 throw_or_abort("expected MAP or ARRAY for " + name);
1081 }
1082 }
1083 };
1084
1089
1090 friend bool operator==(const MultiScalarMul&, const MultiScalarMul&);
1091
1092 void msgpack_pack(auto& packer) const
1093 {
1094 packer.pack_array(3);
1095 packer.pack(points);
1096 packer.pack(scalars);
1097 packer.pack(outputs);
1098 }
1099
1100 void msgpack_unpack(msgpack::object const& o)
1101 {
1102 std::string name = "MultiScalarMul";
1103 if (o.type == msgpack::type::MAP) {
1104 auto kvmap = Helpers::make_kvmap(o, name);
1105 Helpers::conv_fld_from_kvmap(kvmap, name, "points", points, false);
1106 Helpers::conv_fld_from_kvmap(kvmap, name, "scalars", scalars, false);
1107 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
1108 } else if (o.type == msgpack::type::ARRAY) {
1109 auto array = o.via.array;
1110 Helpers::conv_fld_from_array(array, name, "points", points, 0);
1111 Helpers::conv_fld_from_array(array, name, "scalars", scalars, 1);
1112 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
1113 } else {
1114 throw_or_abort("expected MAP or ARRAY for " + name);
1115 }
1116 }
1117 };
1118
1127
1128 friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&);
1129
1130 void msgpack_pack(auto& packer) const
1131 {
1132 packer.pack_array(7);
1133 packer.pack(input1_x);
1134 packer.pack(input1_y);
1135 packer.pack(input1_infinite);
1136 packer.pack(input2_x);
1137 packer.pack(input2_y);
1138 packer.pack(input2_infinite);
1139 packer.pack(result);
1140 }
1141
1142 void msgpack_unpack(msgpack::object const& o)
1143 {
1144 std::string name = "EmbeddedCurveAdd";
1145 if (o.type == msgpack::type::MAP) {
1146 auto kvmap = Helpers::make_kvmap(o, name);
1147 Helpers::conv_fld_from_kvmap(kvmap, name, "input1_x", input1_x, false);
1148 Helpers::conv_fld_from_kvmap(kvmap, name, "input1_y", input1_y, false);
1149 Helpers::conv_fld_from_kvmap(kvmap, name, "input1_infinite", input1_infinite, false);
1150 Helpers::conv_fld_from_kvmap(kvmap, name, "input2_x", input2_x, false);
1151 Helpers::conv_fld_from_kvmap(kvmap, name, "input2_y", input2_y, false);
1152 Helpers::conv_fld_from_kvmap(kvmap, name, "input2_infinite", input2_infinite, false);
1153 Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false);
1154 } else if (o.type == msgpack::type::ARRAY) {
1155 auto array = o.via.array;
1156 Helpers::conv_fld_from_array(array, name, "input1_x", input1_x, 0);
1157 Helpers::conv_fld_from_array(array, name, "input1_y", input1_y, 1);
1158 Helpers::conv_fld_from_array(array, name, "input1_infinite", input1_infinite, 2);
1159 Helpers::conv_fld_from_array(array, name, "input2_x", input2_x, 3);
1160 Helpers::conv_fld_from_array(array, name, "input2_y", input2_y, 4);
1161 Helpers::conv_fld_from_array(array, name, "input2_infinite", input2_infinite, 5);
1162 Helpers::conv_fld_from_array(array, name, "result", result, 6);
1163 } else {
1164 throw_or_abort("expected MAP or ARRAY for " + name);
1165 }
1166 }
1167 };
1168
1172
1173 friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&);
1174
1175 void msgpack_pack(auto& packer) const
1176 {
1177 packer.pack_array(2);
1178 packer.pack(message);
1179 packer.pack(output);
1180 }
1181
1182 void msgpack_unpack(msgpack::object const& o)
1183 {
1184 std::string name = "Poseidon2Permutation";
1185 if (o.type == msgpack::type::MAP) {
1186 auto kvmap = Helpers::make_kvmap(o, name);
1187 Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false);
1188 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1189 } else if (o.type == msgpack::type::ARRAY) {
1190 auto array = o.via.array;
1191 Helpers::conv_fld_from_array(array, name, "message", message, 0);
1192 Helpers::conv_fld_from_array(array, name, "output", output, 1);
1193 } else {
1194 throw_or_abort("expected MAP or ARRAY for " + name);
1195 }
1196 }
1197 };
1198
1203
1204 friend bool operator==(const Sha256Compression&, const Sha256Compression&);
1205
1206 void msgpack_pack(auto& packer) const
1207 {
1208 packer.pack_array(3);
1209 packer.pack(input);
1210 packer.pack(hash_values);
1211 packer.pack(output);
1212 }
1213
1214 void msgpack_unpack(msgpack::object const& o)
1215 {
1216 std::string name = "Sha256Compression";
1217 if (o.type == msgpack::type::MAP) {
1218 auto kvmap = Helpers::make_kvmap(o, name);
1219 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
1220 Helpers::conv_fld_from_kvmap(kvmap, name, "hash_values", hash_values, false);
1221 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1222 } else if (o.type == msgpack::type::ARRAY) {
1223 auto array = o.via.array;
1224 Helpers::conv_fld_from_array(array, name, "input", input, 0);
1225 Helpers::conv_fld_from_array(array, name, "hash_values", hash_values, 1);
1226 Helpers::conv_fld_from_array(array, name, "output", output, 2);
1227 } else {
1228 throw_or_abort("expected MAP or ARRAY for " + name);
1229 }
1230 }
1231 };
1232
1233 struct ToRadix {
1239
1240 friend bool operator==(const ToRadix&, const ToRadix&);
1241
1242 void msgpack_pack(auto& packer) const
1243 {
1244 packer.pack_array(5);
1245 packer.pack(input);
1246 packer.pack(radix);
1247 packer.pack(output_pointer);
1248 packer.pack(num_limbs);
1249 packer.pack(output_bits);
1250 }
1251
1252 void msgpack_unpack(msgpack::object const& o)
1253 {
1254 std::string name = "ToRadix";
1255 if (o.type == msgpack::type::MAP) {
1256 auto kvmap = Helpers::make_kvmap(o, name);
1257 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
1258 Helpers::conv_fld_from_kvmap(kvmap, name, "radix", radix, false);
1259 Helpers::conv_fld_from_kvmap(kvmap, name, "output_pointer", output_pointer, false);
1260 Helpers::conv_fld_from_kvmap(kvmap, name, "num_limbs", num_limbs, false);
1261 Helpers::conv_fld_from_kvmap(kvmap, name, "output_bits", output_bits, false);
1262 } else if (o.type == msgpack::type::ARRAY) {
1263 auto array = o.via.array;
1264 Helpers::conv_fld_from_array(array, name, "input", input, 0);
1265 Helpers::conv_fld_from_array(array, name, "radix", radix, 1);
1266 Helpers::conv_fld_from_array(array, name, "output_pointer", output_pointer, 2);
1267 Helpers::conv_fld_from_array(array, name, "num_limbs", num_limbs, 3);
1268 Helpers::conv_fld_from_array(array, name, "output_bits", output_bits, 4);
1269 } else {
1270 throw_or_abort("expected MAP or ARRAY for " + name);
1271 }
1272 }
1273 };
1274
1275 std::variant<AES128Encrypt,
1276 Blake2s,
1277 Blake3,
1278 Keccakf1600,
1279 EcdsaSecp256k1,
1280 EcdsaSecp256r1,
1281 MultiScalarMul,
1282 EmbeddedCurveAdd,
1283 Poseidon2Permutation,
1284 Sha256Compression,
1285 ToRadix>
1287
1288 friend bool operator==(const BlackBoxOp&, const BlackBoxOp&);
1289
1290 void msgpack_pack(auto& packer) const
1291 {
1292 std::string tag;
1293 bool is_unit;
1294 switch (value.index()) {
1295
1296 case 0:
1297 tag = "AES128Encrypt";
1298 is_unit = false;
1299 break;
1300 case 1:
1301 tag = "Blake2s";
1302 is_unit = false;
1303 break;
1304 case 2:
1305 tag = "Blake3";
1306 is_unit = false;
1307 break;
1308 case 3:
1309 tag = "Keccakf1600";
1310 is_unit = false;
1311 break;
1312 case 4:
1313 tag = "EcdsaSecp256k1";
1314 is_unit = false;
1315 break;
1316 case 5:
1317 tag = "EcdsaSecp256r1";
1318 is_unit = false;
1319 break;
1320 case 6:
1321 tag = "MultiScalarMul";
1322 is_unit = false;
1323 break;
1324 case 7:
1325 tag = "EmbeddedCurveAdd";
1326 is_unit = false;
1327 break;
1328 case 8:
1329 tag = "Poseidon2Permutation";
1330 is_unit = false;
1331 break;
1332 case 9:
1333 tag = "Sha256Compression";
1334 is_unit = false;
1335 break;
1336 case 10:
1337 tag = "ToRadix";
1338 is_unit = false;
1339 break;
1340 default:
1341 throw_or_abort("unknown enum 'BlackBoxOp' variant index: " + std::to_string(value.index()));
1342 }
1343 if (is_unit) {
1344 packer.pack(tag);
1345 } else {
1346 std::visit(
1347 [&packer, tag](const auto& arg) {
1348 packer.pack_map(1);
1349 packer.pack(tag);
1350 packer.pack(arg);
1351 },
1352 value);
1353 }
1354 }
1355
1356 void msgpack_unpack(msgpack::object const& o)
1357 {
1358
1359 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
1360 std::cerr << o << std::endl;
1361 throw_or_abort("expected MAP or STR for enum 'BlackBoxOp'; got type " + std::to_string(o.type));
1362 }
1363 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
1364 throw_or_abort("expected 1 entry for enum 'BlackBoxOp'; got " + std::to_string(o.via.map.size));
1365 }
1366 std::string tag;
1367 try {
1368 if (o.type == msgpack::type::object_type::MAP) {
1369 o.via.map.ptr[0].key.convert(tag);
1370 } else {
1371 o.convert(tag);
1372 }
1373 } catch (const msgpack::type_error&) {
1374 std::cerr << o << std::endl;
1375 throw_or_abort("error converting tag to string for enum 'BlackBoxOp'");
1376 }
1377 if (tag == "AES128Encrypt") {
1378 AES128Encrypt v;
1379 try {
1380 o.via.map.ptr[0].val.convert(v);
1381 } catch (const msgpack::type_error&) {
1382 std::cerr << o << std::endl;
1383 throw_or_abort("error converting into enum variant 'BlackBoxOp::AES128Encrypt'");
1384 }
1385
1386 value = v;
1387 } else if (tag == "Blake2s") {
1388 Blake2s v;
1389 try {
1390 o.via.map.ptr[0].val.convert(v);
1391 } catch (const msgpack::type_error&) {
1392 std::cerr << o << std::endl;
1393 throw_or_abort("error converting into enum variant 'BlackBoxOp::Blake2s'");
1394 }
1395
1396 value = v;
1397 } else if (tag == "Blake3") {
1398 Blake3 v;
1399 try {
1400 o.via.map.ptr[0].val.convert(v);
1401 } catch (const msgpack::type_error&) {
1402 std::cerr << o << std::endl;
1403 throw_or_abort("error converting into enum variant 'BlackBoxOp::Blake3'");
1404 }
1405
1406 value = v;
1407 } else if (tag == "Keccakf1600") {
1408 Keccakf1600 v;
1409 try {
1410 o.via.map.ptr[0].val.convert(v);
1411 } catch (const msgpack::type_error&) {
1412 std::cerr << o << std::endl;
1413 throw_or_abort("error converting into enum variant 'BlackBoxOp::Keccakf1600'");
1414 }
1415
1416 value = v;
1417 } else if (tag == "EcdsaSecp256k1") {
1419 try {
1420 o.via.map.ptr[0].val.convert(v);
1421 } catch (const msgpack::type_error&) {
1422 std::cerr << o << std::endl;
1423 throw_or_abort("error converting into enum variant 'BlackBoxOp::EcdsaSecp256k1'");
1424 }
1425
1426 value = v;
1427 } else if (tag == "EcdsaSecp256r1") {
1429 try {
1430 o.via.map.ptr[0].val.convert(v);
1431 } catch (const msgpack::type_error&) {
1432 std::cerr << o << std::endl;
1433 throw_or_abort("error converting into enum variant 'BlackBoxOp::EcdsaSecp256r1'");
1434 }
1435
1436 value = v;
1437 } else if (tag == "MultiScalarMul") {
1439 try {
1440 o.via.map.ptr[0].val.convert(v);
1441 } catch (const msgpack::type_error&) {
1442 std::cerr << o << std::endl;
1443 throw_or_abort("error converting into enum variant 'BlackBoxOp::MultiScalarMul'");
1444 }
1445
1446 value = v;
1447 } else if (tag == "EmbeddedCurveAdd") {
1449 try {
1450 o.via.map.ptr[0].val.convert(v);
1451 } catch (const msgpack::type_error&) {
1452 std::cerr << o << std::endl;
1453 throw_or_abort("error converting into enum variant 'BlackBoxOp::EmbeddedCurveAdd'");
1454 }
1455
1456 value = v;
1457 } else if (tag == "Poseidon2Permutation") {
1459 try {
1460 o.via.map.ptr[0].val.convert(v);
1461 } catch (const msgpack::type_error&) {
1462 std::cerr << o << std::endl;
1463 throw_or_abort("error converting into enum variant 'BlackBoxOp::Poseidon2Permutation'");
1464 }
1465
1466 value = v;
1467 } else if (tag == "Sha256Compression") {
1469 try {
1470 o.via.map.ptr[0].val.convert(v);
1471 } catch (const msgpack::type_error&) {
1472 std::cerr << o << std::endl;
1473 throw_or_abort("error converting into enum variant 'BlackBoxOp::Sha256Compression'");
1474 }
1475
1476 value = v;
1477 } else if (tag == "ToRadix") {
1478 ToRadix v;
1479 try {
1480 o.via.map.ptr[0].val.convert(v);
1481 } catch (const msgpack::type_error&) {
1482 std::cerr << o << std::endl;
1483 throw_or_abort("error converting into enum variant 'BlackBoxOp::ToRadix'");
1484 }
1485
1486 value = v;
1487 } else {
1488 std::cerr << o << std::endl;
1489 throw_or_abort("unknown 'BlackBoxOp' enum variant: " + tag);
1490 }
1491 }
1492};
1493
1495 uint32_t value;
1496
1497 friend bool operator==(const SemanticLength&, const SemanticLength&);
1498
1499 void msgpack_pack(auto& packer) const { packer.pack(value); }
1500
1501 void msgpack_unpack(msgpack::object const& o)
1502 {
1503 try {
1504 o.convert(value);
1505 } catch (const msgpack::type_error&) {
1506 std::cerr << o << std::endl;
1507 throw_or_abort("error converting into newtype 'SemanticLength'");
1508 }
1509 }
1510};
1511
1512struct HeapValueType;
1513
1515
1516 struct Simple {
1518
1519 friend bool operator==(const Simple&, const Simple&);
1520
1521 void msgpack_pack(auto& packer) const { packer.pack(value); }
1522
1523 void msgpack_unpack(msgpack::object const& o)
1524 {
1525 try {
1526 o.convert(value);
1527 } catch (const msgpack::type_error&) {
1528 std::cerr << o << std::endl;
1529 throw_or_abort("error converting into newtype 'Simple'");
1530 }
1531 }
1532 };
1533
1534 struct Array {
1535 std::vector<Acir::HeapValueType> value_types;
1537
1538 friend bool operator==(const Array&, const Array&);
1539
1540 void msgpack_pack(auto& packer) const
1541 {
1542 packer.pack_array(2);
1543 packer.pack(value_types);
1544 packer.pack(size);
1545 }
1546
1547 void msgpack_unpack(msgpack::object const& o)
1548 {
1549 std::string name = "Array";
1550 if (o.type == msgpack::type::MAP) {
1551 auto kvmap = Helpers::make_kvmap(o, name);
1552 Helpers::conv_fld_from_kvmap(kvmap, name, "value_types", value_types, false);
1553 Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false);
1554 } else if (o.type == msgpack::type::ARRAY) {
1555 auto array = o.via.array;
1556 Helpers::conv_fld_from_array(array, name, "value_types", value_types, 0);
1557 Helpers::conv_fld_from_array(array, name, "size", size, 1);
1558 } else {
1559 throw_or_abort("expected MAP or ARRAY for " + name);
1560 }
1561 }
1562 };
1563
1564 struct Vector {
1565 std::vector<Acir::HeapValueType> value_types;
1566
1567 friend bool operator==(const Vector&, const Vector&);
1568
1569 void msgpack_pack(auto& packer) const
1570 {
1571 packer.pack_array(1);
1572 packer.pack(value_types);
1573 }
1574
1575 void msgpack_unpack(msgpack::object const& o)
1576 {
1577 std::string name = "Vector";
1578 if (o.type == msgpack::type::MAP) {
1579 auto kvmap = Helpers::make_kvmap(o, name);
1580 Helpers::conv_fld_from_kvmap(kvmap, name, "value_types", value_types, false);
1581 } else if (o.type == msgpack::type::ARRAY) {
1582 auto array = o.via.array;
1583 Helpers::conv_fld_from_array(array, name, "value_types", value_types, 0);
1584 } else {
1585 throw_or_abort("expected MAP or ARRAY for " + name);
1586 }
1587 }
1588 };
1589
1591
1592 friend bool operator==(const HeapValueType&, const HeapValueType&);
1593
1594 void msgpack_pack(auto& packer) const
1595 {
1596 std::string tag;
1597 bool is_unit;
1598 switch (value.index()) {
1599
1600 case 0:
1601 tag = "Simple";
1602 is_unit = false;
1603 break;
1604 case 1:
1605 tag = "Array";
1606 is_unit = false;
1607 break;
1608 case 2:
1609 tag = "Vector";
1610 is_unit = false;
1611 break;
1612 default:
1613 throw_or_abort("unknown enum 'HeapValueType' variant index: " + std::to_string(value.index()));
1614 }
1615 if (is_unit) {
1616 packer.pack(tag);
1617 } else {
1618 std::visit(
1619 [&packer, tag](const auto& arg) {
1620 packer.pack_map(1);
1621 packer.pack(tag);
1622 packer.pack(arg);
1623 },
1624 value);
1625 }
1626 }
1627
1628 void msgpack_unpack(msgpack::object const& o)
1629 {
1630
1631 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
1632 std::cerr << o << std::endl;
1633 throw_or_abort("expected MAP or STR for enum 'HeapValueType'; got type " + std::to_string(o.type));
1634 }
1635 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
1636 throw_or_abort("expected 1 entry for enum 'HeapValueType'; got " + std::to_string(o.via.map.size));
1637 }
1638 std::string tag;
1639 try {
1640 if (o.type == msgpack::type::object_type::MAP) {
1641 o.via.map.ptr[0].key.convert(tag);
1642 } else {
1643 o.convert(tag);
1644 }
1645 } catch (const msgpack::type_error&) {
1646 std::cerr << o << std::endl;
1647 throw_or_abort("error converting tag to string for enum 'HeapValueType'");
1648 }
1649 if (tag == "Simple") {
1650 Simple v;
1651 try {
1652 o.via.map.ptr[0].val.convert(v);
1653 } catch (const msgpack::type_error&) {
1654 std::cerr << o << std::endl;
1655 throw_or_abort("error converting into enum variant 'HeapValueType::Simple'");
1656 }
1657
1658 value = v;
1659 } else if (tag == "Array") {
1660 Array v;
1661 try {
1662 o.via.map.ptr[0].val.convert(v);
1663 } catch (const msgpack::type_error&) {
1664 std::cerr << o << std::endl;
1665 throw_or_abort("error converting into enum variant 'HeapValueType::Array'");
1666 }
1667
1668 value = v;
1669 } else if (tag == "Vector") {
1670 Vector v;
1671 try {
1672 o.via.map.ptr[0].val.convert(v);
1673 } catch (const msgpack::type_error&) {
1674 std::cerr << o << std::endl;
1675 throw_or_abort("error converting into enum variant 'HeapValueType::Vector'");
1676 }
1677
1678 value = v;
1679 } else {
1680 std::cerr << o << std::endl;
1681 throw_or_abort("unknown 'HeapValueType' enum variant: " + tag);
1682 }
1683 }
1684};
1685
1689
1690 friend bool operator==(const HeapVector&, const HeapVector&);
1691
1692 void msgpack_pack(auto& packer) const
1693 {
1694 packer.pack_array(2);
1695 packer.pack(pointer);
1696 packer.pack(size);
1697 }
1698
1699 void msgpack_unpack(msgpack::object const& o)
1700 {
1701 std::string name = "HeapVector";
1702 if (o.type == msgpack::type::MAP) {
1703 auto kvmap = Helpers::make_kvmap(o, name);
1704 Helpers::conv_fld_from_kvmap(kvmap, name, "pointer", pointer, false);
1705 Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false);
1706 } else if (o.type == msgpack::type::ARRAY) {
1707 auto array = o.via.array;
1708 Helpers::conv_fld_from_array(array, name, "pointer", pointer, 0);
1709 Helpers::conv_fld_from_array(array, name, "size", size, 1);
1710 } else {
1711 throw_or_abort("expected MAP or ARRAY for " + name);
1712 }
1713 }
1714};
1715
1717
1720
1721 friend bool operator==(const MemoryAddress&, const MemoryAddress&);
1722
1723 void msgpack_pack(auto& packer) const { packer.pack(value); }
1724
1725 void msgpack_unpack(msgpack::object const& o)
1726 {
1727 try {
1728 o.convert(value);
1729 } catch (const msgpack::type_error&) {
1730 std::cerr << o << std::endl;
1731 throw_or_abort("error converting into newtype 'MemoryAddress'");
1732 }
1733 }
1734 };
1735
1736 struct HeapArray {
1738
1739 friend bool operator==(const HeapArray&, const HeapArray&);
1740
1741 void msgpack_pack(auto& packer) const { packer.pack(value); }
1742
1743 void msgpack_unpack(msgpack::object const& o)
1744 {
1745 try {
1746 o.convert(value);
1747 } catch (const msgpack::type_error&) {
1748 std::cerr << o << std::endl;
1749 throw_or_abort("error converting into newtype 'HeapArray'");
1750 }
1751 }
1752 };
1753
1754 struct HeapVector {
1756
1757 friend bool operator==(const HeapVector&, const HeapVector&);
1758
1759 void msgpack_pack(auto& packer) const { packer.pack(value); }
1760
1761 void msgpack_unpack(msgpack::object const& o)
1762 {
1763 try {
1764 o.convert(value);
1765 } catch (const msgpack::type_error&) {
1766 std::cerr << o << std::endl;
1767 throw_or_abort("error converting into newtype 'HeapVector'");
1768 }
1769 }
1770 };
1771
1773
1774 friend bool operator==(const ValueOrArray&, const ValueOrArray&);
1775
1776 void msgpack_pack(auto& packer) const
1777 {
1778 std::string tag;
1779 bool is_unit;
1780 switch (value.index()) {
1781
1782 case 0:
1783 tag = "MemoryAddress";
1784 is_unit = false;
1785 break;
1786 case 1:
1787 tag = "HeapArray";
1788 is_unit = false;
1789 break;
1790 case 2:
1791 tag = "HeapVector";
1792 is_unit = false;
1793 break;
1794 default:
1795 throw_or_abort("unknown enum 'ValueOrArray' variant index: " + std::to_string(value.index()));
1796 }
1797 if (is_unit) {
1798 packer.pack(tag);
1799 } else {
1800 std::visit(
1801 [&packer, tag](const auto& arg) {
1802 packer.pack_map(1);
1803 packer.pack(tag);
1804 packer.pack(arg);
1805 },
1806 value);
1807 }
1808 }
1809
1810 void msgpack_unpack(msgpack::object const& o)
1811 {
1812
1813 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
1814 std::cerr << o << std::endl;
1815 throw_or_abort("expected MAP or STR for enum 'ValueOrArray'; got type " + std::to_string(o.type));
1816 }
1817 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
1818 throw_or_abort("expected 1 entry for enum 'ValueOrArray'; got " + std::to_string(o.via.map.size));
1819 }
1820 std::string tag;
1821 try {
1822 if (o.type == msgpack::type::object_type::MAP) {
1823 o.via.map.ptr[0].key.convert(tag);
1824 } else {
1825 o.convert(tag);
1826 }
1827 } catch (const msgpack::type_error&) {
1828 std::cerr << o << std::endl;
1829 throw_or_abort("error converting tag to string for enum 'ValueOrArray'");
1830 }
1831 if (tag == "MemoryAddress") {
1832 MemoryAddress v;
1833 try {
1834 o.via.map.ptr[0].val.convert(v);
1835 } catch (const msgpack::type_error&) {
1836 std::cerr << o << std::endl;
1837 throw_or_abort("error converting into enum variant 'ValueOrArray::MemoryAddress'");
1838 }
1839
1840 value = v;
1841 } else if (tag == "HeapArray") {
1842 HeapArray v;
1843 try {
1844 o.via.map.ptr[0].val.convert(v);
1845 } catch (const msgpack::type_error&) {
1846 std::cerr << o << std::endl;
1847 throw_or_abort("error converting into enum variant 'ValueOrArray::HeapArray'");
1848 }
1849
1850 value = v;
1851 } else if (tag == "HeapVector") {
1852 HeapVector v;
1853 try {
1854 o.via.map.ptr[0].val.convert(v);
1855 } catch (const msgpack::type_error&) {
1856 std::cerr << o << std::endl;
1857 throw_or_abort("error converting into enum variant 'ValueOrArray::HeapVector'");
1858 }
1859
1860 value = v;
1861 } else {
1862 std::cerr << o << std::endl;
1863 throw_or_abort("unknown 'ValueOrArray' enum variant: " + tag);
1864 }
1865 }
1866};
1867
1869
1875
1876 friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&);
1877
1878 void msgpack_pack(auto& packer) const
1879 {
1880 packer.pack_array(4);
1881 packer.pack(destination);
1882 packer.pack(op);
1883 packer.pack(lhs);
1884 packer.pack(rhs);
1885 }
1886
1887 void msgpack_unpack(msgpack::object const& o)
1888 {
1889 std::string name = "BinaryFieldOp";
1890 if (o.type == msgpack::type::MAP) {
1891 auto kvmap = Helpers::make_kvmap(o, name);
1892 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
1893 Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false);
1894 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
1895 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
1896 } else if (o.type == msgpack::type::ARRAY) {
1897 auto array = o.via.array;
1898 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
1899 Helpers::conv_fld_from_array(array, name, "op", op, 1);
1900 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 2);
1901 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 3);
1902 } else {
1903 throw_or_abort("expected MAP or ARRAY for " + name);
1904 }
1905 }
1906 };
1907
1914
1915 friend bool operator==(const BinaryIntOp&, const BinaryIntOp&);
1916
1917 void msgpack_pack(auto& packer) const
1918 {
1919 packer.pack_array(5);
1920 packer.pack(destination);
1921 packer.pack(op);
1922 packer.pack(bit_size);
1923 packer.pack(lhs);
1924 packer.pack(rhs);
1925 }
1926
1927 void msgpack_unpack(msgpack::object const& o)
1928 {
1929 std::string name = "BinaryIntOp";
1930 if (o.type == msgpack::type::MAP) {
1931 auto kvmap = Helpers::make_kvmap(o, name);
1932 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
1933 Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false);
1934 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
1935 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
1936 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
1937 } else if (o.type == msgpack::type::ARRAY) {
1938 auto array = o.via.array;
1939 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
1940 Helpers::conv_fld_from_array(array, name, "op", op, 1);
1941 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 2);
1942 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 3);
1943 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 4);
1944 } else {
1945 throw_or_abort("expected MAP or ARRAY for " + name);
1946 }
1947 }
1948 };
1949
1950 struct Not {
1954
1955 friend bool operator==(const Not&, const Not&);
1956
1957 void msgpack_pack(auto& packer) const
1958 {
1959 packer.pack_array(3);
1960 packer.pack(destination);
1961 packer.pack(source);
1962 packer.pack(bit_size);
1963 }
1964
1965 void msgpack_unpack(msgpack::object const& o)
1966 {
1967 std::string name = "Not";
1968 if (o.type == msgpack::type::MAP) {
1969 auto kvmap = Helpers::make_kvmap(o, name);
1970 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
1971 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
1972 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
1973 } else if (o.type == msgpack::type::ARRAY) {
1974 auto array = o.via.array;
1975 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
1976 Helpers::conv_fld_from_array(array, name, "source", source, 1);
1977 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 2);
1978 } else {
1979 throw_or_abort("expected MAP or ARRAY for " + name);
1980 }
1981 }
1982 };
1983
1984 struct Cast {
1988
1989 friend bool operator==(const Cast&, const Cast&);
1990
1991 void msgpack_pack(auto& packer) const
1992 {
1993 packer.pack_array(3);
1994 packer.pack(destination);
1995 packer.pack(source);
1996 packer.pack(bit_size);
1997 }
1998
1999 void msgpack_unpack(msgpack::object const& o)
2000 {
2001 std::string name = "Cast";
2002 if (o.type == msgpack::type::MAP) {
2003 auto kvmap = Helpers::make_kvmap(o, name);
2004 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2005 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
2006 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
2007 } else if (o.type == msgpack::type::ARRAY) {
2008 auto array = o.via.array;
2009 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2010 Helpers::conv_fld_from_array(array, name, "source", source, 1);
2011 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 2);
2012 } else {
2013 throw_or_abort("expected MAP or ARRAY for " + name);
2014 }
2015 }
2016 };
2017
2018 struct JumpIf {
2020 uint64_t location;
2021
2022 friend bool operator==(const JumpIf&, const JumpIf&);
2023
2024 void msgpack_pack(auto& packer) const
2025 {
2026 packer.pack_array(2);
2027 packer.pack(condition);
2028 packer.pack(location);
2029 }
2030
2031 void msgpack_unpack(msgpack::object const& o)
2032 {
2033 std::string name = "JumpIf";
2034 if (o.type == msgpack::type::MAP) {
2035 auto kvmap = Helpers::make_kvmap(o, name);
2036 Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false);
2037 Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false);
2038 } else if (o.type == msgpack::type::ARRAY) {
2039 auto array = o.via.array;
2040 Helpers::conv_fld_from_array(array, name, "condition", condition, 0);
2041 Helpers::conv_fld_from_array(array, name, "location", location, 1);
2042 } else {
2043 throw_or_abort("expected MAP or ARRAY for " + name);
2044 }
2045 }
2046 };
2047
2048 struct Jump {
2049 uint64_t location;
2050
2051 friend bool operator==(const Jump&, const Jump&);
2052
2053 void msgpack_pack(auto& packer) const
2054 {
2055 packer.pack_array(1);
2056 packer.pack(location);
2057 }
2058
2059 void msgpack_unpack(msgpack::object const& o)
2060 {
2061 std::string name = "Jump";
2062 if (o.type == msgpack::type::MAP) {
2063 auto kvmap = Helpers::make_kvmap(o, name);
2064 Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false);
2065 } else if (o.type == msgpack::type::ARRAY) {
2066 auto array = o.via.array;
2067 Helpers::conv_fld_from_array(array, name, "location", location, 0);
2068 } else {
2069 throw_or_abort("expected MAP or ARRAY for " + name);
2070 }
2071 }
2072 };
2073
2078
2079 friend bool operator==(const CalldataCopy&, const CalldataCopy&);
2080
2081 void msgpack_pack(auto& packer) const
2082 {
2083 packer.pack_array(3);
2084 packer.pack(destination_address);
2085 packer.pack(size_address);
2086 packer.pack(offset_address);
2087 }
2088
2089 void msgpack_unpack(msgpack::object const& o)
2090 {
2091 std::string name = "CalldataCopy";
2092 if (o.type == msgpack::type::MAP) {
2093 auto kvmap = Helpers::make_kvmap(o, name);
2094 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_address", destination_address, false);
2095 Helpers::conv_fld_from_kvmap(kvmap, name, "size_address", size_address, false);
2096 Helpers::conv_fld_from_kvmap(kvmap, name, "offset_address", offset_address, false);
2097 } else if (o.type == msgpack::type::ARRAY) {
2098 auto array = o.via.array;
2099 Helpers::conv_fld_from_array(array, name, "destination_address", destination_address, 0);
2100 Helpers::conv_fld_from_array(array, name, "size_address", size_address, 1);
2101 Helpers::conv_fld_from_array(array, name, "offset_address", offset_address, 2);
2102 } else {
2103 throw_or_abort("expected MAP or ARRAY for " + name);
2104 }
2105 }
2106 };
2107
2108 struct Call {
2109 uint64_t location;
2110
2111 friend bool operator==(const Call&, const Call&);
2112
2113 void msgpack_pack(auto& packer) const
2114 {
2115 packer.pack_array(1);
2116 packer.pack(location);
2117 }
2118
2119 void msgpack_unpack(msgpack::object const& o)
2120 {
2121 std::string name = "Call";
2122 if (o.type == msgpack::type::MAP) {
2123 auto kvmap = Helpers::make_kvmap(o, name);
2124 Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false);
2125 } else if (o.type == msgpack::type::ARRAY) {
2126 auto array = o.via.array;
2127 Helpers::conv_fld_from_array(array, name, "location", location, 0);
2128 } else {
2129 throw_or_abort("expected MAP or ARRAY for " + name);
2130 }
2131 }
2132 };
2133
2134 struct Const {
2137 std::vector<uint8_t> value;
2138
2139 friend bool operator==(const Const&, const Const&);
2140
2141 void msgpack_pack(auto& packer) const
2142 {
2143 packer.pack_array(3);
2144 packer.pack(destination);
2145 packer.pack(bit_size);
2146 packer.pack(value);
2147 }
2148
2149 void msgpack_unpack(msgpack::object const& o)
2150 {
2151 std::string name = "Const";
2152 if (o.type == msgpack::type::MAP) {
2153 auto kvmap = Helpers::make_kvmap(o, name);
2154 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2155 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
2156 Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false);
2157 } else if (o.type == msgpack::type::ARRAY) {
2158 auto array = o.via.array;
2159 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2160 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 1);
2161 Helpers::conv_fld_from_array(array, name, "value", value, 2);
2162 } else {
2163 throw_or_abort("expected MAP or ARRAY for " + name);
2164 }
2165 }
2166 };
2167
2171 std::vector<uint8_t> value;
2172
2173 friend bool operator==(const IndirectConst&, const IndirectConst&);
2174
2175 void msgpack_pack(auto& packer) const
2176 {
2177 packer.pack_array(3);
2178 packer.pack(destination_pointer);
2179 packer.pack(bit_size);
2180 packer.pack(value);
2181 }
2182
2183 void msgpack_unpack(msgpack::object const& o)
2184 {
2185 std::string name = "IndirectConst";
2186 if (o.type == msgpack::type::MAP) {
2187 auto kvmap = Helpers::make_kvmap(o, name);
2188 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_pointer", destination_pointer, false);
2189 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
2190 Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false);
2191 } else if (o.type == msgpack::type::ARRAY) {
2192 auto array = o.via.array;
2193 Helpers::conv_fld_from_array(array, name, "destination_pointer", destination_pointer, 0);
2194 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 1);
2195 Helpers::conv_fld_from_array(array, name, "value", value, 2);
2196 } else {
2197 throw_or_abort("expected MAP or ARRAY for " + name);
2198 }
2199 }
2200 };
2201
2202 struct Return {
2203 friend bool operator==(const Return&, const Return&);
2204
2205 void msgpack_pack(auto& packer) const {}
2206 void msgpack_unpack(msgpack::object const& o) {}
2207 };
2208
2210 std::string function;
2211 std::vector<Acir::ValueOrArray> destinations;
2212 std::vector<Acir::HeapValueType> destination_value_types;
2213 std::vector<Acir::ValueOrArray> inputs;
2214 std::vector<Acir::HeapValueType> input_value_types;
2215
2216 friend bool operator==(const ForeignCall&, const ForeignCall&);
2217
2218 void msgpack_pack(auto& packer) const
2219 {
2220 packer.pack_array(5);
2221 packer.pack(function);
2222 packer.pack(destinations);
2223 packer.pack(destination_value_types);
2224 packer.pack(inputs);
2225 packer.pack(input_value_types);
2226 }
2227
2228 void msgpack_unpack(msgpack::object const& o)
2229 {
2230 std::string name = "ForeignCall";
2231 if (o.type == msgpack::type::MAP) {
2232 auto kvmap = Helpers::make_kvmap(o, name);
2233 Helpers::conv_fld_from_kvmap(kvmap, name, "function", function, false);
2234 Helpers::conv_fld_from_kvmap(kvmap, name, "destinations", destinations, false);
2235 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_value_types", destination_value_types, false);
2236 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
2237 Helpers::conv_fld_from_kvmap(kvmap, name, "input_value_types", input_value_types, false);
2238 } else if (o.type == msgpack::type::ARRAY) {
2239 auto array = o.via.array;
2240 Helpers::conv_fld_from_array(array, name, "function", function, 0);
2241 Helpers::conv_fld_from_array(array, name, "destinations", destinations, 1);
2242 Helpers::conv_fld_from_array(array, name, "destination_value_types", destination_value_types, 2);
2243 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 3);
2244 Helpers::conv_fld_from_array(array, name, "input_value_types", input_value_types, 4);
2245 } else {
2246 throw_or_abort("expected MAP or ARRAY for " + name);
2247 }
2248 }
2249 };
2250
2251 struct Mov {
2254
2255 friend bool operator==(const Mov&, const Mov&);
2256
2257 void msgpack_pack(auto& packer) const
2258 {
2259 packer.pack_array(2);
2260 packer.pack(destination);
2261 packer.pack(source);
2262 }
2263
2264 void msgpack_unpack(msgpack::object const& o)
2265 {
2266 std::string name = "Mov";
2267 if (o.type == msgpack::type::MAP) {
2268 auto kvmap = Helpers::make_kvmap(o, name);
2269 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2270 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
2271 } else if (o.type == msgpack::type::ARRAY) {
2272 auto array = o.via.array;
2273 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2274 Helpers::conv_fld_from_array(array, name, "source", source, 1);
2275 } else {
2276 throw_or_abort("expected MAP or ARRAY for " + name);
2277 }
2278 }
2279 };
2280
2286
2287 friend bool operator==(const ConditionalMov&, const ConditionalMov&);
2288
2289 void msgpack_pack(auto& packer) const
2290 {
2291 packer.pack_array(4);
2292 packer.pack(destination);
2293 packer.pack(source_a);
2294 packer.pack(source_b);
2295 packer.pack(condition);
2296 }
2297
2298 void msgpack_unpack(msgpack::object const& o)
2299 {
2300 std::string name = "ConditionalMov";
2301 if (o.type == msgpack::type::MAP) {
2302 auto kvmap = Helpers::make_kvmap(o, name);
2303 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2304 Helpers::conv_fld_from_kvmap(kvmap, name, "source_a", source_a, false);
2305 Helpers::conv_fld_from_kvmap(kvmap, name, "source_b", source_b, false);
2306 Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false);
2307 } else if (o.type == msgpack::type::ARRAY) {
2308 auto array = o.via.array;
2309 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2310 Helpers::conv_fld_from_array(array, name, "source_a", source_a, 1);
2311 Helpers::conv_fld_from_array(array, name, "source_b", source_b, 2);
2312 Helpers::conv_fld_from_array(array, name, "condition", condition, 3);
2313 } else {
2314 throw_or_abort("expected MAP or ARRAY for " + name);
2315 }
2316 }
2317 };
2318
2319 struct Load {
2322
2323 friend bool operator==(const Load&, const Load&);
2324
2325 void msgpack_pack(auto& packer) const
2326 {
2327 packer.pack_array(2);
2328 packer.pack(destination);
2329 packer.pack(source_pointer);
2330 }
2331
2332 void msgpack_unpack(msgpack::object const& o)
2333 {
2334 std::string name = "Load";
2335 if (o.type == msgpack::type::MAP) {
2336 auto kvmap = Helpers::make_kvmap(o, name);
2337 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2338 Helpers::conv_fld_from_kvmap(kvmap, name, "source_pointer", source_pointer, false);
2339 } else if (o.type == msgpack::type::ARRAY) {
2340 auto array = o.via.array;
2341 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2342 Helpers::conv_fld_from_array(array, name, "source_pointer", source_pointer, 1);
2343 } else {
2344 throw_or_abort("expected MAP or ARRAY for " + name);
2345 }
2346 }
2347 };
2348
2349 struct Store {
2352
2353 friend bool operator==(const Store&, const Store&);
2354
2355 void msgpack_pack(auto& packer) const
2356 {
2357 packer.pack_array(2);
2358 packer.pack(destination_pointer);
2359 packer.pack(source);
2360 }
2361
2362 void msgpack_unpack(msgpack::object const& o)
2363 {
2364 std::string name = "Store";
2365 if (o.type == msgpack::type::MAP) {
2366 auto kvmap = Helpers::make_kvmap(o, name);
2367 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_pointer", destination_pointer, false);
2368 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
2369 } else if (o.type == msgpack::type::ARRAY) {
2370 auto array = o.via.array;
2371 Helpers::conv_fld_from_array(array, name, "destination_pointer", destination_pointer, 0);
2372 Helpers::conv_fld_from_array(array, name, "source", source, 1);
2373 } else {
2374 throw_or_abort("expected MAP or ARRAY for " + name);
2375 }
2376 }
2377 };
2378
2379 struct BlackBox {
2381
2382 friend bool operator==(const BlackBox&, const BlackBox&);
2383
2384 void msgpack_pack(auto& packer) const { packer.pack(value); }
2385
2386 void msgpack_unpack(msgpack::object const& o)
2387 {
2388 try {
2389 o.convert(value);
2390 } catch (const msgpack::type_error&) {
2391 std::cerr << o << std::endl;
2392 throw_or_abort("error converting into newtype 'BlackBox'");
2393 }
2394 }
2395 };
2396
2397 struct Trap {
2399
2400 friend bool operator==(const Trap&, const Trap&);
2401
2402 void msgpack_pack(auto& packer) const
2403 {
2404 packer.pack_array(1);
2405 packer.pack(revert_data);
2406 }
2407
2408 void msgpack_unpack(msgpack::object const& o)
2409 {
2410 std::string name = "Trap";
2411 if (o.type == msgpack::type::MAP) {
2412 auto kvmap = Helpers::make_kvmap(o, name);
2413 Helpers::conv_fld_from_kvmap(kvmap, name, "revert_data", revert_data, false);
2414 } else if (o.type == msgpack::type::ARRAY) {
2415 auto array = o.via.array;
2416 Helpers::conv_fld_from_array(array, name, "revert_data", revert_data, 0);
2417 } else {
2418 throw_or_abort("expected MAP or ARRAY for " + name);
2419 }
2420 }
2421 };
2422
2423 struct Stop {
2425
2426 friend bool operator==(const Stop&, const Stop&);
2427
2428 void msgpack_pack(auto& packer) const
2429 {
2430 packer.pack_array(1);
2431 packer.pack(return_data);
2432 }
2433
2434 void msgpack_unpack(msgpack::object const& o)
2435 {
2436 std::string name = "Stop";
2437 if (o.type == msgpack::type::MAP) {
2438 auto kvmap = Helpers::make_kvmap(o, name);
2439 Helpers::conv_fld_from_kvmap(kvmap, name, "return_data", return_data, false);
2440 } else if (o.type == msgpack::type::ARRAY) {
2441 auto array = o.via.array;
2442 Helpers::conv_fld_from_array(array, name, "return_data", return_data, 0);
2443 } else {
2444 throw_or_abort("expected MAP or ARRAY for " + name);
2445 }
2446 }
2447 };
2448
2451 Not,
2452 Cast,
2453 JumpIf,
2454 Jump,
2455 CalldataCopy,
2456 Call,
2457 Const,
2458 IndirectConst,
2459 Return,
2460 ForeignCall,
2461 Mov,
2462 ConditionalMov,
2463 Load,
2464 Store,
2465 BlackBox,
2466 Trap,
2467 Stop>
2469
2470 friend bool operator==(const BrilligOpcode&, const BrilligOpcode&);
2471
2472 void msgpack_pack(auto& packer) const
2473 {
2474 std::string tag;
2475 bool is_unit;
2476 switch (value.index()) {
2477
2478 case 0:
2479 tag = "BinaryFieldOp";
2480 is_unit = false;
2481 break;
2482 case 1:
2483 tag = "BinaryIntOp";
2484 is_unit = false;
2485 break;
2486 case 2:
2487 tag = "Not";
2488 is_unit = false;
2489 break;
2490 case 3:
2491 tag = "Cast";
2492 is_unit = false;
2493 break;
2494 case 4:
2495 tag = "JumpIf";
2496 is_unit = false;
2497 break;
2498 case 5:
2499 tag = "Jump";
2500 is_unit = false;
2501 break;
2502 case 6:
2503 tag = "CalldataCopy";
2504 is_unit = false;
2505 break;
2506 case 7:
2507 tag = "Call";
2508 is_unit = false;
2509 break;
2510 case 8:
2511 tag = "Const";
2512 is_unit = false;
2513 break;
2514 case 9:
2515 tag = "IndirectConst";
2516 is_unit = false;
2517 break;
2518 case 10:
2519 tag = "Return";
2520 is_unit = true;
2521 break;
2522 case 11:
2523 tag = "ForeignCall";
2524 is_unit = false;
2525 break;
2526 case 12:
2527 tag = "Mov";
2528 is_unit = false;
2529 break;
2530 case 13:
2531 tag = "ConditionalMov";
2532 is_unit = false;
2533 break;
2534 case 14:
2535 tag = "Load";
2536 is_unit = false;
2537 break;
2538 case 15:
2539 tag = "Store";
2540 is_unit = false;
2541 break;
2542 case 16:
2543 tag = "BlackBox";
2544 is_unit = false;
2545 break;
2546 case 17:
2547 tag = "Trap";
2548 is_unit = false;
2549 break;
2550 case 18:
2551 tag = "Stop";
2552 is_unit = false;
2553 break;
2554 default:
2555 throw_or_abort("unknown enum 'BrilligOpcode' variant index: " + std::to_string(value.index()));
2556 }
2557 if (is_unit) {
2558 packer.pack(tag);
2559 } else {
2560 std::visit(
2561 [&packer, tag](const auto& arg) {
2562 packer.pack_map(1);
2563 packer.pack(tag);
2564 packer.pack(arg);
2565 },
2566 value);
2567 }
2568 }
2569
2570 void msgpack_unpack(msgpack::object const& o)
2571 {
2572
2573 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
2574 std::cerr << o << std::endl;
2575 throw_or_abort("expected MAP or STR for enum 'BrilligOpcode'; got type " + std::to_string(o.type));
2576 }
2577 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
2578 throw_or_abort("expected 1 entry for enum 'BrilligOpcode'; got " + std::to_string(o.via.map.size));
2579 }
2580 std::string tag;
2581 try {
2582 if (o.type == msgpack::type::object_type::MAP) {
2583 o.via.map.ptr[0].key.convert(tag);
2584 } else {
2585 o.convert(tag);
2586 }
2587 } catch (const msgpack::type_error&) {
2588 std::cerr << o << std::endl;
2589 throw_or_abort("error converting tag to string for enum 'BrilligOpcode'");
2590 }
2591 if (tag == "BinaryFieldOp") {
2592 BinaryFieldOp v;
2593 try {
2594 o.via.map.ptr[0].val.convert(v);
2595 } catch (const msgpack::type_error&) {
2596 std::cerr << o << std::endl;
2597 throw_or_abort("error converting into enum variant 'BrilligOpcode::BinaryFieldOp'");
2598 }
2599
2600 value = v;
2601 } else if (tag == "BinaryIntOp") {
2602 BinaryIntOp v;
2603 try {
2604 o.via.map.ptr[0].val.convert(v);
2605 } catch (const msgpack::type_error&) {
2606 std::cerr << o << std::endl;
2607 throw_or_abort("error converting into enum variant 'BrilligOpcode::BinaryIntOp'");
2608 }
2609
2610 value = v;
2611 } else if (tag == "Not") {
2612 Not v;
2613 try {
2614 o.via.map.ptr[0].val.convert(v);
2615 } catch (const msgpack::type_error&) {
2616 std::cerr << o << std::endl;
2617 throw_or_abort("error converting into enum variant 'BrilligOpcode::Not'");
2618 }
2619
2620 value = v;
2621 } else if (tag == "Cast") {
2622 Cast v;
2623 try {
2624 o.via.map.ptr[0].val.convert(v);
2625 } catch (const msgpack::type_error&) {
2626 std::cerr << o << std::endl;
2627 throw_or_abort("error converting into enum variant 'BrilligOpcode::Cast'");
2628 }
2629
2630 value = v;
2631 } else if (tag == "JumpIf") {
2632 JumpIf v;
2633 try {
2634 o.via.map.ptr[0].val.convert(v);
2635 } catch (const msgpack::type_error&) {
2636 std::cerr << o << std::endl;
2637 throw_or_abort("error converting into enum variant 'BrilligOpcode::JumpIf'");
2638 }
2639
2640 value = v;
2641 } else if (tag == "Jump") {
2642 Jump v;
2643 try {
2644 o.via.map.ptr[0].val.convert(v);
2645 } catch (const msgpack::type_error&) {
2646 std::cerr << o << std::endl;
2647 throw_or_abort("error converting into enum variant 'BrilligOpcode::Jump'");
2648 }
2649
2650 value = v;
2651 } else if (tag == "CalldataCopy") {
2652 CalldataCopy v;
2653 try {
2654 o.via.map.ptr[0].val.convert(v);
2655 } catch (const msgpack::type_error&) {
2656 std::cerr << o << std::endl;
2657 throw_or_abort("error converting into enum variant 'BrilligOpcode::CalldataCopy'");
2658 }
2659
2660 value = v;
2661 } else if (tag == "Call") {
2662 Call v;
2663 try {
2664 o.via.map.ptr[0].val.convert(v);
2665 } catch (const msgpack::type_error&) {
2666 std::cerr << o << std::endl;
2667 throw_or_abort("error converting into enum variant 'BrilligOpcode::Call'");
2668 }
2669
2670 value = v;
2671 } else if (tag == "Const") {
2672 Const v;
2673 try {
2674 o.via.map.ptr[0].val.convert(v);
2675 } catch (const msgpack::type_error&) {
2676 std::cerr << o << std::endl;
2677 throw_or_abort("error converting into enum variant 'BrilligOpcode::Const'");
2678 }
2679
2680 value = v;
2681 } else if (tag == "IndirectConst") {
2682 IndirectConst v;
2683 try {
2684 o.via.map.ptr[0].val.convert(v);
2685 } catch (const msgpack::type_error&) {
2686 std::cerr << o << std::endl;
2687 throw_or_abort("error converting into enum variant 'BrilligOpcode::IndirectConst'");
2688 }
2689
2690 value = v;
2691 } else if (tag == "Return") {
2692 Return v;
2693 value = v;
2694 } else if (tag == "ForeignCall") {
2695 ForeignCall v;
2696 try {
2697 o.via.map.ptr[0].val.convert(v);
2698 } catch (const msgpack::type_error&) {
2699 std::cerr << o << std::endl;
2700 throw_or_abort("error converting into enum variant 'BrilligOpcode::ForeignCall'");
2701 }
2702
2703 value = v;
2704 } else if (tag == "Mov") {
2705 Mov v;
2706 try {
2707 o.via.map.ptr[0].val.convert(v);
2708 } catch (const msgpack::type_error&) {
2709 std::cerr << o << std::endl;
2710 throw_or_abort("error converting into enum variant 'BrilligOpcode::Mov'");
2711 }
2712
2713 value = v;
2714 } else if (tag == "ConditionalMov") {
2716 try {
2717 o.via.map.ptr[0].val.convert(v);
2718 } catch (const msgpack::type_error&) {
2719 std::cerr << o << std::endl;
2720 throw_or_abort("error converting into enum variant 'BrilligOpcode::ConditionalMov'");
2721 }
2722
2723 value = v;
2724 } else if (tag == "Load") {
2725 Load v;
2726 try {
2727 o.via.map.ptr[0].val.convert(v);
2728 } catch (const msgpack::type_error&) {
2729 std::cerr << o << std::endl;
2730 throw_or_abort("error converting into enum variant 'BrilligOpcode::Load'");
2731 }
2732
2733 value = v;
2734 } else if (tag == "Store") {
2735 Store v;
2736 try {
2737 o.via.map.ptr[0].val.convert(v);
2738 } catch (const msgpack::type_error&) {
2739 std::cerr << o << std::endl;
2740 throw_or_abort("error converting into enum variant 'BrilligOpcode::Store'");
2741 }
2742
2743 value = v;
2744 } else if (tag == "BlackBox") {
2745 BlackBox v;
2746 try {
2747 o.via.map.ptr[0].val.convert(v);
2748 } catch (const msgpack::type_error&) {
2749 std::cerr << o << std::endl;
2750 throw_or_abort("error converting into enum variant 'BrilligOpcode::BlackBox'");
2751 }
2752
2753 value = v;
2754 } else if (tag == "Trap") {
2755 Trap v;
2756 try {
2757 o.via.map.ptr[0].val.convert(v);
2758 } catch (const msgpack::type_error&) {
2759 std::cerr << o << std::endl;
2760 throw_or_abort("error converting into enum variant 'BrilligOpcode::Trap'");
2761 }
2762
2763 value = v;
2764 } else if (tag == "Stop") {
2765 Stop v;
2766 try {
2767 o.via.map.ptr[0].val.convert(v);
2768 } catch (const msgpack::type_error&) {
2769 std::cerr << o << std::endl;
2770 throw_or_abort("error converting into enum variant 'BrilligOpcode::Stop'");
2771 }
2772
2773 value = v;
2774 } else {
2775 std::cerr << o << std::endl;
2776 throw_or_abort("unknown 'BrilligOpcode' enum variant: " + tag);
2777 }
2778 }
2779};
2780
2781struct Witness {
2782 uint32_t value;
2783
2784 friend bool operator==(const Witness&, const Witness&);
2785
2786 void msgpack_pack(auto& packer) const { packer.pack(value); }
2787
2788 void msgpack_unpack(msgpack::object const& o)
2789 {
2790 try {
2791 o.convert(value);
2792 } catch (const msgpack::type_error&) {
2793 std::cerr << o << std::endl;
2794 throw_or_abort("error converting into newtype 'Witness'");
2795 }
2796 }
2797};
2798
2800
2801 struct Constant {
2802 std::vector<uint8_t> value;
2803
2804 friend bool operator==(const Constant&, const Constant&);
2805
2806 void msgpack_pack(auto& packer) const { packer.pack(value); }
2807
2808 void msgpack_unpack(msgpack::object const& o)
2809 {
2810 try {
2811 o.convert(value);
2812 } catch (const msgpack::type_error&) {
2813 std::cerr << o << std::endl;
2814 throw_or_abort("error converting into newtype 'Constant'");
2815 }
2816 }
2817 };
2818
2819 struct Witness {
2821
2822 friend bool operator==(const Witness&, const Witness&);
2823
2824 void msgpack_pack(auto& packer) const { packer.pack(value); }
2825
2826 void msgpack_unpack(msgpack::object const& o)
2827 {
2828 try {
2829 o.convert(value);
2830 } catch (const msgpack::type_error&) {
2831 std::cerr << o << std::endl;
2832 throw_or_abort("error converting into newtype 'Witness'");
2833 }
2834 }
2835 };
2836
2838
2839 friend bool operator==(const FunctionInput&, const FunctionInput&);
2840
2841 void msgpack_pack(auto& packer) const
2842 {
2843 std::string tag;
2844 bool is_unit;
2845 switch (value.index()) {
2846
2847 case 0:
2848 tag = "Constant";
2849 is_unit = false;
2850 break;
2851 case 1:
2852 tag = "Witness";
2853 is_unit = false;
2854 break;
2855 default:
2856 throw_or_abort("unknown enum 'FunctionInput' variant index: " + std::to_string(value.index()));
2857 }
2858 if (is_unit) {
2859 packer.pack(tag);
2860 } else {
2861 std::visit(
2862 [&packer, tag](const auto& arg) {
2863 packer.pack_map(1);
2864 packer.pack(tag);
2865 packer.pack(arg);
2866 },
2867 value);
2868 }
2869 }
2870
2871 void msgpack_unpack(msgpack::object const& o)
2872 {
2873
2874 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
2875 std::cerr << o << std::endl;
2876 throw_or_abort("expected MAP or STR for enum 'FunctionInput'; got type " + std::to_string(o.type));
2877 }
2878 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
2879 throw_or_abort("expected 1 entry for enum 'FunctionInput'; got " + std::to_string(o.via.map.size));
2880 }
2881 std::string tag;
2882 try {
2883 if (o.type == msgpack::type::object_type::MAP) {
2884 o.via.map.ptr[0].key.convert(tag);
2885 } else {
2886 o.convert(tag);
2887 }
2888 } catch (const msgpack::type_error&) {
2889 std::cerr << o << std::endl;
2890 throw_or_abort("error converting tag to string for enum 'FunctionInput'");
2891 }
2892 if (tag == "Constant") {
2893 Constant v;
2894 try {
2895 o.via.map.ptr[0].val.convert(v);
2896 } catch (const msgpack::type_error&) {
2897 std::cerr << o << std::endl;
2898 throw_or_abort("error converting into enum variant 'FunctionInput::Constant'");
2899 }
2900
2901 value = v;
2902 } else if (tag == "Witness") {
2903 Witness v;
2904 try {
2905 o.via.map.ptr[0].val.convert(v);
2906 } catch (const msgpack::type_error&) {
2907 std::cerr << o << std::endl;
2908 throw_or_abort("error converting into enum variant 'FunctionInput::Witness'");
2909 }
2910
2911 value = v;
2912 } else {
2913 std::cerr << o << std::endl;
2914 throw_or_abort("unknown 'FunctionInput' enum variant: " + tag);
2915 }
2916 }
2917};
2918
2920
2922 std::vector<Acir::FunctionInput> inputs;
2925 std::vector<Acir::Witness> outputs;
2926
2927 friend bool operator==(const AES128Encrypt&, const AES128Encrypt&);
2928
2929 void msgpack_pack(auto& packer) const
2930 {
2931 packer.pack_array(4);
2932 packer.pack(inputs);
2933 packer.pack(iv);
2934 packer.pack(key);
2935 packer.pack(outputs);
2936 }
2937
2938 void msgpack_unpack(msgpack::object const& o)
2939 {
2940 std::string name = "AES128Encrypt";
2941 if (o.type == msgpack::type::MAP) {
2942 auto kvmap = Helpers::make_kvmap(o, name);
2943 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
2944 Helpers::conv_fld_from_kvmap(kvmap, name, "iv", iv, false);
2945 Helpers::conv_fld_from_kvmap(kvmap, name, "key", key, false);
2946 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
2947 } else if (o.type == msgpack::type::ARRAY) {
2948 auto array = o.via.array;
2949 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
2950 Helpers::conv_fld_from_array(array, name, "iv", iv, 1);
2951 Helpers::conv_fld_from_array(array, name, "key", key, 2);
2952 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
2953 } else {
2954 throw_or_abort("expected MAP or ARRAY for " + name);
2955 }
2956 }
2957 };
2958
2959 struct AND {
2962 uint32_t num_bits;
2964
2965 friend bool operator==(const AND&, const AND&);
2966
2967 void msgpack_pack(auto& packer) const
2968 {
2969 packer.pack_array(4);
2970 packer.pack(lhs);
2971 packer.pack(rhs);
2972 packer.pack(num_bits);
2973 packer.pack(output);
2974 }
2975
2976 void msgpack_unpack(msgpack::object const& o)
2977 {
2978 std::string name = "AND";
2979 if (o.type == msgpack::type::MAP) {
2980 auto kvmap = Helpers::make_kvmap(o, name);
2981 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
2982 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
2983 Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false);
2984 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
2985 } else if (o.type == msgpack::type::ARRAY) {
2986 auto array = o.via.array;
2987 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 0);
2988 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 1);
2989 Helpers::conv_fld_from_array(array, name, "num_bits", num_bits, 2);
2990 Helpers::conv_fld_from_array(array, name, "output", output, 3);
2991 } else {
2992 throw_or_abort("expected MAP or ARRAY for " + name);
2993 }
2994 }
2995 };
2996
2997 struct XOR {
3000 uint32_t num_bits;
3002
3003 friend bool operator==(const XOR&, const XOR&);
3004
3005 void msgpack_pack(auto& packer) const
3006 {
3007 packer.pack_array(4);
3008 packer.pack(lhs);
3009 packer.pack(rhs);
3010 packer.pack(num_bits);
3011 packer.pack(output);
3012 }
3013
3014 void msgpack_unpack(msgpack::object const& o)
3015 {
3016 std::string name = "XOR";
3017 if (o.type == msgpack::type::MAP) {
3018 auto kvmap = Helpers::make_kvmap(o, name);
3019 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
3020 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
3021 Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false);
3022 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
3023 } else if (o.type == msgpack::type::ARRAY) {
3024 auto array = o.via.array;
3025 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 0);
3026 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 1);
3027 Helpers::conv_fld_from_array(array, name, "num_bits", num_bits, 2);
3028 Helpers::conv_fld_from_array(array, name, "output", output, 3);
3029 } else {
3030 throw_or_abort("expected MAP or ARRAY for " + name);
3031 }
3032 }
3033 };
3034
3035 struct RANGE {
3037 uint32_t num_bits;
3038
3039 friend bool operator==(const RANGE&, const RANGE&);
3040
3041 void msgpack_pack(auto& packer) const
3042 {
3043 packer.pack_array(2);
3044 packer.pack(input);
3045 packer.pack(num_bits);
3046 }
3047
3048 void msgpack_unpack(msgpack::object const& o)
3049 {
3050 std::string name = "RANGE";
3051 if (o.type == msgpack::type::MAP) {
3052 auto kvmap = Helpers::make_kvmap(o, name);
3053 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
3054 Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false);
3055 } else if (o.type == msgpack::type::ARRAY) {
3056 auto array = o.via.array;
3057 Helpers::conv_fld_from_array(array, name, "input", input, 0);
3058 Helpers::conv_fld_from_array(array, name, "num_bits", num_bits, 1);
3059 } else {
3060 throw_or_abort("expected MAP or ARRAY for " + name);
3061 }
3062 }
3063 };
3064
3065 struct Blake2s {
3066 std::vector<Acir::FunctionInput> inputs;
3068
3069 friend bool operator==(const Blake2s&, const Blake2s&);
3070
3071 void msgpack_pack(auto& packer) const
3072 {
3073 packer.pack_array(2);
3074 packer.pack(inputs);
3075 packer.pack(outputs);
3076 }
3077
3078 void msgpack_unpack(msgpack::object const& o)
3079 {
3080 std::string name = "Blake2s";
3081 if (o.type == msgpack::type::MAP) {
3082 auto kvmap = Helpers::make_kvmap(o, name);
3083 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
3084 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3085 } else if (o.type == msgpack::type::ARRAY) {
3086 auto array = o.via.array;
3087 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
3088 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
3089 } else {
3090 throw_or_abort("expected MAP or ARRAY for " + name);
3091 }
3092 }
3093 };
3094
3095 struct Blake3 {
3096 std::vector<Acir::FunctionInput> inputs;
3098
3099 friend bool operator==(const Blake3&, const Blake3&);
3100
3101 void msgpack_pack(auto& packer) const
3102 {
3103 packer.pack_array(2);
3104 packer.pack(inputs);
3105 packer.pack(outputs);
3106 }
3107
3108 void msgpack_unpack(msgpack::object const& o)
3109 {
3110 std::string name = "Blake3";
3111 if (o.type == msgpack::type::MAP) {
3112 auto kvmap = Helpers::make_kvmap(o, name);
3113 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
3114 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3115 } else if (o.type == msgpack::type::ARRAY) {
3116 auto array = o.via.array;
3117 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
3118 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
3119 } else {
3120 throw_or_abort("expected MAP or ARRAY for " + name);
3121 }
3122 }
3123 };
3124
3132
3133 friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&);
3134
3135 void msgpack_pack(auto& packer) const
3136 {
3137 packer.pack_array(6);
3138 packer.pack(public_key_x);
3139 packer.pack(public_key_y);
3140 packer.pack(signature);
3141 packer.pack(hashed_message);
3142 packer.pack(predicate);
3143 packer.pack(output);
3144 }
3145
3146 void msgpack_unpack(msgpack::object const& o)
3147 {
3148 std::string name = "EcdsaSecp256k1";
3149 if (o.type == msgpack::type::MAP) {
3150 auto kvmap = Helpers::make_kvmap(o, name);
3151 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
3152 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
3153 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
3154 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_message", hashed_message, false);
3155 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
3156 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
3157 } else if (o.type == msgpack::type::ARRAY) {
3158 auto array = o.via.array;
3159 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 0);
3160 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 1);
3161 Helpers::conv_fld_from_array(array, name, "signature", signature, 2);
3162 Helpers::conv_fld_from_array(array, name, "hashed_message", hashed_message, 3);
3163 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 4);
3164 Helpers::conv_fld_from_array(array, name, "output", output, 5);
3165 } else {
3166 throw_or_abort("expected MAP or ARRAY for " + name);
3167 }
3168 }
3169 };
3170
3178
3179 friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&);
3180
3181 void msgpack_pack(auto& packer) const
3182 {
3183 packer.pack_array(6);
3184 packer.pack(public_key_x);
3185 packer.pack(public_key_y);
3186 packer.pack(signature);
3187 packer.pack(hashed_message);
3188 packer.pack(predicate);
3189 packer.pack(output);
3190 }
3191
3192 void msgpack_unpack(msgpack::object const& o)
3193 {
3194 std::string name = "EcdsaSecp256r1";
3195 if (o.type == msgpack::type::MAP) {
3196 auto kvmap = Helpers::make_kvmap(o, name);
3197 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
3198 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
3199 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
3200 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_message", hashed_message, false);
3201 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
3202 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
3203 } else if (o.type == msgpack::type::ARRAY) {
3204 auto array = o.via.array;
3205 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 0);
3206 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 1);
3207 Helpers::conv_fld_from_array(array, name, "signature", signature, 2);
3208 Helpers::conv_fld_from_array(array, name, "hashed_message", hashed_message, 3);
3209 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 4);
3210 Helpers::conv_fld_from_array(array, name, "output", output, 5);
3211 } else {
3212 throw_or_abort("expected MAP or ARRAY for " + name);
3213 }
3214 }
3215 };
3216
3218 std::vector<Acir::FunctionInput> points;
3219 std::vector<Acir::FunctionInput> scalars;
3222
3223 friend bool operator==(const MultiScalarMul&, const MultiScalarMul&);
3224
3225 void msgpack_pack(auto& packer) const
3226 {
3227 packer.pack_array(4);
3228 packer.pack(points);
3229 packer.pack(scalars);
3230 packer.pack(predicate);
3231 packer.pack(outputs);
3232 }
3233
3234 void msgpack_unpack(msgpack::object const& o)
3235 {
3236 std::string name = "MultiScalarMul";
3237 if (o.type == msgpack::type::MAP) {
3238 auto kvmap = Helpers::make_kvmap(o, name);
3239 Helpers::conv_fld_from_kvmap(kvmap, name, "points", points, false);
3240 Helpers::conv_fld_from_kvmap(kvmap, name, "scalars", scalars, false);
3241 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
3242 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3243 } else if (o.type == msgpack::type::ARRAY) {
3244 auto array = o.via.array;
3245 Helpers::conv_fld_from_array(array, name, "points", points, 0);
3246 Helpers::conv_fld_from_array(array, name, "scalars", scalars, 1);
3247 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 2);
3248 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
3249 } else {
3250 throw_or_abort("expected MAP or ARRAY for " + name);
3251 }
3252 }
3253 };
3254
3260
3261 friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&);
3262
3263 void msgpack_pack(auto& packer) const
3264 {
3265 packer.pack_array(4);
3266 packer.pack(input1);
3267 packer.pack(input2);
3268 packer.pack(predicate);
3269 packer.pack(outputs);
3270 }
3271
3272 void msgpack_unpack(msgpack::object const& o)
3273 {
3274 std::string name = "EmbeddedCurveAdd";
3275 if (o.type == msgpack::type::MAP) {
3276 auto kvmap = Helpers::make_kvmap(o, name);
3277 Helpers::conv_fld_from_kvmap(kvmap, name, "input1", input1, false);
3278 Helpers::conv_fld_from_kvmap(kvmap, name, "input2", input2, false);
3279 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
3280 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3281 } else if (o.type == msgpack::type::ARRAY) {
3282 auto array = o.via.array;
3283 Helpers::conv_fld_from_array(array, name, "input1", input1, 0);
3284 Helpers::conv_fld_from_array(array, name, "input2", input2, 1);
3285 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 2);
3286 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
3287 } else {
3288 throw_or_abort("expected MAP or ARRAY for " + name);
3289 }
3290 }
3291 };
3292
3296
3297 friend bool operator==(const Keccakf1600&, const Keccakf1600&);
3298
3299 void msgpack_pack(auto& packer) const
3300 {
3301 packer.pack_array(2);
3302 packer.pack(inputs);
3303 packer.pack(outputs);
3304 }
3305
3306 void msgpack_unpack(msgpack::object const& o)
3307 {
3308 std::string name = "Keccakf1600";
3309 if (o.type == msgpack::type::MAP) {
3310 auto kvmap = Helpers::make_kvmap(o, name);
3311 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
3312 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3313 } else if (o.type == msgpack::type::ARRAY) {
3314 auto array = o.via.array;
3315 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
3316 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
3317 } else {
3318 throw_or_abort("expected MAP or ARRAY for " + name);
3319 }
3320 }
3321 };
3322
3324 std::vector<Acir::FunctionInput> verification_key;
3325 std::vector<Acir::FunctionInput> proof;
3326 std::vector<Acir::FunctionInput> public_inputs;
3328 uint32_t proof_type;
3330
3331 friend bool operator==(const RecursiveAggregation&, const RecursiveAggregation&);
3332
3333 void msgpack_pack(auto& packer) const
3334 {
3335 packer.pack_array(6);
3336 packer.pack(verification_key);
3337 packer.pack(proof);
3338 packer.pack(public_inputs);
3339 packer.pack(key_hash);
3340 packer.pack(proof_type);
3341 packer.pack(predicate);
3342 }
3343
3344 void msgpack_unpack(msgpack::object const& o)
3345 {
3346 std::string name = "RecursiveAggregation";
3347 if (o.type == msgpack::type::MAP) {
3348 auto kvmap = Helpers::make_kvmap(o, name);
3349 Helpers::conv_fld_from_kvmap(kvmap, name, "verification_key", verification_key, false);
3350 Helpers::conv_fld_from_kvmap(kvmap, name, "proof", proof, false);
3351 Helpers::conv_fld_from_kvmap(kvmap, name, "public_inputs", public_inputs, false);
3352 Helpers::conv_fld_from_kvmap(kvmap, name, "key_hash", key_hash, false);
3353 Helpers::conv_fld_from_kvmap(kvmap, name, "proof_type", proof_type, false);
3354 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
3355 } else if (o.type == msgpack::type::ARRAY) {
3356 auto array = o.via.array;
3357 Helpers::conv_fld_from_array(array, name, "verification_key", verification_key, 0);
3358 Helpers::conv_fld_from_array(array, name, "proof", proof, 1);
3359 Helpers::conv_fld_from_array(array, name, "public_inputs", public_inputs, 2);
3360 Helpers::conv_fld_from_array(array, name, "key_hash", key_hash, 3);
3361 Helpers::conv_fld_from_array(array, name, "proof_type", proof_type, 4);
3362 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 5);
3363 } else {
3364 throw_or_abort("expected MAP or ARRAY for " + name);
3365 }
3366 }
3367 };
3368
3370 std::vector<Acir::FunctionInput> inputs;
3371 std::vector<Acir::Witness> outputs;
3372
3373 friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&);
3374
3375 void msgpack_pack(auto& packer) const
3376 {
3377 packer.pack_array(2);
3378 packer.pack(inputs);
3379 packer.pack(outputs);
3380 }
3381
3382 void msgpack_unpack(msgpack::object const& o)
3383 {
3384 std::string name = "Poseidon2Permutation";
3385 if (o.type == msgpack::type::MAP) {
3386 auto kvmap = Helpers::make_kvmap(o, name);
3387 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
3388 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3389 } else if (o.type == msgpack::type::ARRAY) {
3390 auto array = o.via.array;
3391 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
3392 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
3393 } else {
3394 throw_or_abort("expected MAP or ARRAY for " + name);
3395 }
3396 }
3397 };
3398
3403
3404 friend bool operator==(const Sha256Compression&, const Sha256Compression&);
3405
3406 void msgpack_pack(auto& packer) const
3407 {
3408 packer.pack_array(3);
3409 packer.pack(inputs);
3410 packer.pack(hash_values);
3411 packer.pack(outputs);
3412 }
3413
3414 void msgpack_unpack(msgpack::object const& o)
3415 {
3416 std::string name = "Sha256Compression";
3417 if (o.type == msgpack::type::MAP) {
3418 auto kvmap = Helpers::make_kvmap(o, name);
3419 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
3420 Helpers::conv_fld_from_kvmap(kvmap, name, "hash_values", hash_values, false);
3421 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
3422 } else if (o.type == msgpack::type::ARRAY) {
3423 auto array = o.via.array;
3424 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
3425 Helpers::conv_fld_from_array(array, name, "hash_values", hash_values, 1);
3426 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
3427 } else {
3428 throw_or_abort("expected MAP or ARRAY for " + name);
3429 }
3430 }
3431 };
3432
3433 std::variant<AES128Encrypt,
3434 AND,
3435 XOR,
3436 RANGE,
3437 Blake2s,
3438 Blake3,
3439 EcdsaSecp256k1,
3440 EcdsaSecp256r1,
3441 MultiScalarMul,
3442 EmbeddedCurveAdd,
3443 Keccakf1600,
3444 RecursiveAggregation,
3445 Poseidon2Permutation,
3446 Sha256Compression>
3448
3449 friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&);
3450
3451 void msgpack_pack(auto& packer) const
3452 {
3453 std::string tag;
3454 bool is_unit;
3455 switch (value.index()) {
3456
3457 case 0:
3458 tag = "AES128Encrypt";
3459 is_unit = false;
3460 break;
3461 case 1:
3462 tag = "AND";
3463 is_unit = false;
3464 break;
3465 case 2:
3466 tag = "XOR";
3467 is_unit = false;
3468 break;
3469 case 3:
3470 tag = "RANGE";
3471 is_unit = false;
3472 break;
3473 case 4:
3474 tag = "Blake2s";
3475 is_unit = false;
3476 break;
3477 case 5:
3478 tag = "Blake3";
3479 is_unit = false;
3480 break;
3481 case 6:
3482 tag = "EcdsaSecp256k1";
3483 is_unit = false;
3484 break;
3485 case 7:
3486 tag = "EcdsaSecp256r1";
3487 is_unit = false;
3488 break;
3489 case 8:
3490 tag = "MultiScalarMul";
3491 is_unit = false;
3492 break;
3493 case 9:
3494 tag = "EmbeddedCurveAdd";
3495 is_unit = false;
3496 break;
3497 case 10:
3498 tag = "Keccakf1600";
3499 is_unit = false;
3500 break;
3501 case 11:
3502 tag = "RecursiveAggregation";
3503 is_unit = false;
3504 break;
3505 case 12:
3506 tag = "Poseidon2Permutation";
3507 is_unit = false;
3508 break;
3509 case 13:
3510 tag = "Sha256Compression";
3511 is_unit = false;
3512 break;
3513 default:
3514 throw_or_abort("unknown enum 'BlackBoxFuncCall' variant index: " + std::to_string(value.index()));
3515 }
3516 if (is_unit) {
3517 packer.pack(tag);
3518 } else {
3519 std::visit(
3520 [&packer, tag](const auto& arg) {
3521 packer.pack_map(1);
3522 packer.pack(tag);
3523 packer.pack(arg);
3524 },
3525 value);
3526 }
3527 }
3528
3529 void msgpack_unpack(msgpack::object const& o)
3530 {
3531
3532 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
3533 std::cerr << o << std::endl;
3534 throw_or_abort("expected MAP or STR for enum 'BlackBoxFuncCall'; got type " + std::to_string(o.type));
3535 }
3536 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
3537 throw_or_abort("expected 1 entry for enum 'BlackBoxFuncCall'; got " + std::to_string(o.via.map.size));
3538 }
3539 std::string tag;
3540 try {
3541 if (o.type == msgpack::type::object_type::MAP) {
3542 o.via.map.ptr[0].key.convert(tag);
3543 } else {
3544 o.convert(tag);
3545 }
3546 } catch (const msgpack::type_error&) {
3547 std::cerr << o << std::endl;
3548 throw_or_abort("error converting tag to string for enum 'BlackBoxFuncCall'");
3549 }
3550 if (tag == "AES128Encrypt") {
3551 AES128Encrypt v;
3552 try {
3553 o.via.map.ptr[0].val.convert(v);
3554 } catch (const msgpack::type_error&) {
3555 std::cerr << o << std::endl;
3556 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::AES128Encrypt'");
3557 }
3558
3559 value = v;
3560 } else if (tag == "AND") {
3561 AND v;
3562 try {
3563 o.via.map.ptr[0].val.convert(v);
3564 } catch (const msgpack::type_error&) {
3565 std::cerr << o << std::endl;
3566 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::AND'");
3567 }
3568
3569 value = v;
3570 } else if (tag == "XOR") {
3571 XOR v;
3572 try {
3573 o.via.map.ptr[0].val.convert(v);
3574 } catch (const msgpack::type_error&) {
3575 std::cerr << o << std::endl;
3576 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::XOR'");
3577 }
3578
3579 value = v;
3580 } else if (tag == "RANGE") {
3581 RANGE v;
3582 try {
3583 o.via.map.ptr[0].val.convert(v);
3584 } catch (const msgpack::type_error&) {
3585 std::cerr << o << std::endl;
3586 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::RANGE'");
3587 }
3588
3589 value = v;
3590 } else if (tag == "Blake2s") {
3591 Blake2s v;
3592 try {
3593 o.via.map.ptr[0].val.convert(v);
3594 } catch (const msgpack::type_error&) {
3595 std::cerr << o << std::endl;
3596 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Blake2s'");
3597 }
3598
3599 value = v;
3600 } else if (tag == "Blake3") {
3601 Blake3 v;
3602 try {
3603 o.via.map.ptr[0].val.convert(v);
3604 } catch (const msgpack::type_error&) {
3605 std::cerr << o << std::endl;
3606 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Blake3'");
3607 }
3608
3609 value = v;
3610 } else if (tag == "EcdsaSecp256k1") {
3612 try {
3613 o.via.map.ptr[0].val.convert(v);
3614 } catch (const msgpack::type_error&) {
3615 std::cerr << o << std::endl;
3616 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EcdsaSecp256k1'");
3617 }
3618
3619 value = v;
3620 } else if (tag == "EcdsaSecp256r1") {
3622 try {
3623 o.via.map.ptr[0].val.convert(v);
3624 } catch (const msgpack::type_error&) {
3625 std::cerr << o << std::endl;
3626 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EcdsaSecp256r1'");
3627 }
3628
3629 value = v;
3630 } else if (tag == "MultiScalarMul") {
3632 try {
3633 o.via.map.ptr[0].val.convert(v);
3634 } catch (const msgpack::type_error&) {
3635 std::cerr << o << std::endl;
3636 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::MultiScalarMul'");
3637 }
3638
3639 value = v;
3640 } else if (tag == "EmbeddedCurveAdd") {
3642 try {
3643 o.via.map.ptr[0].val.convert(v);
3644 } catch (const msgpack::type_error&) {
3645 std::cerr << o << std::endl;
3646 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EmbeddedCurveAdd'");
3647 }
3648
3649 value = v;
3650 } else if (tag == "Keccakf1600") {
3651 Keccakf1600 v;
3652 try {
3653 o.via.map.ptr[0].val.convert(v);
3654 } catch (const msgpack::type_error&) {
3655 std::cerr << o << std::endl;
3656 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Keccakf1600'");
3657 }
3658
3659 value = v;
3660 } else if (tag == "RecursiveAggregation") {
3662 try {
3663 o.via.map.ptr[0].val.convert(v);
3664 } catch (const msgpack::type_error&) {
3665 std::cerr << o << std::endl;
3666 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::RecursiveAggregation'");
3667 }
3668
3669 value = v;
3670 } else if (tag == "Poseidon2Permutation") {
3672 try {
3673 o.via.map.ptr[0].val.convert(v);
3674 } catch (const msgpack::type_error&) {
3675 std::cerr << o << std::endl;
3676 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Poseidon2Permutation'");
3677 }
3678
3679 value = v;
3680 } else if (tag == "Sha256Compression") {
3682 try {
3683 o.via.map.ptr[0].val.convert(v);
3684 } catch (const msgpack::type_error&) {
3685 std::cerr << o << std::endl;
3686 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Sha256Compression'");
3687 }
3688
3689 value = v;
3690 } else {
3691 std::cerr << o << std::endl;
3692 throw_or_abort("unknown 'BlackBoxFuncCall' enum variant: " + tag);
3693 }
3694 }
3695};
3696
3697struct BlockId {
3698 uint32_t value;
3699
3700 friend bool operator==(const BlockId&, const BlockId&);
3701
3702 void msgpack_pack(auto& packer) const { packer.pack(value); }
3703
3704 void msgpack_unpack(msgpack::object const& o)
3705 {
3706 try {
3707 o.convert(value);
3708 } catch (const msgpack::type_error&) {
3709 std::cerr << o << std::endl;
3710 throw_or_abort("error converting into newtype 'BlockId'");
3711 }
3712 }
3713};
3714
3716
3717 struct Memory {
3718 friend bool operator==(const Memory&, const Memory&);
3719
3720 void msgpack_pack(auto& packer) const {}
3721 void msgpack_unpack(msgpack::object const& o) {}
3722 };
3723
3724 struct CallData {
3725 uint32_t value;
3726
3727 friend bool operator==(const CallData&, const CallData&);
3728
3729 void msgpack_pack(auto& packer) const { packer.pack(value); }
3730
3731 void msgpack_unpack(msgpack::object const& o)
3732 {
3733 try {
3734 o.convert(value);
3735 } catch (const msgpack::type_error&) {
3736 std::cerr << o << std::endl;
3737 throw_or_abort("error converting into newtype 'CallData'");
3738 }
3739 }
3740 };
3741
3742 struct ReturnData {
3743 friend bool operator==(const ReturnData&, const ReturnData&);
3744
3745 void msgpack_pack(auto& packer) const {}
3746 void msgpack_unpack(msgpack::object const& o) {}
3747 };
3748
3750
3751 friend bool operator==(const BlockType&, const BlockType&);
3752
3753 void msgpack_pack(auto& packer) const
3754 {
3755 std::string tag;
3756 bool is_unit;
3757 switch (value.index()) {
3758
3759 case 0:
3760 tag = "Memory";
3761 is_unit = true;
3762 break;
3763 case 1:
3764 tag = "CallData";
3765 is_unit = false;
3766 break;
3767 case 2:
3768 tag = "ReturnData";
3769 is_unit = true;
3770 break;
3771 default:
3772 throw_or_abort("unknown enum 'BlockType' variant index: " + std::to_string(value.index()));
3773 }
3774 if (is_unit) {
3775 packer.pack(tag);
3776 } else {
3777 std::visit(
3778 [&packer, tag](const auto& arg) {
3779 packer.pack_map(1);
3780 packer.pack(tag);
3781 packer.pack(arg);
3782 },
3783 value);
3784 }
3785 }
3786
3787 void msgpack_unpack(msgpack::object const& o)
3788 {
3789
3790 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
3791 std::cerr << o << std::endl;
3792 throw_or_abort("expected MAP or STR for enum 'BlockType'; got type " + std::to_string(o.type));
3793 }
3794 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
3795 throw_or_abort("expected 1 entry for enum 'BlockType'; got " + std::to_string(o.via.map.size));
3796 }
3797 std::string tag;
3798 try {
3799 if (o.type == msgpack::type::object_type::MAP) {
3800 o.via.map.ptr[0].key.convert(tag);
3801 } else {
3802 o.convert(tag);
3803 }
3804 } catch (const msgpack::type_error&) {
3805 std::cerr << o << std::endl;
3806 throw_or_abort("error converting tag to string for enum 'BlockType'");
3807 }
3808 if (tag == "Memory") {
3809 Memory v;
3810 value = v;
3811 } else if (tag == "CallData") {
3812 CallData v;
3813 try {
3814 o.via.map.ptr[0].val.convert(v);
3815 } catch (const msgpack::type_error&) {
3816 std::cerr << o << std::endl;
3817 throw_or_abort("error converting into enum variant 'BlockType::CallData'");
3818 }
3819
3820 value = v;
3821 } else if (tag == "ReturnData") {
3822 ReturnData v;
3823 value = v;
3824 } else {
3825 std::cerr << o << std::endl;
3826 throw_or_abort("unknown 'BlockType' enum variant: " + tag);
3827 }
3828 }
3829};
3830
3834 std::vector<uint8_t> q_c;
3835
3836 friend bool operator==(const Expression&, const Expression&);
3837
3838 void msgpack_pack(auto& packer) const
3839 {
3840 packer.pack_array(3);
3841 packer.pack(mul_terms);
3842 packer.pack(linear_combinations);
3843 packer.pack(q_c);
3844 }
3845
3846 void msgpack_unpack(msgpack::object const& o)
3847 {
3848 std::string name = "Expression";
3849 if (o.type == msgpack::type::MAP) {
3850 auto kvmap = Helpers::make_kvmap(o, name);
3851 Helpers::conv_fld_from_kvmap(kvmap, name, "mul_terms", mul_terms, false);
3852 Helpers::conv_fld_from_kvmap(kvmap, name, "linear_combinations", linear_combinations, false);
3853 Helpers::conv_fld_from_kvmap(kvmap, name, "q_c", q_c, false);
3854 } else if (o.type == msgpack::type::ARRAY) {
3855 auto array = o.via.array;
3856 Helpers::conv_fld_from_array(array, name, "mul_terms", mul_terms, 0);
3857 Helpers::conv_fld_from_array(array, name, "linear_combinations", linear_combinations, 1);
3858 Helpers::conv_fld_from_array(array, name, "q_c", q_c, 2);
3859 } else {
3860 throw_or_abort("expected MAP or ARRAY for " + name);
3861 }
3862 }
3863};
3864
3866
3867 struct Single {
3869
3870 friend bool operator==(const Single&, const Single&);
3871
3872 void msgpack_pack(auto& packer) const { packer.pack(value); }
3873
3874 void msgpack_unpack(msgpack::object const& o)
3875 {
3876 try {
3877 o.convert(value);
3878 } catch (const msgpack::type_error&) {
3879 std::cerr << o << std::endl;
3880 throw_or_abort("error converting into newtype 'Single'");
3881 }
3882 }
3883 };
3884
3885 struct Array {
3886 std::vector<Acir::Expression> value;
3887
3888 friend bool operator==(const Array&, const Array&);
3889
3890 void msgpack_pack(auto& packer) const { packer.pack(value); }
3891
3892 void msgpack_unpack(msgpack::object const& o)
3893 {
3894 try {
3895 o.convert(value);
3896 } catch (const msgpack::type_error&) {
3897 std::cerr << o << std::endl;
3898 throw_or_abort("error converting into newtype 'Array'");
3899 }
3900 }
3901 };
3902
3905
3906 friend bool operator==(const MemoryArray&, const MemoryArray&);
3907
3908 void msgpack_pack(auto& packer) const { packer.pack(value); }
3909
3910 void msgpack_unpack(msgpack::object const& o)
3911 {
3912 try {
3913 o.convert(value);
3914 } catch (const msgpack::type_error&) {
3915 std::cerr << o << std::endl;
3916 throw_or_abort("error converting into newtype 'MemoryArray'");
3917 }
3918 }
3919 };
3920
3922
3923 friend bool operator==(const BrilligInputs&, const BrilligInputs&);
3924
3925 void msgpack_pack(auto& packer) const
3926 {
3927 std::string tag;
3928 bool is_unit;
3929 switch (value.index()) {
3930
3931 case 0:
3932 tag = "Single";
3933 is_unit = false;
3934 break;
3935 case 1:
3936 tag = "Array";
3937 is_unit = false;
3938 break;
3939 case 2:
3940 tag = "MemoryArray";
3941 is_unit = false;
3942 break;
3943 default:
3944 throw_or_abort("unknown enum 'BrilligInputs' variant index: " + std::to_string(value.index()));
3945 }
3946 if (is_unit) {
3947 packer.pack(tag);
3948 } else {
3949 std::visit(
3950 [&packer, tag](const auto& arg) {
3951 packer.pack_map(1);
3952 packer.pack(tag);
3953 packer.pack(arg);
3954 },
3955 value);
3956 }
3957 }
3958
3959 void msgpack_unpack(msgpack::object const& o)
3960 {
3961
3962 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
3963 std::cerr << o << std::endl;
3964 throw_or_abort("expected MAP or STR for enum 'BrilligInputs'; got type " + std::to_string(o.type));
3965 }
3966 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
3967 throw_or_abort("expected 1 entry for enum 'BrilligInputs'; got " + std::to_string(o.via.map.size));
3968 }
3969 std::string tag;
3970 try {
3971 if (o.type == msgpack::type::object_type::MAP) {
3972 o.via.map.ptr[0].key.convert(tag);
3973 } else {
3974 o.convert(tag);
3975 }
3976 } catch (const msgpack::type_error&) {
3977 std::cerr << o << std::endl;
3978 throw_or_abort("error converting tag to string for enum 'BrilligInputs'");
3979 }
3980 if (tag == "Single") {
3981 Single v;
3982 try {
3983 o.via.map.ptr[0].val.convert(v);
3984 } catch (const msgpack::type_error&) {
3985 std::cerr << o << std::endl;
3986 throw_or_abort("error converting into enum variant 'BrilligInputs::Single'");
3987 }
3988
3989 value = v;
3990 } else if (tag == "Array") {
3991 Array v;
3992 try {
3993 o.via.map.ptr[0].val.convert(v);
3994 } catch (const msgpack::type_error&) {
3995 std::cerr << o << std::endl;
3996 throw_or_abort("error converting into enum variant 'BrilligInputs::Array'");
3997 }
3998
3999 value = v;
4000 } else if (tag == "MemoryArray") {
4001 MemoryArray v;
4002 try {
4003 o.via.map.ptr[0].val.convert(v);
4004 } catch (const msgpack::type_error&) {
4005 std::cerr << o << std::endl;
4006 throw_or_abort("error converting into enum variant 'BrilligInputs::MemoryArray'");
4007 }
4008
4009 value = v;
4010 } else {
4011 std::cerr << o << std::endl;
4012 throw_or_abort("unknown 'BrilligInputs' enum variant: " + tag);
4013 }
4014 }
4015};
4016
4018
4019 struct Simple {
4021
4022 friend bool operator==(const Simple&, const Simple&);
4023
4024 void msgpack_pack(auto& packer) const { packer.pack(value); }
4025
4026 void msgpack_unpack(msgpack::object const& o)
4027 {
4028 try {
4029 o.convert(value);
4030 } catch (const msgpack::type_error&) {
4031 std::cerr << o << std::endl;
4032 throw_or_abort("error converting into newtype 'Simple'");
4033 }
4034 }
4035 };
4036
4037 struct Array {
4038 std::vector<Acir::Witness> value;
4039
4040 friend bool operator==(const Array&, const Array&);
4041
4042 void msgpack_pack(auto& packer) const { packer.pack(value); }
4043
4044 void msgpack_unpack(msgpack::object const& o)
4045 {
4046 try {
4047 o.convert(value);
4048 } catch (const msgpack::type_error&) {
4049 std::cerr << o << std::endl;
4050 throw_or_abort("error converting into newtype 'Array'");
4051 }
4052 }
4053 };
4054
4056
4057 friend bool operator==(const BrilligOutputs&, const BrilligOutputs&);
4058
4059 void msgpack_pack(auto& packer) const
4060 {
4061 std::string tag;
4062 bool is_unit;
4063 switch (value.index()) {
4064
4065 case 0:
4066 tag = "Simple";
4067 is_unit = false;
4068 break;
4069 case 1:
4070 tag = "Array";
4071 is_unit = false;
4072 break;
4073 default:
4074 throw_or_abort("unknown enum 'BrilligOutputs' variant index: " + std::to_string(value.index()));
4075 }
4076 if (is_unit) {
4077 packer.pack(tag);
4078 } else {
4079 std::visit(
4080 [&packer, tag](const auto& arg) {
4081 packer.pack_map(1);
4082 packer.pack(tag);
4083 packer.pack(arg);
4084 },
4085 value);
4086 }
4087 }
4088
4089 void msgpack_unpack(msgpack::object const& o)
4090 {
4091
4092 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
4093 std::cerr << o << std::endl;
4094 throw_or_abort("expected MAP or STR for enum 'BrilligOutputs'; got type " + std::to_string(o.type));
4095 }
4096 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
4097 throw_or_abort("expected 1 entry for enum 'BrilligOutputs'; got " + std::to_string(o.via.map.size));
4098 }
4099 std::string tag;
4100 try {
4101 if (o.type == msgpack::type::object_type::MAP) {
4102 o.via.map.ptr[0].key.convert(tag);
4103 } else {
4104 o.convert(tag);
4105 }
4106 } catch (const msgpack::type_error&) {
4107 std::cerr << o << std::endl;
4108 throw_or_abort("error converting tag to string for enum 'BrilligOutputs'");
4109 }
4110 if (tag == "Simple") {
4111 Simple v;
4112 try {
4113 o.via.map.ptr[0].val.convert(v);
4114 } catch (const msgpack::type_error&) {
4115 std::cerr << o << std::endl;
4116 throw_or_abort("error converting into enum variant 'BrilligOutputs::Simple'");
4117 }
4118
4119 value = v;
4120 } else if (tag == "Array") {
4121 Array v;
4122 try {
4123 o.via.map.ptr[0].val.convert(v);
4124 } catch (const msgpack::type_error&) {
4125 std::cerr << o << std::endl;
4126 throw_or_abort("error converting into enum variant 'BrilligOutputs::Array'");
4127 }
4128
4129 value = v;
4130 } else {
4131 std::cerr << o << std::endl;
4132 throw_or_abort("unknown 'BrilligOutputs' enum variant: " + tag);
4133 }
4134 }
4135};
4136
4137struct MemOp {
4141
4142 friend bool operator==(const MemOp&, const MemOp&);
4143
4144 void msgpack_pack(auto& packer) const
4145 {
4146 packer.pack_array(3);
4147 packer.pack(operation);
4148 packer.pack(index);
4149 packer.pack(value);
4150 }
4151
4152 void msgpack_unpack(msgpack::object const& o)
4153 {
4154 std::string name = "MemOp";
4155 if (o.type == msgpack::type::MAP) {
4156 auto kvmap = Helpers::make_kvmap(o, name);
4157 Helpers::conv_fld_from_kvmap(kvmap, name, "operation", operation, false);
4158 Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false);
4159 Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false);
4160 } else if (o.type == msgpack::type::ARRAY) {
4161 auto array = o.via.array;
4162 Helpers::conv_fld_from_array(array, name, "operation", operation, 0);
4163 Helpers::conv_fld_from_array(array, name, "index", index, 1);
4164 Helpers::conv_fld_from_array(array, name, "value", value, 2);
4165 } else {
4166 throw_or_abort("expected MAP or ARRAY for " + name);
4167 }
4168 }
4169};
4170
4171struct Opcode {
4172
4173 struct AssertZero {
4175
4176 friend bool operator==(const AssertZero&, const AssertZero&);
4177
4178 void msgpack_pack(auto& packer) const { packer.pack(value); }
4179
4180 void msgpack_unpack(msgpack::object const& o)
4181 {
4182 try {
4183 o.convert(value);
4184 } catch (const msgpack::type_error&) {
4185 std::cerr << o << std::endl;
4186 throw_or_abort("error converting into newtype 'AssertZero'");
4187 }
4188 }
4189 };
4190
4193
4194 friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&);
4195
4196 void msgpack_pack(auto& packer) const { packer.pack(value); }
4197
4198 void msgpack_unpack(msgpack::object const& o)
4199 {
4200 try {
4201 o.convert(value);
4202 } catch (const msgpack::type_error&) {
4203 std::cerr << o << std::endl;
4204 throw_or_abort("error converting into newtype 'BlackBoxFuncCall'");
4205 }
4206 }
4207 };
4208
4209 struct MemoryOp {
4212
4213 friend bool operator==(const MemoryOp&, const MemoryOp&);
4214
4215 void msgpack_pack(auto& packer) const
4216 {
4217 packer.pack_array(2);
4218 packer.pack(block_id);
4219 packer.pack(op);
4220 }
4221
4222 void msgpack_unpack(msgpack::object const& o)
4223 {
4224 std::string name = "MemoryOp";
4225 if (o.type == msgpack::type::MAP) {
4226 auto kvmap = Helpers::make_kvmap(o, name);
4227 Helpers::conv_fld_from_kvmap(kvmap, name, "block_id", block_id, false);
4228 Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false);
4229 } else if (o.type == msgpack::type::ARRAY) {
4230 auto array = o.via.array;
4231 Helpers::conv_fld_from_array(array, name, "block_id", block_id, 0);
4232 Helpers::conv_fld_from_array(array, name, "op", op, 1);
4233 } else {
4234 throw_or_abort("expected MAP or ARRAY for " + name);
4235 }
4236 }
4237 };
4238
4239 struct MemoryInit {
4241 std::vector<Acir::Witness> init;
4243
4244 friend bool operator==(const MemoryInit&, const MemoryInit&);
4245
4246 void msgpack_pack(auto& packer) const
4247 {
4248 packer.pack_array(3);
4249 packer.pack(block_id);
4250 packer.pack(init);
4251 packer.pack(block_type);
4252 }
4253
4254 void msgpack_unpack(msgpack::object const& o)
4255 {
4256 std::string name = "MemoryInit";
4257 if (o.type == msgpack::type::MAP) {
4258 auto kvmap = Helpers::make_kvmap(o, name);
4259 Helpers::conv_fld_from_kvmap(kvmap, name, "block_id", block_id, false);
4260 Helpers::conv_fld_from_kvmap(kvmap, name, "init", init, false);
4261 Helpers::conv_fld_from_kvmap(kvmap, name, "block_type", block_type, false);
4262 } else if (o.type == msgpack::type::ARRAY) {
4263 auto array = o.via.array;
4264 Helpers::conv_fld_from_array(array, name, "block_id", block_id, 0);
4265 Helpers::conv_fld_from_array(array, name, "init", init, 1);
4266 Helpers::conv_fld_from_array(array, name, "block_type", block_type, 2);
4267 } else {
4268 throw_or_abort("expected MAP or ARRAY for " + name);
4269 }
4270 }
4271 };
4272
4274 uint32_t id;
4275 std::vector<Acir::BrilligInputs> inputs;
4276 std::vector<Acir::BrilligOutputs> outputs;
4278
4279 friend bool operator==(const BrilligCall&, const BrilligCall&);
4280
4281 void msgpack_pack(auto& packer) const
4282 {
4283 packer.pack_array(4);
4284 packer.pack(id);
4285 packer.pack(inputs);
4286 packer.pack(outputs);
4287 packer.pack(predicate);
4288 }
4289
4290 void msgpack_unpack(msgpack::object const& o)
4291 {
4292 std::string name = "BrilligCall";
4293 if (o.type == msgpack::type::MAP) {
4294 auto kvmap = Helpers::make_kvmap(o, name);
4295 Helpers::conv_fld_from_kvmap(kvmap, name, "id", id, false);
4296 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
4297 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
4298 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
4299 } else if (o.type == msgpack::type::ARRAY) {
4300 auto array = o.via.array;
4301 Helpers::conv_fld_from_array(array, name, "id", id, 0);
4302 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 1);
4303 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
4304 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 3);
4305 } else {
4306 throw_or_abort("expected MAP or ARRAY for " + name);
4307 }
4308 }
4309 };
4310
4311 struct Call {
4312 uint32_t id;
4313 std::vector<Acir::Witness> inputs;
4314 std::vector<Acir::Witness> outputs;
4316
4317 friend bool operator==(const Call&, const Call&);
4318
4319 void msgpack_pack(auto& packer) const
4320 {
4321 packer.pack_array(4);
4322 packer.pack(id);
4323 packer.pack(inputs);
4324 packer.pack(outputs);
4325 packer.pack(predicate);
4326 }
4327
4328 void msgpack_unpack(msgpack::object const& o)
4329 {
4330 std::string name = "Call";
4331 if (o.type == msgpack::type::MAP) {
4332 auto kvmap = Helpers::make_kvmap(o, name);
4333 Helpers::conv_fld_from_kvmap(kvmap, name, "id", id, false);
4334 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
4335 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
4336 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
4337 } else if (o.type == msgpack::type::ARRAY) {
4338 auto array = o.via.array;
4339 Helpers::conv_fld_from_array(array, name, "id", id, 0);
4340 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 1);
4341 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
4342 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 3);
4343 } else {
4344 throw_or_abort("expected MAP or ARRAY for " + name);
4345 }
4346 }
4347 };
4348
4350
4351 friend bool operator==(const Opcode&, const Opcode&);
4352
4353 void msgpack_pack(auto& packer) const
4354 {
4355 std::string tag;
4356 bool is_unit;
4357 switch (value.index()) {
4358
4359 case 0:
4360 tag = "AssertZero";
4361 is_unit = false;
4362 break;
4363 case 1:
4364 tag = "BlackBoxFuncCall";
4365 is_unit = false;
4366 break;
4367 case 2:
4368 tag = "MemoryOp";
4369 is_unit = false;
4370 break;
4371 case 3:
4372 tag = "MemoryInit";
4373 is_unit = false;
4374 break;
4375 case 4:
4376 tag = "BrilligCall";
4377 is_unit = false;
4378 break;
4379 case 5:
4380 tag = "Call";
4381 is_unit = false;
4382 break;
4383 default:
4384 throw_or_abort("unknown enum 'Opcode' variant index: " + std::to_string(value.index()));
4385 }
4386 if (is_unit) {
4387 packer.pack(tag);
4388 } else {
4389 std::visit(
4390 [&packer, tag](const auto& arg) {
4391 packer.pack_map(1);
4392 packer.pack(tag);
4393 packer.pack(arg);
4394 },
4395 value);
4396 }
4397 }
4398
4399 void msgpack_unpack(msgpack::object const& o)
4400 {
4401
4402 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
4403 std::cerr << o << std::endl;
4404 throw_or_abort("expected MAP or STR for enum 'Opcode'; got type " + std::to_string(o.type));
4405 }
4406 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
4407 throw_or_abort("expected 1 entry for enum 'Opcode'; got " + std::to_string(o.via.map.size));
4408 }
4409 std::string tag;
4410 try {
4411 if (o.type == msgpack::type::object_type::MAP) {
4412 o.via.map.ptr[0].key.convert(tag);
4413 } else {
4414 o.convert(tag);
4415 }
4416 } catch (const msgpack::type_error&) {
4417 std::cerr << o << std::endl;
4418 throw_or_abort("error converting tag to string for enum 'Opcode'");
4419 }
4420 if (tag == "AssertZero") {
4421 AssertZero v;
4422 try {
4423 o.via.map.ptr[0].val.convert(v);
4424 } catch (const msgpack::type_error&) {
4425 std::cerr << o << std::endl;
4426 throw_or_abort("error converting into enum variant 'Opcode::AssertZero'");
4427 }
4428
4429 value = v;
4430 } else if (tag == "BlackBoxFuncCall") {
4432 try {
4433 o.via.map.ptr[0].val.convert(v);
4434 } catch (const msgpack::type_error&) {
4435 std::cerr << o << std::endl;
4436 throw_or_abort("error converting into enum variant 'Opcode::BlackBoxFuncCall'");
4437 }
4438
4439 value = v;
4440 } else if (tag == "MemoryOp") {
4441 MemoryOp v;
4442 try {
4443 o.via.map.ptr[0].val.convert(v);
4444 } catch (const msgpack::type_error&) {
4445 std::cerr << o << std::endl;
4446 throw_or_abort("error converting into enum variant 'Opcode::MemoryOp'");
4447 }
4448
4449 value = v;
4450 } else if (tag == "MemoryInit") {
4451 MemoryInit v;
4452 try {
4453 o.via.map.ptr[0].val.convert(v);
4454 } catch (const msgpack::type_error&) {
4455 std::cerr << o << std::endl;
4456 throw_or_abort("error converting into enum variant 'Opcode::MemoryInit'");
4457 }
4458
4459 value = v;
4460 } else if (tag == "BrilligCall") {
4461 BrilligCall v;
4462 try {
4463 o.via.map.ptr[0].val.convert(v);
4464 } catch (const msgpack::type_error&) {
4465 std::cerr << o << std::endl;
4466 throw_or_abort("error converting into enum variant 'Opcode::BrilligCall'");
4467 }
4468
4469 value = v;
4470 } else if (tag == "Call") {
4471 Call v;
4472 try {
4473 o.via.map.ptr[0].val.convert(v);
4474 } catch (const msgpack::type_error&) {
4475 std::cerr << o << std::endl;
4476 throw_or_abort("error converting into enum variant 'Opcode::Call'");
4477 }
4478
4479 value = v;
4480 } else {
4481 std::cerr << o << std::endl;
4482 throw_or_abort("unknown 'Opcode' enum variant: " + tag);
4483 }
4484 }
4485};
4486
4488
4489 struct Expression {
4491
4492 friend bool operator==(const Expression&, const Expression&);
4493
4494 void msgpack_pack(auto& packer) const { packer.pack(value); }
4495
4496 void msgpack_unpack(msgpack::object const& o)
4497 {
4498 try {
4499 o.convert(value);
4500 } catch (const msgpack::type_error&) {
4501 std::cerr << o << std::endl;
4502 throw_or_abort("error converting into newtype 'Expression'");
4503 }
4504 }
4505 };
4506
4507 struct Memory {
4509
4510 friend bool operator==(const Memory&, const Memory&);
4511
4512 void msgpack_pack(auto& packer) const { packer.pack(value); }
4513
4514 void msgpack_unpack(msgpack::object const& o)
4515 {
4516 try {
4517 o.convert(value);
4518 } catch (const msgpack::type_error&) {
4519 std::cerr << o << std::endl;
4520 throw_or_abort("error converting into newtype 'Memory'");
4521 }
4522 }
4523 };
4524
4526
4527 friend bool operator==(const ExpressionOrMemory&, const ExpressionOrMemory&);
4528
4529 void msgpack_pack(auto& packer) const
4530 {
4531 std::string tag;
4532 bool is_unit;
4533 switch (value.index()) {
4534
4535 case 0:
4536 tag = "Expression";
4537 is_unit = false;
4538 break;
4539 case 1:
4540 tag = "Memory";
4541 is_unit = false;
4542 break;
4543 default:
4544 throw_or_abort("unknown enum 'ExpressionOrMemory' variant index: " + std::to_string(value.index()));
4545 }
4546 if (is_unit) {
4547 packer.pack(tag);
4548 } else {
4549 std::visit(
4550 [&packer, tag](const auto& arg) {
4551 packer.pack_map(1);
4552 packer.pack(tag);
4553 packer.pack(arg);
4554 },
4555 value);
4556 }
4557 }
4558
4559 void msgpack_unpack(msgpack::object const& o)
4560 {
4561
4562 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
4563 std::cerr << o << std::endl;
4564 throw_or_abort("expected MAP or STR for enum 'ExpressionOrMemory'; got type " + std::to_string(o.type));
4565 }
4566 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
4567 throw_or_abort("expected 1 entry for enum 'ExpressionOrMemory'; got " + std::to_string(o.via.map.size));
4568 }
4569 std::string tag;
4570 try {
4571 if (o.type == msgpack::type::object_type::MAP) {
4572 o.via.map.ptr[0].key.convert(tag);
4573 } else {
4574 o.convert(tag);
4575 }
4576 } catch (const msgpack::type_error&) {
4577 std::cerr << o << std::endl;
4578 throw_or_abort("error converting tag to string for enum 'ExpressionOrMemory'");
4579 }
4580 if (tag == "Expression") {
4581 Expression v;
4582 try {
4583 o.via.map.ptr[0].val.convert(v);
4584 } catch (const msgpack::type_error&) {
4585 std::cerr << o << std::endl;
4586 throw_or_abort("error converting into enum variant 'ExpressionOrMemory::Expression'");
4587 }
4588
4589 value = v;
4590 } else if (tag == "Memory") {
4591 Memory v;
4592 try {
4593 o.via.map.ptr[0].val.convert(v);
4594 } catch (const msgpack::type_error&) {
4595 std::cerr << o << std::endl;
4596 throw_or_abort("error converting into enum variant 'ExpressionOrMemory::Memory'");
4597 }
4598
4599 value = v;
4600 } else {
4601 std::cerr << o << std::endl;
4602 throw_or_abort("unknown 'ExpressionOrMemory' enum variant: " + tag);
4603 }
4604 }
4605};
4606
4609 std::vector<Acir::ExpressionOrMemory> payload;
4610
4611 friend bool operator==(const AssertionPayload&, const AssertionPayload&);
4612
4613 void msgpack_pack(auto& packer) const
4614 {
4615 packer.pack_array(2);
4616 packer.pack(error_selector);
4617 packer.pack(payload);
4618 }
4619
4620 void msgpack_unpack(msgpack::object const& o)
4621 {
4622 std::string name = "AssertionPayload";
4623 if (o.type == msgpack::type::MAP) {
4624 auto kvmap = Helpers::make_kvmap(o, name);
4625 Helpers::conv_fld_from_kvmap(kvmap, name, "error_selector", error_selector, false);
4626 Helpers::conv_fld_from_kvmap(kvmap, name, "payload", payload, false);
4627 } else if (o.type == msgpack::type::ARRAY) {
4628 auto array = o.via.array;
4629 Helpers::conv_fld_from_array(array, name, "error_selector", error_selector, 0);
4630 Helpers::conv_fld_from_array(array, name, "payload", payload, 1);
4631 } else {
4632 throw_or_abort("expected MAP or ARRAY for " + name);
4633 }
4634 }
4635};
4636
4638
4639 struct Acir {
4640 uint64_t value;
4641
4642 friend bool operator==(const Acir&, const Acir&);
4643
4644 void msgpack_pack(auto& packer) const { packer.pack(value); }
4645
4646 void msgpack_unpack(msgpack::object const& o)
4647 {
4648 try {
4649 o.convert(value);
4650 } catch (const msgpack::type_error&) {
4651 std::cerr << o << std::endl;
4652 throw_or_abort("error converting into newtype 'Acir'");
4653 }
4654 }
4655 };
4656
4657 struct Brillig {
4658 uint64_t acir_index;
4660
4661 friend bool operator==(const Brillig&, const Brillig&);
4662
4663 void msgpack_pack(auto& packer) const
4664 {
4665 packer.pack_array(2);
4666 packer.pack(acir_index);
4667 packer.pack(brillig_index);
4668 }
4669
4670 void msgpack_unpack(msgpack::object const& o)
4671 {
4672 std::string name = "Brillig";
4673 if (o.type == msgpack::type::MAP) {
4674 auto kvmap = Helpers::make_kvmap(o, name);
4675 Helpers::conv_fld_from_kvmap(kvmap, name, "acir_index", acir_index, false);
4676 Helpers::conv_fld_from_kvmap(kvmap, name, "brillig_index", brillig_index, false);
4677 } else if (o.type == msgpack::type::ARRAY) {
4678 auto array = o.via.array;
4679 Helpers::conv_fld_from_array(array, name, "acir_index", acir_index, 0);
4680 Helpers::conv_fld_from_array(array, name, "brillig_index", brillig_index, 1);
4681 } else {
4682 throw_or_abort("expected MAP or ARRAY for " + name);
4683 }
4684 }
4685 };
4686
4688
4689 friend bool operator==(const OpcodeLocation&, const OpcodeLocation&);
4690
4691 void msgpack_pack(auto& packer) const
4692 {
4693 std::string tag;
4694 bool is_unit;
4695 switch (value.index()) {
4696
4697 case 0:
4698 tag = "Acir";
4699 is_unit = false;
4700 break;
4701 case 1:
4702 tag = "Brillig";
4703 is_unit = false;
4704 break;
4705 default:
4706 throw_or_abort("unknown enum 'OpcodeLocation' variant index: " + std::to_string(value.index()));
4707 }
4708 if (is_unit) {
4709 packer.pack(tag);
4710 } else {
4711 std::visit(
4712 [&packer, tag](const auto& arg) {
4713 packer.pack_map(1);
4714 packer.pack(tag);
4715 packer.pack(arg);
4716 },
4717 value);
4718 }
4719 }
4720
4721 void msgpack_unpack(msgpack::object const& o)
4722 {
4723
4724 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
4725 std::cerr << o << std::endl;
4726 throw_or_abort("expected MAP or STR for enum 'OpcodeLocation'; got type " + std::to_string(o.type));
4727 }
4728 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
4729 throw_or_abort("expected 1 entry for enum 'OpcodeLocation'; got " + std::to_string(o.via.map.size));
4730 }
4731 std::string tag;
4732 try {
4733 if (o.type == msgpack::type::object_type::MAP) {
4734 o.via.map.ptr[0].key.convert(tag);
4735 } else {
4736 o.convert(tag);
4737 }
4738 } catch (const msgpack::type_error&) {
4739 std::cerr << o << std::endl;
4740 throw_or_abort("error converting tag to string for enum 'OpcodeLocation'");
4741 }
4742 if (tag == "Acir") {
4743 Acir v;
4744 try {
4745 o.via.map.ptr[0].val.convert(v);
4746 } catch (const msgpack::type_error&) {
4747 std::cerr << o << std::endl;
4748 throw_or_abort("error converting into enum variant 'OpcodeLocation::Acir'");
4749 }
4750
4751 value = v;
4752 } else if (tag == "Brillig") {
4753 Brillig v;
4754 try {
4755 o.via.map.ptr[0].val.convert(v);
4756 } catch (const msgpack::type_error&) {
4757 std::cerr << o << std::endl;
4758 throw_or_abort("error converting into enum variant 'OpcodeLocation::Brillig'");
4759 }
4760
4761 value = v;
4762 } else {
4763 std::cerr << o << std::endl;
4764 throw_or_abort("unknown 'OpcodeLocation' enum variant: " + tag);
4765 }
4766 }
4767};
4768
4770 std::vector<Acir::Witness> value;
4771
4772 friend bool operator==(const PublicInputs&, const PublicInputs&);
4773
4774 void msgpack_pack(auto& packer) const { packer.pack(value); }
4775
4776 void msgpack_unpack(msgpack::object const& o)
4777 {
4778 try {
4779 o.convert(value);
4780 } catch (const msgpack::type_error&) {
4781 std::cerr << o << std::endl;
4782 throw_or_abort("error converting into newtype 'PublicInputs'");
4783 }
4784 }
4785};
4786
4787struct Circuit {
4788 std::string function_name;
4790 std::vector<Acir::Opcode> opcodes;
4791 std::vector<Acir::Witness> private_parameters;
4795
4796 friend bool operator==(const Circuit&, const Circuit&);
4797
4798 void msgpack_pack(auto& packer) const
4799 {
4800 packer.pack_array(7);
4801 packer.pack(function_name);
4802 packer.pack(current_witness_index);
4803 packer.pack(opcodes);
4804 packer.pack(private_parameters);
4805 packer.pack(public_parameters);
4806 packer.pack(return_values);
4807 packer.pack(assert_messages);
4808 }
4809
4810 void msgpack_unpack(msgpack::object const& o)
4811 {
4812 std::string name = "Circuit";
4813 if (o.type == msgpack::type::MAP) {
4814 auto kvmap = Helpers::make_kvmap(o, name);
4815 Helpers::conv_fld_from_kvmap(kvmap, name, "function_name", function_name, false);
4816 Helpers::conv_fld_from_kvmap(kvmap, name, "current_witness_index", current_witness_index, false);
4817 Helpers::conv_fld_from_kvmap(kvmap, name, "opcodes", opcodes, false);
4818 Helpers::conv_fld_from_kvmap(kvmap, name, "private_parameters", private_parameters, false);
4819 Helpers::conv_fld_from_kvmap(kvmap, name, "public_parameters", public_parameters, false);
4820 Helpers::conv_fld_from_kvmap(kvmap, name, "return_values", return_values, false);
4821 Helpers::conv_fld_from_kvmap(kvmap, name, "assert_messages", assert_messages, false);
4822 } else if (o.type == msgpack::type::ARRAY) {
4823 auto array = o.via.array;
4824 Helpers::conv_fld_from_array(array, name, "function_name", function_name, 0);
4825 Helpers::conv_fld_from_array(array, name, "current_witness_index", current_witness_index, 1);
4826 Helpers::conv_fld_from_array(array, name, "opcodes", opcodes, 2);
4827 Helpers::conv_fld_from_array(array, name, "private_parameters", private_parameters, 3);
4828 Helpers::conv_fld_from_array(array, name, "public_parameters", public_parameters, 4);
4829 Helpers::conv_fld_from_array(array, name, "return_values", return_values, 5);
4830 Helpers::conv_fld_from_array(array, name, "assert_messages", assert_messages, 6);
4831 } else {
4832 throw_or_abort("expected MAP or ARRAY for " + name);
4833 }
4834 }
4835};
4836
4838 std::string function_name;
4839 std::vector<Acir::BrilligOpcode> bytecode;
4840
4841 friend bool operator==(const BrilligBytecode&, const BrilligBytecode&);
4842
4843 void msgpack_pack(auto& packer) const
4844 {
4845 packer.pack_array(2);
4846 packer.pack(function_name);
4847 packer.pack(bytecode);
4848 }
4849
4850 void msgpack_unpack(msgpack::object const& o)
4851 {
4852 std::string name = "BrilligBytecode";
4853 if (o.type == msgpack::type::MAP) {
4854 auto kvmap = Helpers::make_kvmap(o, name);
4855 Helpers::conv_fld_from_kvmap(kvmap, name, "function_name", function_name, false);
4856 Helpers::conv_fld_from_kvmap(kvmap, name, "bytecode", bytecode, false);
4857 } else if (o.type == msgpack::type::ARRAY) {
4858 auto array = o.via.array;
4859 Helpers::conv_fld_from_array(array, name, "function_name", function_name, 0);
4860 Helpers::conv_fld_from_array(array, name, "bytecode", bytecode, 1);
4861 } else {
4862 throw_or_abort("expected MAP or ARRAY for " + name);
4863 }
4864 }
4865};
4866
4867struct Program {
4868 std::vector<Acir::Circuit> functions;
4869 std::vector<Acir::BrilligBytecode> unconstrained_functions;
4870
4871 friend bool operator==(const Program&, const Program&);
4872
4873 void msgpack_pack(auto& packer) const
4874 {
4875 packer.pack_array(2);
4876 packer.pack(functions);
4877 packer.pack(unconstrained_functions);
4878 }
4879
4880 void msgpack_unpack(msgpack::object const& o)
4881 {
4882 std::string name = "Program";
4883 if (o.type == msgpack::type::MAP) {
4884 auto kvmap = Helpers::make_kvmap(o, name);
4885 Helpers::conv_fld_from_kvmap(kvmap, name, "functions", functions, false);
4886 Helpers::conv_fld_from_kvmap(kvmap, name, "unconstrained_functions", unconstrained_functions, false);
4887 } else if (o.type == msgpack::type::ARRAY) {
4888 auto array = o.via.array;
4889 Helpers::conv_fld_from_array(array, name, "functions", functions, 0);
4890 Helpers::conv_fld_from_array(array, name, "unconstrained_functions", unconstrained_functions, 1);
4891 } else {
4892 throw_or_abort("expected MAP or ARRAY for " + name);
4893 }
4894 }
4895};
4896
4898 std::vector<Acir::Circuit> functions;
4900
4901 friend bool operator==(const ProgramWithoutBrillig&, const ProgramWithoutBrillig&);
4902
4903 void msgpack_pack(auto& packer) const
4904 {
4905 packer.pack_array(2);
4906 packer.pack(functions);
4907 packer.pack(unconstrained_functions);
4908 }
4909
4910 void msgpack_unpack(msgpack::object const& o)
4911 {
4912 std::string name = "ProgramWithoutBrillig";
4913 if (o.type == msgpack::type::MAP) {
4914 auto kvmap = Helpers::make_kvmap(o, name);
4915 Helpers::conv_fld_from_kvmap(kvmap, name, "functions", functions, false);
4916 } else if (o.type == msgpack::type::ARRAY) {
4917 auto array = o.via.array;
4918 Helpers::conv_fld_from_array(array, name, "functions", functions, 0);
4919 } else {
4920 throw_or_abort("expected MAP or ARRAY for " + name);
4921 }
4922 }
4923};
4924
4925} // end of namespace Acir
4926
4927namespace Acir {
4928
4929inline bool operator==(const AssertionPayload& lhs, const AssertionPayload& rhs)
4930{
4931 if (!(lhs.error_selector == rhs.error_selector)) {
4932 return false;
4933 }
4934 if (!(lhs.payload == rhs.payload)) {
4935 return false;
4936 }
4937 return true;
4938}
4939
4940} // end of namespace Acir
4941
4942template <>
4943template <typename Serializer>
4945{
4946 serializer.increase_container_depth();
4947 serde::Serializable<decltype(obj.error_selector)>::serialize(obj.error_selector, serializer);
4948 serde::Serializable<decltype(obj.payload)>::serialize(obj.payload, serializer);
4949 serializer.decrease_container_depth();
4950}
4951
4952template <>
4953template <typename Deserializer>
4955{
4956 deserializer.increase_container_depth();
4958 obj.error_selector = serde::Deserializable<decltype(obj.error_selector)>::deserialize(deserializer);
4959 obj.payload = serde::Deserializable<decltype(obj.payload)>::deserialize(deserializer);
4960 deserializer.decrease_container_depth();
4961 return obj;
4962}
4963
4964namespace Acir {
4965
4966inline bool operator==(const BinaryFieldOp& lhs, const BinaryFieldOp& rhs)
4967{
4968 if (!(lhs.value == rhs.value)) {
4969 return false;
4970 }
4971 return true;
4972}
4973
4974} // end of namespace Acir
4975
4976template <>
4977template <typename Serializer>
4979{
4980 serializer.increase_container_depth();
4981 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
4982 serializer.decrease_container_depth();
4983}
4984
4985template <>
4986template <typename Deserializer>
4988{
4989 deserializer.increase_container_depth();
4991 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
4992 deserializer.decrease_container_depth();
4993 return obj;
4994}
4995
4996namespace Acir {
4997
4998inline bool operator==(const BinaryFieldOp::Add& lhs, const BinaryFieldOp::Add& rhs)
4999{
5000 return true;
5001}
5002
5003} // end of namespace Acir
5004
5005template <>
5006template <typename Serializer>
5010
5011template <>
5012template <typename Deserializer>
5018
5019namespace Acir {
5020
5021inline bool operator==(const BinaryFieldOp::Sub& lhs, const BinaryFieldOp::Sub& rhs)
5022{
5023 return true;
5024}
5025
5026} // end of namespace Acir
5027
5028template <>
5029template <typename Serializer>
5033
5034template <>
5035template <typename Deserializer>
5041
5042namespace Acir {
5043
5044inline bool operator==(const BinaryFieldOp::Mul& lhs, const BinaryFieldOp::Mul& rhs)
5045{
5046 return true;
5047}
5048
5049} // end of namespace Acir
5050
5051template <>
5052template <typename Serializer>
5056
5057template <>
5058template <typename Deserializer>
5064
5065namespace Acir {
5066
5067inline bool operator==(const BinaryFieldOp::Div& lhs, const BinaryFieldOp::Div& rhs)
5068{
5069 return true;
5070}
5071
5072} // end of namespace Acir
5073
5074template <>
5075template <typename Serializer>
5079
5080template <>
5081template <typename Deserializer>
5087
5088namespace Acir {
5089
5091{
5092 return true;
5093}
5094
5095} // end of namespace Acir
5096
5097template <>
5098template <typename Serializer>
5102
5103template <>
5104template <typename Deserializer>
5111
5112namespace Acir {
5113
5114inline bool operator==(const BinaryFieldOp::Equals& lhs, const BinaryFieldOp::Equals& rhs)
5115{
5116 return true;
5117}
5118
5119} // end of namespace Acir
5120
5121template <>
5122template <typename Serializer>
5126
5127template <>
5128template <typename Deserializer>
5134
5135namespace Acir {
5136
5138{
5139 return true;
5140}
5141
5142} // end of namespace Acir
5143
5144template <>
5145template <typename Serializer>
5149
5150template <>
5151template <typename Deserializer>
5158
5159namespace Acir {
5160
5162{
5163 return true;
5164}
5165
5166} // end of namespace Acir
5167
5168template <>
5169template <typename Serializer>
5173
5174template <>
5175template <typename Deserializer>
5182
5183namespace Acir {
5184
5185inline bool operator==(const BinaryIntOp& lhs, const BinaryIntOp& rhs)
5186{
5187 if (!(lhs.value == rhs.value)) {
5188 return false;
5189 }
5190 return true;
5191}
5192
5193} // end of namespace Acir
5194
5195template <>
5196template <typename Serializer>
5198{
5199 serializer.increase_container_depth();
5200 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
5201 serializer.decrease_container_depth();
5202}
5203
5204template <>
5205template <typename Deserializer>
5207{
5208 deserializer.increase_container_depth();
5210 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
5211 deserializer.decrease_container_depth();
5212 return obj;
5213}
5214
5215namespace Acir {
5216
5217inline bool operator==(const BinaryIntOp::Add& lhs, const BinaryIntOp::Add& rhs)
5218{
5219 return true;
5220}
5221
5222} // end of namespace Acir
5223
5224template <>
5225template <typename Serializer>
5228
5229template <>
5230template <typename Deserializer>
5236
5237namespace Acir {
5238
5239inline bool operator==(const BinaryIntOp::Sub& lhs, const BinaryIntOp::Sub& rhs)
5240{
5241 return true;
5242}
5243
5244} // end of namespace Acir
5245
5246template <>
5247template <typename Serializer>
5250
5251template <>
5252template <typename Deserializer>
5258
5259namespace Acir {
5260
5261inline bool operator==(const BinaryIntOp::Mul& lhs, const BinaryIntOp::Mul& rhs)
5262{
5263 return true;
5264}
5265
5266} // end of namespace Acir
5267
5268template <>
5269template <typename Serializer>
5272
5273template <>
5274template <typename Deserializer>
5280
5281namespace Acir {
5282
5283inline bool operator==(const BinaryIntOp::Div& lhs, const BinaryIntOp::Div& rhs)
5284{
5285 return true;
5286}
5287
5288} // end of namespace Acir
5289
5290template <>
5291template <typename Serializer>
5294
5295template <>
5296template <typename Deserializer>
5302
5303namespace Acir {
5304
5305inline bool operator==(const BinaryIntOp::Equals& lhs, const BinaryIntOp::Equals& rhs)
5306{
5307 return true;
5308}
5309
5310} // end of namespace Acir
5311
5312template <>
5313template <typename Serializer>
5317
5318template <>
5319template <typename Deserializer>
5325
5326namespace Acir {
5327
5328inline bool operator==(const BinaryIntOp::LessThan& lhs, const BinaryIntOp::LessThan& rhs)
5329{
5330 return true;
5331}
5332
5333} // end of namespace Acir
5334
5335template <>
5336template <typename Serializer>
5340
5341template <>
5342template <typename Deserializer>
5348
5349namespace Acir {
5350
5352{
5353 return true;
5354}
5355
5356} // end of namespace Acir
5357
5358template <>
5359template <typename Serializer>
5363
5364template <>
5365template <typename Deserializer>
5372
5373namespace Acir {
5374
5375inline bool operator==(const BinaryIntOp::And& lhs, const BinaryIntOp::And& rhs)
5376{
5377 return true;
5378}
5379
5380} // end of namespace Acir
5381
5382template <>
5383template <typename Serializer>
5386
5387template <>
5388template <typename Deserializer>
5394
5395namespace Acir {
5396
5397inline bool operator==(const BinaryIntOp::Or& lhs, const BinaryIntOp::Or& rhs)
5398{
5399 return true;
5400}
5401
5402} // end of namespace Acir
5403
5404template <>
5405template <typename Serializer>
5408
5409template <>
5410template <typename Deserializer>
5412{
5414 return obj;
5415}
5416
5417namespace Acir {
5418
5419inline bool operator==(const BinaryIntOp::Xor& lhs, const BinaryIntOp::Xor& rhs)
5420{
5421 return true;
5422}
5423
5424} // end of namespace Acir
5425
5426template <>
5427template <typename Serializer>
5430
5431template <>
5432template <typename Deserializer>
5438
5439namespace Acir {
5440
5441inline bool operator==(const BinaryIntOp::Shl& lhs, const BinaryIntOp::Shl& rhs)
5442{
5443 return true;
5444}
5445
5446} // end of namespace Acir
5447
5448template <>
5449template <typename Serializer>
5452
5453template <>
5454template <typename Deserializer>
5460
5461namespace Acir {
5462
5463inline bool operator==(const BinaryIntOp::Shr& lhs, const BinaryIntOp::Shr& rhs)
5464{
5465 return true;
5466}
5467
5468} // end of namespace Acir
5469
5470template <>
5471template <typename Serializer>
5474
5475template <>
5476template <typename Deserializer>
5482
5483namespace Acir {
5484
5485inline bool operator==(const BitSize& lhs, const BitSize& rhs)
5486{
5487 if (!(lhs.value == rhs.value)) {
5488 return false;
5489 }
5490 return true;
5491}
5492
5493} // end of namespace Acir
5494
5495template <>
5496template <typename Serializer>
5497void serde::Serializable<Acir::BitSize>::serialize(const Acir::BitSize& obj, Serializer& serializer)
5498{
5499 serializer.increase_container_depth();
5500 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
5501 serializer.decrease_container_depth();
5502}
5503
5504template <>
5505template <typename Deserializer>
5507{
5508 deserializer.increase_container_depth();
5509 Acir::BitSize obj;
5510 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
5511 deserializer.decrease_container_depth();
5512 return obj;
5513}
5514
5515namespace Acir {
5516
5517inline bool operator==(const BitSize::Field& lhs, const BitSize::Field& rhs)
5518{
5519 return true;
5520}
5521
5522} // end of namespace Acir
5523
5524template <>
5525template <typename Serializer>
5528
5529template <>
5530template <typename Deserializer>
5532{
5534 return obj;
5535}
5536
5537namespace Acir {
5538
5539inline bool operator==(const BitSize::Integer& lhs, const BitSize::Integer& rhs)
5540{
5541 if (!(lhs.value == rhs.value)) {
5542 return false;
5543 }
5544 return true;
5545}
5546
5547} // end of namespace Acir
5548
5549template <>
5550template <typename Serializer>
5552{
5553 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
5554}
5555
5556template <>
5557template <typename Deserializer>
5559{
5561 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
5562 return obj;
5563}
5564
5565namespace Acir {
5566
5567inline bool operator==(const BlackBoxFuncCall& lhs, const BlackBoxFuncCall& rhs)
5568{
5569 if (!(lhs.value == rhs.value)) {
5570 return false;
5571 }
5572 return true;
5573}
5574
5575} // end of namespace Acir
5576
5577template <>
5578template <typename Serializer>
5580{
5581 serializer.increase_container_depth();
5582 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
5583 serializer.decrease_container_depth();
5584}
5585
5586template <>
5587template <typename Deserializer>
5589{
5590 deserializer.increase_container_depth();
5592 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
5593 deserializer.decrease_container_depth();
5594 return obj;
5595}
5596
5597namespace Acir {
5598
5600{
5601 if (!(lhs.inputs == rhs.inputs)) {
5602 return false;
5603 }
5604 if (!(lhs.iv == rhs.iv)) {
5605 return false;
5606 }
5607 if (!(lhs.key == rhs.key)) {
5608 return false;
5609 }
5610 if (!(lhs.outputs == rhs.outputs)) {
5611 return false;
5612 }
5613 return true;
5614}
5615
5616} // end of namespace Acir
5617
5618template <>
5619template <typename Serializer>
5621 const Acir::BlackBoxFuncCall::AES128Encrypt& obj, Serializer& serializer)
5622{
5623 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
5624 serde::Serializable<decltype(obj.iv)>::serialize(obj.iv, serializer);
5625 serde::Serializable<decltype(obj.key)>::serialize(obj.key, serializer);
5626 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
5627}
5628
5629template <>
5630template <typename Deserializer>
5632 Deserializer& deserializer)
5633{
5635 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
5636 obj.iv = serde::Deserializable<decltype(obj.iv)>::deserialize(deserializer);
5637 obj.key = serde::Deserializable<decltype(obj.key)>::deserialize(deserializer);
5638 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
5639 return obj;
5640}
5641
5642namespace Acir {
5643
5644inline bool operator==(const BlackBoxFuncCall::AND& lhs, const BlackBoxFuncCall::AND& rhs)
5645{
5646 if (!(lhs.lhs == rhs.lhs)) {
5647 return false;
5648 }
5649 if (!(lhs.rhs == rhs.rhs)) {
5650 return false;
5651 }
5652 if (!(lhs.num_bits == rhs.num_bits)) {
5653 return false;
5654 }
5655 if (!(lhs.output == rhs.output)) {
5656 return false;
5657 }
5658 return true;
5659}
5660
5661} // end of namespace Acir
5662
5663template <>
5664template <typename Serializer>
5666 Serializer& serializer)
5667{
5668 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
5669 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
5670 serde::Serializable<decltype(obj.num_bits)>::serialize(obj.num_bits, serializer);
5671 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
5672}
5673
5674template <>
5675template <typename Deserializer>
5677{
5679 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
5680 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
5681 obj.num_bits = serde::Deserializable<decltype(obj.num_bits)>::deserialize(deserializer);
5682 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
5683 return obj;
5684}
5685
5686namespace Acir {
5687
5688inline bool operator==(const BlackBoxFuncCall::XOR& lhs, const BlackBoxFuncCall::XOR& rhs)
5689{
5690 if (!(lhs.lhs == rhs.lhs)) {
5691 return false;
5692 }
5693 if (!(lhs.rhs == rhs.rhs)) {
5694 return false;
5695 }
5696 if (!(lhs.num_bits == rhs.num_bits)) {
5697 return false;
5698 }
5699 if (!(lhs.output == rhs.output)) {
5700 return false;
5701 }
5702 return true;
5703}
5704
5705} // end of namespace Acir
5706
5707template <>
5708template <typename Serializer>
5710 Serializer& serializer)
5711{
5712 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
5713 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
5714 serde::Serializable<decltype(obj.num_bits)>::serialize(obj.num_bits, serializer);
5715 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
5716}
5717
5718template <>
5719template <typename Deserializer>
5721{
5723 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
5724 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
5725 obj.num_bits = serde::Deserializable<decltype(obj.num_bits)>::deserialize(deserializer);
5726 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
5727 return obj;
5728}
5729
5730namespace Acir {
5731
5733{
5734 if (!(lhs.input == rhs.input)) {
5735 return false;
5736 }
5737 if (!(lhs.num_bits == rhs.num_bits)) {
5738 return false;
5739 }
5740 return true;
5741}
5742
5743} // end of namespace Acir
5744
5745template <>
5746template <typename Serializer>
5748 Serializer& serializer)
5749{
5750 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
5751 serde::Serializable<decltype(obj.num_bits)>::serialize(obj.num_bits, serializer);
5752}
5753
5754template <>
5755template <typename Deserializer>
5757 Deserializer& deserializer)
5758{
5760 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
5761 obj.num_bits = serde::Deserializable<decltype(obj.num_bits)>::deserialize(deserializer);
5762 return obj;
5763}
5764
5765namespace Acir {
5766
5768{
5769 if (!(lhs.inputs == rhs.inputs)) {
5770 return false;
5771 }
5772 if (!(lhs.outputs == rhs.outputs)) {
5773 return false;
5774 }
5775 return true;
5776}
5777
5778} // end of namespace Acir
5779
5780template <>
5781template <typename Serializer>
5783 Serializer& serializer)
5784{
5785 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
5786 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
5787}
5788
5789template <>
5790template <typename Deserializer>
5792 Deserializer& deserializer)
5793{
5795 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
5796 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
5797 return obj;
5798}
5799
5800namespace Acir {
5801
5803{
5804 if (!(lhs.inputs == rhs.inputs)) {
5805 return false;
5806 }
5807 if (!(lhs.outputs == rhs.outputs)) {
5808 return false;
5809 }
5810 return true;
5811}
5812
5813} // end of namespace Acir
5814
5815template <>
5816template <typename Serializer>
5818 Serializer& serializer)
5819{
5820 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
5821 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
5822}
5823
5824template <>
5825template <typename Deserializer>
5827 Deserializer& deserializer)
5828{
5830 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
5831 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
5832 return obj;
5833}
5834
5835namespace Acir {
5836
5838{
5839 if (!(lhs.public_key_x == rhs.public_key_x)) {
5840 return false;
5841 }
5842 if (!(lhs.public_key_y == rhs.public_key_y)) {
5843 return false;
5844 }
5845 if (!(lhs.signature == rhs.signature)) {
5846 return false;
5847 }
5848 if (!(lhs.hashed_message == rhs.hashed_message)) {
5849 return false;
5850 }
5851 if (!(lhs.predicate == rhs.predicate)) {
5852 return false;
5853 }
5854 if (!(lhs.output == rhs.output)) {
5855 return false;
5856 }
5857 return true;
5858}
5859
5860} // end of namespace Acir
5861
5862template <>
5863template <typename Serializer>
5865 const Acir::BlackBoxFuncCall::EcdsaSecp256k1& obj, Serializer& serializer)
5866{
5867 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
5868 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
5869 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
5870 serde::Serializable<decltype(obj.hashed_message)>::serialize(obj.hashed_message, serializer);
5871 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
5872 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
5873}
5874
5875template <>
5876template <typename Deserializer>
5878 Deserializer& deserializer)
5879{
5881 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
5882 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
5883 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
5884 obj.hashed_message = serde::Deserializable<decltype(obj.hashed_message)>::deserialize(deserializer);
5885 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
5886 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
5887 return obj;
5888}
5889
5890namespace Acir {
5891
5893{
5894 if (!(lhs.public_key_x == rhs.public_key_x)) {
5895 return false;
5896 }
5897 if (!(lhs.public_key_y == rhs.public_key_y)) {
5898 return false;
5899 }
5900 if (!(lhs.signature == rhs.signature)) {
5901 return false;
5902 }
5903 if (!(lhs.hashed_message == rhs.hashed_message)) {
5904 return false;
5905 }
5906 if (!(lhs.predicate == rhs.predicate)) {
5907 return false;
5908 }
5909 if (!(lhs.output == rhs.output)) {
5910 return false;
5911 }
5912 return true;
5913}
5914
5915} // end of namespace Acir
5916
5917template <>
5918template <typename Serializer>
5920 const Acir::BlackBoxFuncCall::EcdsaSecp256r1& obj, Serializer& serializer)
5921{
5922 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
5923 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
5924 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
5925 serde::Serializable<decltype(obj.hashed_message)>::serialize(obj.hashed_message, serializer);
5926 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
5927 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
5928}
5929
5930template <>
5931template <typename Deserializer>
5933 Deserializer& deserializer)
5934{
5936 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
5937 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
5938 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
5939 obj.hashed_message = serde::Deserializable<decltype(obj.hashed_message)>::deserialize(deserializer);
5940 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
5941 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
5942 return obj;
5943}
5944
5945namespace Acir {
5946
5948{
5949 if (!(lhs.points == rhs.points)) {
5950 return false;
5951 }
5952 if (!(lhs.scalars == rhs.scalars)) {
5953 return false;
5954 }
5955 if (!(lhs.predicate == rhs.predicate)) {
5956 return false;
5957 }
5958 if (!(lhs.outputs == rhs.outputs)) {
5959 return false;
5960 }
5961 return true;
5962}
5963
5964} // end of namespace Acir
5965
5966template <>
5967template <typename Serializer>
5969 const Acir::BlackBoxFuncCall::MultiScalarMul& obj, Serializer& serializer)
5970{
5971 serde::Serializable<decltype(obj.points)>::serialize(obj.points, serializer);
5972 serde::Serializable<decltype(obj.scalars)>::serialize(obj.scalars, serializer);
5973 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
5974 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
5975}
5976
5977template <>
5978template <typename Deserializer>
5980 Deserializer& deserializer)
5981{
5983 obj.points = serde::Deserializable<decltype(obj.points)>::deserialize(deserializer);
5984 obj.scalars = serde::Deserializable<decltype(obj.scalars)>::deserialize(deserializer);
5985 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
5986 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
5987 return obj;
5988}
5989
5990namespace Acir {
5991
5993{
5994 if (!(lhs.input1 == rhs.input1)) {
5995 return false;
5996 }
5997 if (!(lhs.input2 == rhs.input2)) {
5998 return false;
5999 }
6000 if (!(lhs.predicate == rhs.predicate)) {
6001 return false;
6002 }
6003 if (!(lhs.outputs == rhs.outputs)) {
6004 return false;
6005 }
6006 return true;
6007}
6008
6009} // end of namespace Acir
6010
6011template <>
6012template <typename Serializer>
6014 const Acir::BlackBoxFuncCall::EmbeddedCurveAdd& obj, Serializer& serializer)
6015{
6016 serde::Serializable<decltype(obj.input1)>::serialize(obj.input1, serializer);
6017 serde::Serializable<decltype(obj.input2)>::serialize(obj.input2, serializer);
6018 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
6019 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
6020}
6021
6022template <>
6023template <typename Deserializer>
6025 Deserializer& deserializer)
6026{
6028 obj.input1 = serde::Deserializable<decltype(obj.input1)>::deserialize(deserializer);
6029 obj.input2 = serde::Deserializable<decltype(obj.input2)>::deserialize(deserializer);
6030 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
6031 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
6032 return obj;
6033}
6034
6035namespace Acir {
6036
6038{
6039 if (!(lhs.inputs == rhs.inputs)) {
6040 return false;
6041 }
6042 if (!(lhs.outputs == rhs.outputs)) {
6043 return false;
6044 }
6045 return true;
6046}
6047
6048} // end of namespace Acir
6049
6050template <>
6051template <typename Serializer>
6053 Serializer& serializer)
6054{
6055 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
6056 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
6057}
6058
6059template <>
6060template <typename Deserializer>
6062 Deserializer& deserializer)
6063{
6065 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
6066 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
6067 return obj;
6068}
6069
6070namespace Acir {
6071
6074{
6075 if (!(lhs.verification_key == rhs.verification_key)) {
6076 return false;
6077 }
6078 if (!(lhs.proof == rhs.proof)) {
6079 return false;
6080 }
6081 if (!(lhs.public_inputs == rhs.public_inputs)) {
6082 return false;
6083 }
6084 if (!(lhs.key_hash == rhs.key_hash)) {
6085 return false;
6086 }
6087 if (!(lhs.proof_type == rhs.proof_type)) {
6088 return false;
6089 }
6090 if (!(lhs.predicate == rhs.predicate)) {
6091 return false;
6092 }
6093 return true;
6094}
6095
6096} // end of namespace Acir
6097
6098template <>
6099template <typename Serializer>
6101 const Acir::BlackBoxFuncCall::RecursiveAggregation& obj, Serializer& serializer)
6102{
6103 serde::Serializable<decltype(obj.verification_key)>::serialize(obj.verification_key, serializer);
6104 serde::Serializable<decltype(obj.proof)>::serialize(obj.proof, serializer);
6105 serde::Serializable<decltype(obj.public_inputs)>::serialize(obj.public_inputs, serializer);
6106 serde::Serializable<decltype(obj.key_hash)>::serialize(obj.key_hash, serializer);
6107 serde::Serializable<decltype(obj.proof_type)>::serialize(obj.proof_type, serializer);
6108 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
6109}
6110
6111template <>
6112template <typename Deserializer>
6114 Acir::BlackBoxFuncCall::RecursiveAggregation>::deserialize(Deserializer& deserializer)
6115{
6117 obj.verification_key = serde::Deserializable<decltype(obj.verification_key)>::deserialize(deserializer);
6118 obj.proof = serde::Deserializable<decltype(obj.proof)>::deserialize(deserializer);
6119 obj.public_inputs = serde::Deserializable<decltype(obj.public_inputs)>::deserialize(deserializer);
6120 obj.key_hash = serde::Deserializable<decltype(obj.key_hash)>::deserialize(deserializer);
6121 obj.proof_type = serde::Deserializable<decltype(obj.proof_type)>::deserialize(deserializer);
6122 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
6123 return obj;
6124}
6125
6126namespace Acir {
6127
6130{
6131 if (!(lhs.inputs == rhs.inputs)) {
6132 return false;
6133 }
6134 if (!(lhs.outputs == rhs.outputs)) {
6135 return false;
6136 }
6137 return true;
6138}
6139
6140} // end of namespace Acir
6141
6142template <>
6143template <typename Serializer>
6145 const Acir::BlackBoxFuncCall::Poseidon2Permutation& obj, Serializer& serializer)
6146{
6147 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
6148 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
6149}
6150
6151template <>
6152template <typename Deserializer>
6154 Acir::BlackBoxFuncCall::Poseidon2Permutation>::deserialize(Deserializer& deserializer)
6155{
6157 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
6158 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
6159 return obj;
6160}
6161
6162namespace Acir {
6163
6165{
6166 if (!(lhs.inputs == rhs.inputs)) {
6167 return false;
6168 }
6169 if (!(lhs.hash_values == rhs.hash_values)) {
6170 return false;
6171 }
6172 if (!(lhs.outputs == rhs.outputs)) {
6173 return false;
6174 }
6175 return true;
6176}
6177
6178} // end of namespace Acir
6179
6180template <>
6181template <typename Serializer>
6183 const Acir::BlackBoxFuncCall::Sha256Compression& obj, Serializer& serializer)
6184{
6185 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
6186 serde::Serializable<decltype(obj.hash_values)>::serialize(obj.hash_values, serializer);
6187 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
6188}
6189
6190template <>
6191template <typename Deserializer>
6193 Deserializer& deserializer)
6194{
6196 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
6197 obj.hash_values = serde::Deserializable<decltype(obj.hash_values)>::deserialize(deserializer);
6198 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
6199 return obj;
6200}
6201
6202namespace Acir {
6203
6204inline bool operator==(const BlackBoxOp& lhs, const BlackBoxOp& rhs)
6205{
6206 if (!(lhs.value == rhs.value)) {
6207 return false;
6208 }
6209 return true;
6210}
6211
6212} // end of namespace Acir
6213
6214template <>
6215template <typename Serializer>
6217{
6218 serializer.increase_container_depth();
6219 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6220 serializer.decrease_container_depth();
6221}
6222
6223template <>
6224template <typename Deserializer>
6226{
6227 deserializer.increase_container_depth();
6228 Acir::BlackBoxOp obj;
6229 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6230 deserializer.decrease_container_depth();
6231 return obj;
6232}
6233
6234namespace Acir {
6235
6237{
6238 if (!(lhs.inputs == rhs.inputs)) {
6239 return false;
6240 }
6241 if (!(lhs.iv == rhs.iv)) {
6242 return false;
6243 }
6244 if (!(lhs.key == rhs.key)) {
6245 return false;
6246 }
6247 if (!(lhs.outputs == rhs.outputs)) {
6248 return false;
6249 }
6250 return true;
6251}
6252
6253} // end of namespace Acir
6254
6255template <>
6256template <typename Serializer>
6258 Serializer& serializer)
6259{
6260 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
6261 serde::Serializable<decltype(obj.iv)>::serialize(obj.iv, serializer);
6262 serde::Serializable<decltype(obj.key)>::serialize(obj.key, serializer);
6263 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
6264}
6265
6266template <>
6267template <typename Deserializer>
6269 Deserializer& deserializer)
6270{
6272 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
6273 obj.iv = serde::Deserializable<decltype(obj.iv)>::deserialize(deserializer);
6274 obj.key = serde::Deserializable<decltype(obj.key)>::deserialize(deserializer);
6275 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
6276 return obj;
6277}
6278
6279namespace Acir {
6280
6281inline bool operator==(const BlackBoxOp::Blake2s& lhs, const BlackBoxOp::Blake2s& rhs)
6282{
6283 if (!(lhs.message == rhs.message)) {
6284 return false;
6285 }
6286 if (!(lhs.output == rhs.output)) {
6287 return false;
6288 }
6289 return true;
6290}
6291
6292} // end of namespace Acir
6293
6294template <>
6295template <typename Serializer>
6297 Serializer& serializer)
6298{
6299 serde::Serializable<decltype(obj.message)>::serialize(obj.message, serializer);
6300 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
6301}
6302
6303template <>
6304template <typename Deserializer>
6306{
6308 obj.message = serde::Deserializable<decltype(obj.message)>::deserialize(deserializer);
6309 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
6310 return obj;
6311}
6312
6313namespace Acir {
6314
6315inline bool operator==(const BlackBoxOp::Blake3& lhs, const BlackBoxOp::Blake3& rhs)
6316{
6317 if (!(lhs.message == rhs.message)) {
6318 return false;
6319 }
6320 if (!(lhs.output == rhs.output)) {
6321 return false;
6322 }
6323 return true;
6324}
6325
6326} // end of namespace Acir
6327
6328template <>
6329template <typename Serializer>
6331 Serializer& serializer)
6332{
6333 serde::Serializable<decltype(obj.message)>::serialize(obj.message, serializer);
6334 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
6335}
6336
6337template <>
6338template <typename Deserializer>
6340{
6342 obj.message = serde::Deserializable<decltype(obj.message)>::deserialize(deserializer);
6343 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
6344 return obj;
6345}
6346
6347namespace Acir {
6348
6350{
6351 if (!(lhs.input == rhs.input)) {
6352 return false;
6353 }
6354 if (!(lhs.output == rhs.output)) {
6355 return false;
6356 }
6357 return true;
6358}
6359
6360} // end of namespace Acir
6361
6362template <>
6363template <typename Serializer>
6365 Serializer& serializer)
6366{
6367 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
6368 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
6369}
6370
6371template <>
6372template <typename Deserializer>
6374 Deserializer& deserializer)
6375{
6377 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
6378 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
6379 return obj;
6380}
6381
6382namespace Acir {
6383
6385{
6386 if (!(lhs.hashed_msg == rhs.hashed_msg)) {
6387 return false;
6388 }
6389 if (!(lhs.public_key_x == rhs.public_key_x)) {
6390 return false;
6391 }
6392 if (!(lhs.public_key_y == rhs.public_key_y)) {
6393 return false;
6394 }
6395 if (!(lhs.signature == rhs.signature)) {
6396 return false;
6397 }
6398 if (!(lhs.result == rhs.result)) {
6399 return false;
6400 }
6401 return true;
6402}
6403
6404} // end of namespace Acir
6405
6406template <>
6407template <typename Serializer>
6409 Serializer& serializer)
6410{
6411 serde::Serializable<decltype(obj.hashed_msg)>::serialize(obj.hashed_msg, serializer);
6412 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
6413 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
6414 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
6415 serde::Serializable<decltype(obj.result)>::serialize(obj.result, serializer);
6416}
6417
6418template <>
6419template <typename Deserializer>
6421 Deserializer& deserializer)
6422{
6424 obj.hashed_msg = serde::Deserializable<decltype(obj.hashed_msg)>::deserialize(deserializer);
6425 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
6426 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
6427 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
6428 obj.result = serde::Deserializable<decltype(obj.result)>::deserialize(deserializer);
6429 return obj;
6430}
6431
6432namespace Acir {
6433
6435{
6436 if (!(lhs.hashed_msg == rhs.hashed_msg)) {
6437 return false;
6438 }
6439 if (!(lhs.public_key_x == rhs.public_key_x)) {
6440 return false;
6441 }
6442 if (!(lhs.public_key_y == rhs.public_key_y)) {
6443 return false;
6444 }
6445 if (!(lhs.signature == rhs.signature)) {
6446 return false;
6447 }
6448 if (!(lhs.result == rhs.result)) {
6449 return false;
6450 }
6451 return true;
6452}
6453
6454} // end of namespace Acir
6455
6456template <>
6457template <typename Serializer>
6459 Serializer& serializer)
6460{
6461 serde::Serializable<decltype(obj.hashed_msg)>::serialize(obj.hashed_msg, serializer);
6462 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
6463 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
6464 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
6465 serde::Serializable<decltype(obj.result)>::serialize(obj.result, serializer);
6466}
6467
6468template <>
6469template <typename Deserializer>
6471 Deserializer& deserializer)
6472{
6474 obj.hashed_msg = serde::Deserializable<decltype(obj.hashed_msg)>::deserialize(deserializer);
6475 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
6476 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
6477 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
6478 obj.result = serde::Deserializable<decltype(obj.result)>::deserialize(deserializer);
6479 return obj;
6480}
6481
6482namespace Acir {
6483
6485{
6486 if (!(lhs.points == rhs.points)) {
6487 return false;
6488 }
6489 if (!(lhs.scalars == rhs.scalars)) {
6490 return false;
6491 }
6492 if (!(lhs.outputs == rhs.outputs)) {
6493 return false;
6494 }
6495 return true;
6496}
6497
6498} // end of namespace Acir
6499
6500template <>
6501template <typename Serializer>
6503 Serializer& serializer)
6504{
6505 serde::Serializable<decltype(obj.points)>::serialize(obj.points, serializer);
6506 serde::Serializable<decltype(obj.scalars)>::serialize(obj.scalars, serializer);
6507 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
6508}
6509
6510template <>
6511template <typename Deserializer>
6513 Deserializer& deserializer)
6514{
6516 obj.points = serde::Deserializable<decltype(obj.points)>::deserialize(deserializer);
6517 obj.scalars = serde::Deserializable<decltype(obj.scalars)>::deserialize(deserializer);
6518 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
6519 return obj;
6520}
6521
6522namespace Acir {
6523
6525{
6526 if (!(lhs.input1_x == rhs.input1_x)) {
6527 return false;
6528 }
6529 if (!(lhs.input1_y == rhs.input1_y)) {
6530 return false;
6531 }
6532 if (!(lhs.input1_infinite == rhs.input1_infinite)) {
6533 return false;
6534 }
6535 if (!(lhs.input2_x == rhs.input2_x)) {
6536 return false;
6537 }
6538 if (!(lhs.input2_y == rhs.input2_y)) {
6539 return false;
6540 }
6541 if (!(lhs.input2_infinite == rhs.input2_infinite)) {
6542 return false;
6543 }
6544 if (!(lhs.result == rhs.result)) {
6545 return false;
6546 }
6547 return true;
6548}
6549
6550} // end of namespace Acir
6551
6552template <>
6553template <typename Serializer>
6555 Serializer& serializer)
6556{
6557 serde::Serializable<decltype(obj.input1_x)>::serialize(obj.input1_x, serializer);
6558 serde::Serializable<decltype(obj.input1_y)>::serialize(obj.input1_y, serializer);
6559 serde::Serializable<decltype(obj.input1_infinite)>::serialize(obj.input1_infinite, serializer);
6560 serde::Serializable<decltype(obj.input2_x)>::serialize(obj.input2_x, serializer);
6561 serde::Serializable<decltype(obj.input2_y)>::serialize(obj.input2_y, serializer);
6562 serde::Serializable<decltype(obj.input2_infinite)>::serialize(obj.input2_infinite, serializer);
6563 serde::Serializable<decltype(obj.result)>::serialize(obj.result, serializer);
6564}
6565
6566template <>
6567template <typename Deserializer>
6569 Deserializer& deserializer)
6570{
6572 obj.input1_x = serde::Deserializable<decltype(obj.input1_x)>::deserialize(deserializer);
6573 obj.input1_y = serde::Deserializable<decltype(obj.input1_y)>::deserialize(deserializer);
6574 obj.input1_infinite = serde::Deserializable<decltype(obj.input1_infinite)>::deserialize(deserializer);
6575 obj.input2_x = serde::Deserializable<decltype(obj.input2_x)>::deserialize(deserializer);
6576 obj.input2_y = serde::Deserializable<decltype(obj.input2_y)>::deserialize(deserializer);
6577 obj.input2_infinite = serde::Deserializable<decltype(obj.input2_infinite)>::deserialize(deserializer);
6578 obj.result = serde::Deserializable<decltype(obj.result)>::deserialize(deserializer);
6579 return obj;
6580}
6581
6582namespace Acir {
6583
6585{
6586 if (!(lhs.message == rhs.message)) {
6587 return false;
6588 }
6589 if (!(lhs.output == rhs.output)) {
6590 return false;
6591 }
6592 return true;
6593}
6594
6595} // end of namespace Acir
6596
6597template <>
6598template <typename Serializer>
6600 const Acir::BlackBoxOp::Poseidon2Permutation& obj, Serializer& serializer)
6601{
6602 serde::Serializable<decltype(obj.message)>::serialize(obj.message, serializer);
6603 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
6604}
6605
6606template <>
6607template <typename Deserializer>
6609 Deserializer& deserializer)
6610{
6612 obj.message = serde::Deserializable<decltype(obj.message)>::deserialize(deserializer);
6613 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
6614 return obj;
6615}
6616
6617namespace Acir {
6618
6620{
6621 if (!(lhs.input == rhs.input)) {
6622 return false;
6623 }
6624 if (!(lhs.hash_values == rhs.hash_values)) {
6625 return false;
6626 }
6627 if (!(lhs.output == rhs.output)) {
6628 return false;
6629 }
6630 return true;
6631}
6632
6633} // end of namespace Acir
6634
6635template <>
6636template <typename Serializer>
6638 Serializer& serializer)
6639{
6640 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
6641 serde::Serializable<decltype(obj.hash_values)>::serialize(obj.hash_values, serializer);
6642 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
6643}
6644
6645template <>
6646template <typename Deserializer>
6648 Deserializer& deserializer)
6649{
6651 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
6652 obj.hash_values = serde::Deserializable<decltype(obj.hash_values)>::deserialize(deserializer);
6653 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
6654 return obj;
6655}
6656
6657namespace Acir {
6658
6659inline bool operator==(const BlackBoxOp::ToRadix& lhs, const BlackBoxOp::ToRadix& rhs)
6660{
6661 if (!(lhs.input == rhs.input)) {
6662 return false;
6663 }
6664 if (!(lhs.radix == rhs.radix)) {
6665 return false;
6666 }
6667 if (!(lhs.output_pointer == rhs.output_pointer)) {
6668 return false;
6669 }
6670 if (!(lhs.num_limbs == rhs.num_limbs)) {
6671 return false;
6672 }
6673 if (!(lhs.output_bits == rhs.output_bits)) {
6674 return false;
6675 }
6676 return true;
6677}
6678
6679} // end of namespace Acir
6680
6681template <>
6682template <typename Serializer>
6684 Serializer& serializer)
6685{
6686 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
6687 serde::Serializable<decltype(obj.radix)>::serialize(obj.radix, serializer);
6688 serde::Serializable<decltype(obj.output_pointer)>::serialize(obj.output_pointer, serializer);
6689 serde::Serializable<decltype(obj.num_limbs)>::serialize(obj.num_limbs, serializer);
6690 serde::Serializable<decltype(obj.output_bits)>::serialize(obj.output_bits, serializer);
6691}
6692
6693template <>
6694template <typename Deserializer>
6696{
6698 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
6699 obj.radix = serde::Deserializable<decltype(obj.radix)>::deserialize(deserializer);
6700 obj.output_pointer = serde::Deserializable<decltype(obj.output_pointer)>::deserialize(deserializer);
6701 obj.num_limbs = serde::Deserializable<decltype(obj.num_limbs)>::deserialize(deserializer);
6702 obj.output_bits = serde::Deserializable<decltype(obj.output_bits)>::deserialize(deserializer);
6703 return obj;
6704}
6705
6706namespace Acir {
6707
6708inline bool operator==(const BlockId& lhs, const BlockId& rhs)
6709{
6710 if (!(lhs.value == rhs.value)) {
6711 return false;
6712 }
6713 return true;
6714}
6715
6716} // end of namespace Acir
6717
6718template <>
6719template <typename Serializer>
6720void serde::Serializable<Acir::BlockId>::serialize(const Acir::BlockId& obj, Serializer& serializer)
6721{
6722 serializer.increase_container_depth();
6723 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6724 serializer.decrease_container_depth();
6725}
6726
6727template <>
6728template <typename Deserializer>
6730{
6731 deserializer.increase_container_depth();
6732 Acir::BlockId obj;
6733 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6734 deserializer.decrease_container_depth();
6735 return obj;
6736}
6737
6738namespace Acir {
6739
6740inline bool operator==(const BlockType& lhs, const BlockType& rhs)
6741{
6742 if (!(lhs.value == rhs.value)) {
6743 return false;
6744 }
6745 return true;
6746}
6747
6748} // end of namespace Acir
6749
6750template <>
6751template <typename Serializer>
6753{
6754 serializer.increase_container_depth();
6755 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6756 serializer.decrease_container_depth();
6757}
6758
6759template <>
6760template <typename Deserializer>
6762{
6763 deserializer.increase_container_depth();
6764 Acir::BlockType obj;
6765 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6766 deserializer.decrease_container_depth();
6767 return obj;
6768}
6769
6770namespace Acir {
6771
6772inline bool operator==(const BlockType::Memory& lhs, const BlockType::Memory& rhs)
6773{
6774 return true;
6775}
6776
6777} // end of namespace Acir
6778
6779template <>
6780template <typename Serializer>
6783
6784template <>
6785template <typename Deserializer>
6791
6792namespace Acir {
6793
6794inline bool operator==(const BlockType::CallData& lhs, const BlockType::CallData& rhs)
6795{
6796 if (!(lhs.value == rhs.value)) {
6797 return false;
6798 }
6799 return true;
6800}
6801
6802} // end of namespace Acir
6803
6804template <>
6805template <typename Serializer>
6807 Serializer& serializer)
6808{
6809 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6810}
6811
6812template <>
6813template <typename Deserializer>
6815{
6817 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6818 return obj;
6819}
6820
6821namespace Acir {
6822
6823inline bool operator==(const BlockType::ReturnData& lhs, const BlockType::ReturnData& rhs)
6824{
6825 return true;
6826}
6827
6828} // end of namespace Acir
6829
6830template <>
6831template <typename Serializer>
6835
6836template <>
6837template <typename Deserializer>
6843
6844namespace Acir {
6845
6846inline bool operator==(const BrilligBytecode& lhs, const BrilligBytecode& rhs)
6847{
6848 if (!(lhs.function_name == rhs.function_name)) {
6849 return false;
6850 }
6851 if (!(lhs.bytecode == rhs.bytecode)) {
6852 return false;
6853 }
6854 return true;
6855}
6856
6857} // end of namespace Acir
6858
6859template <>
6860template <typename Serializer>
6862{
6863 serializer.increase_container_depth();
6864 serde::Serializable<decltype(obj.function_name)>::serialize(obj.function_name, serializer);
6865 serde::Serializable<decltype(obj.bytecode)>::serialize(obj.bytecode, serializer);
6866 serializer.decrease_container_depth();
6867}
6868
6869template <>
6870template <typename Deserializer>
6872{
6873 deserializer.increase_container_depth();
6875 obj.function_name = serde::Deserializable<decltype(obj.function_name)>::deserialize(deserializer);
6876 obj.bytecode = serde::Deserializable<decltype(obj.bytecode)>::deserialize(deserializer);
6877 deserializer.decrease_container_depth();
6878 return obj;
6879}
6880
6881namespace Acir {
6882
6883inline bool operator==(const BrilligInputs& lhs, const BrilligInputs& rhs)
6884{
6885 if (!(lhs.value == rhs.value)) {
6886 return false;
6887 }
6888 return true;
6889}
6890
6891} // end of namespace Acir
6892
6893template <>
6894template <typename Serializer>
6896{
6897 serializer.increase_container_depth();
6898 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6899 serializer.decrease_container_depth();
6900}
6901
6902template <>
6903template <typename Deserializer>
6905{
6906 deserializer.increase_container_depth();
6908 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6909 deserializer.decrease_container_depth();
6910 return obj;
6911}
6912
6913namespace Acir {
6914
6915inline bool operator==(const BrilligInputs::Single& lhs, const BrilligInputs::Single& rhs)
6916{
6917 if (!(lhs.value == rhs.value)) {
6918 return false;
6919 }
6920 return true;
6921}
6922
6923} // end of namespace Acir
6924
6925template <>
6926template <typename Serializer>
6928 Serializer& serializer)
6929{
6930 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6931}
6932
6933template <>
6934template <typename Deserializer>
6936{
6938 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6939 return obj;
6940}
6941
6942namespace Acir {
6943
6944inline bool operator==(const BrilligInputs::Array& lhs, const BrilligInputs::Array& rhs)
6945{
6946 if (!(lhs.value == rhs.value)) {
6947 return false;
6948 }
6949 return true;
6950}
6951
6952} // end of namespace Acir
6953
6954template <>
6955template <typename Serializer>
6957 Serializer& serializer)
6958{
6959 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6960}
6961
6962template <>
6963template <typename Deserializer>
6965{
6967 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6968 return obj;
6969}
6970
6971namespace Acir {
6972
6974{
6975 if (!(lhs.value == rhs.value)) {
6976 return false;
6977 }
6978 return true;
6979}
6980
6981} // end of namespace Acir
6982
6983template <>
6984template <typename Serializer>
6986 Serializer& serializer)
6987{
6988 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
6989}
6990
6991template <>
6992template <typename Deserializer>
6994 Deserializer& deserializer)
6995{
6997 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
6998 return obj;
6999}
7000
7001namespace Acir {
7002
7003inline bool operator==(const BrilligOpcode& lhs, const BrilligOpcode& rhs)
7004{
7005 if (!(lhs.value == rhs.value)) {
7006 return false;
7007 }
7008 return true;
7009}
7010
7011} // end of namespace Acir
7012
7013template <>
7014template <typename Serializer>
7016{
7017 serializer.increase_container_depth();
7018 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7019 serializer.decrease_container_depth();
7020}
7021
7022template <>
7023template <typename Deserializer>
7025{
7026 deserializer.increase_container_depth();
7028 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7029 deserializer.decrease_container_depth();
7030 return obj;
7031}
7032
7033namespace Acir {
7034
7036{
7037 if (!(lhs.destination == rhs.destination)) {
7038 return false;
7039 }
7040 if (!(lhs.op == rhs.op)) {
7041 return false;
7042 }
7043 if (!(lhs.lhs == rhs.lhs)) {
7044 return false;
7045 }
7046 if (!(lhs.rhs == rhs.rhs)) {
7047 return false;
7048 }
7049 return true;
7050}
7051
7052} // end of namespace Acir
7053
7054template <>
7055template <typename Serializer>
7057 Serializer& serializer)
7058{
7059 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7060 serde::Serializable<decltype(obj.op)>::serialize(obj.op, serializer);
7061 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
7062 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
7063}
7064
7065template <>
7066template <typename Deserializer>
7068 Deserializer& deserializer)
7069{
7071 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7072 obj.op = serde::Deserializable<decltype(obj.op)>::deserialize(deserializer);
7073 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
7074 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
7075 return obj;
7076}
7077
7078namespace Acir {
7079
7081{
7082 if (!(lhs.destination == rhs.destination)) {
7083 return false;
7084 }
7085 if (!(lhs.op == rhs.op)) {
7086 return false;
7087 }
7088 if (!(lhs.bit_size == rhs.bit_size)) {
7089 return false;
7090 }
7091 if (!(lhs.lhs == rhs.lhs)) {
7092 return false;
7093 }
7094 if (!(lhs.rhs == rhs.rhs)) {
7095 return false;
7096 }
7097 return true;
7098}
7099
7100} // end of namespace Acir
7101
7102template <>
7103template <typename Serializer>
7105 Serializer& serializer)
7106{
7107 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7108 serde::Serializable<decltype(obj.op)>::serialize(obj.op, serializer);
7109 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
7110 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
7111 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
7112}
7113
7114template <>
7115template <typename Deserializer>
7117 Deserializer& deserializer)
7118{
7120 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7121 obj.op = serde::Deserializable<decltype(obj.op)>::deserialize(deserializer);
7122 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
7123 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
7124 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
7125 return obj;
7126}
7127
7128namespace Acir {
7129
7130inline bool operator==(const BrilligOpcode::Not& lhs, const BrilligOpcode::Not& rhs)
7131{
7132 if (!(lhs.destination == rhs.destination)) {
7133 return false;
7134 }
7135 if (!(lhs.source == rhs.source)) {
7136 return false;
7137 }
7138 if (!(lhs.bit_size == rhs.bit_size)) {
7139 return false;
7140 }
7141 return true;
7142}
7143
7144} // end of namespace Acir
7145
7146template <>
7147template <typename Serializer>
7149 Serializer& serializer)
7150{
7151 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7152 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
7153 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
7154}
7155
7156template <>
7157template <typename Deserializer>
7159{
7161 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7162 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
7163 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
7164 return obj;
7165}
7166
7167namespace Acir {
7168
7169inline bool operator==(const BrilligOpcode::Cast& lhs, const BrilligOpcode::Cast& rhs)
7170{
7171 if (!(lhs.destination == rhs.destination)) {
7172 return false;
7173 }
7174 if (!(lhs.source == rhs.source)) {
7175 return false;
7176 }
7177 if (!(lhs.bit_size == rhs.bit_size)) {
7178 return false;
7179 }
7180 return true;
7181}
7182
7183} // end of namespace Acir
7184
7185template <>
7186template <typename Serializer>
7188 Serializer& serializer)
7189{
7190 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7191 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
7192 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
7193}
7194
7195template <>
7196template <typename Deserializer>
7198{
7200 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7201 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
7202 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
7203 return obj;
7204}
7205
7206namespace Acir {
7207
7208inline bool operator==(const BrilligOpcode::JumpIf& lhs, const BrilligOpcode::JumpIf& rhs)
7209{
7210 if (!(lhs.condition == rhs.condition)) {
7211 return false;
7212 }
7213 if (!(lhs.location == rhs.location)) {
7214 return false;
7215 }
7216 return true;
7217}
7218
7219} // end of namespace Acir
7220
7221template <>
7222template <typename Serializer>
7224 Serializer& serializer)
7225{
7226 serde::Serializable<decltype(obj.condition)>::serialize(obj.condition, serializer);
7227 serde::Serializable<decltype(obj.location)>::serialize(obj.location, serializer);
7228}
7229
7230template <>
7231template <typename Deserializer>
7233{
7235 obj.condition = serde::Deserializable<decltype(obj.condition)>::deserialize(deserializer);
7236 obj.location = serde::Deserializable<decltype(obj.location)>::deserialize(deserializer);
7237 return obj;
7238}
7239
7240namespace Acir {
7241
7242inline bool operator==(const BrilligOpcode::Jump& lhs, const BrilligOpcode::Jump& rhs)
7243{
7244 if (!(lhs.location == rhs.location)) {
7245 return false;
7246 }
7247 return true;
7248}
7249
7250} // end of namespace Acir
7251
7252template <>
7253template <typename Serializer>
7255 Serializer& serializer)
7256{
7257 serde::Serializable<decltype(obj.location)>::serialize(obj.location, serializer);
7258}
7259
7260template <>
7261template <typename Deserializer>
7263{
7265 obj.location = serde::Deserializable<decltype(obj.location)>::deserialize(deserializer);
7266 return obj;
7267}
7268
7269namespace Acir {
7270
7272{
7273 if (!(lhs.destination_address == rhs.destination_address)) {
7274 return false;
7275 }
7276 if (!(lhs.size_address == rhs.size_address)) {
7277 return false;
7278 }
7279 if (!(lhs.offset_address == rhs.offset_address)) {
7280 return false;
7281 }
7282 return true;
7283}
7284
7285} // end of namespace Acir
7286
7287template <>
7288template <typename Serializer>
7290 Serializer& serializer)
7291{
7292 serde::Serializable<decltype(obj.destination_address)>::serialize(obj.destination_address, serializer);
7293 serde::Serializable<decltype(obj.size_address)>::serialize(obj.size_address, serializer);
7294 serde::Serializable<decltype(obj.offset_address)>::serialize(obj.offset_address, serializer);
7295}
7296
7297template <>
7298template <typename Deserializer>
7300 Deserializer& deserializer)
7301{
7303 obj.destination_address = serde::Deserializable<decltype(obj.destination_address)>::deserialize(deserializer);
7304 obj.size_address = serde::Deserializable<decltype(obj.size_address)>::deserialize(deserializer);
7305 obj.offset_address = serde::Deserializable<decltype(obj.offset_address)>::deserialize(deserializer);
7306 return obj;
7307}
7308
7309namespace Acir {
7310
7311inline bool operator==(const BrilligOpcode::Call& lhs, const BrilligOpcode::Call& rhs)
7312{
7313 if (!(lhs.location == rhs.location)) {
7314 return false;
7315 }
7316 return true;
7317}
7318
7319} // end of namespace Acir
7320
7321template <>
7322template <typename Serializer>
7324 Serializer& serializer)
7325{
7326 serde::Serializable<decltype(obj.location)>::serialize(obj.location, serializer);
7327}
7328
7329template <>
7330template <typename Deserializer>
7332{
7334 obj.location = serde::Deserializable<decltype(obj.location)>::deserialize(deserializer);
7335 return obj;
7336}
7337
7338namespace Acir {
7339
7340inline bool operator==(const BrilligOpcode::Const& lhs, const BrilligOpcode::Const& rhs)
7341{
7342 if (!(lhs.destination == rhs.destination)) {
7343 return false;
7344 }
7345 if (!(lhs.bit_size == rhs.bit_size)) {
7346 return false;
7347 }
7348 if (!(lhs.value == rhs.value)) {
7349 return false;
7350 }
7351 return true;
7352}
7353
7354} // end of namespace Acir
7355
7356template <>
7357template <typename Serializer>
7359 Serializer& serializer)
7360{
7361 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7362 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
7363 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7364}
7365
7366template <>
7367template <typename Deserializer>
7369{
7371 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7372 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
7373 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7374 return obj;
7375}
7376
7377namespace Acir {
7378
7380{
7381 if (!(lhs.destination_pointer == rhs.destination_pointer)) {
7382 return false;
7383 }
7384 if (!(lhs.bit_size == rhs.bit_size)) {
7385 return false;
7386 }
7387 if (!(lhs.value == rhs.value)) {
7388 return false;
7389 }
7390 return true;
7391}
7392
7393} // end of namespace Acir
7394
7395template <>
7396template <typename Serializer>
7398 Serializer& serializer)
7399{
7400 serde::Serializable<decltype(obj.destination_pointer)>::serialize(obj.destination_pointer, serializer);
7401 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
7402 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7403}
7404
7405template <>
7406template <typename Deserializer>
7408 Deserializer& deserializer)
7409{
7411 obj.destination_pointer = serde::Deserializable<decltype(obj.destination_pointer)>::deserialize(deserializer);
7412 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
7413 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7414 return obj;
7415}
7416
7417namespace Acir {
7418
7419inline bool operator==(const BrilligOpcode::Return& lhs, const BrilligOpcode::Return& rhs)
7420{
7421 return true;
7422}
7423
7424} // end of namespace Acir
7425
7426template <>
7427template <typename Serializer>
7431
7432template <>
7433template <typename Deserializer>
7439
7440namespace Acir {
7441
7443{
7444 if (!(lhs.function == rhs.function)) {
7445 return false;
7446 }
7447 if (!(lhs.destinations == rhs.destinations)) {
7448 return false;
7449 }
7450 if (!(lhs.destination_value_types == rhs.destination_value_types)) {
7451 return false;
7452 }
7453 if (!(lhs.inputs == rhs.inputs)) {
7454 return false;
7455 }
7456 if (!(lhs.input_value_types == rhs.input_value_types)) {
7457 return false;
7458 }
7459 return true;
7460}
7461
7462} // end of namespace Acir
7463
7464template <>
7465template <typename Serializer>
7467 Serializer& serializer)
7468{
7469 serde::Serializable<decltype(obj.function)>::serialize(obj.function, serializer);
7470 serde::Serializable<decltype(obj.destinations)>::serialize(obj.destinations, serializer);
7471 serde::Serializable<decltype(obj.destination_value_types)>::serialize(obj.destination_value_types, serializer);
7472 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
7473 serde::Serializable<decltype(obj.input_value_types)>::serialize(obj.input_value_types, serializer);
7474}
7475
7476template <>
7477template <typename Deserializer>
7479 Deserializer& deserializer)
7480{
7482 obj.function = serde::Deserializable<decltype(obj.function)>::deserialize(deserializer);
7483 obj.destinations = serde::Deserializable<decltype(obj.destinations)>::deserialize(deserializer);
7485 serde::Deserializable<decltype(obj.destination_value_types)>::deserialize(deserializer);
7486 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
7487 obj.input_value_types = serde::Deserializable<decltype(obj.input_value_types)>::deserialize(deserializer);
7488 return obj;
7489}
7490
7491namespace Acir {
7492
7493inline bool operator==(const BrilligOpcode::Mov& lhs, const BrilligOpcode::Mov& rhs)
7494{
7495 if (!(lhs.destination == rhs.destination)) {
7496 return false;
7497 }
7498 if (!(lhs.source == rhs.source)) {
7499 return false;
7500 }
7501 return true;
7502}
7503
7504} // end of namespace Acir
7505
7506template <>
7507template <typename Serializer>
7509 Serializer& serializer)
7510{
7511 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7512 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
7513}
7514
7515template <>
7516template <typename Deserializer>
7518{
7520 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7521 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
7522 return obj;
7523}
7524
7525namespace Acir {
7526
7528{
7529 if (!(lhs.destination == rhs.destination)) {
7530 return false;
7531 }
7532 if (!(lhs.source_a == rhs.source_a)) {
7533 return false;
7534 }
7535 if (!(lhs.source_b == rhs.source_b)) {
7536 return false;
7537 }
7538 if (!(lhs.condition == rhs.condition)) {
7539 return false;
7540 }
7541 return true;
7542}
7543
7544} // end of namespace Acir
7545
7546template <>
7547template <typename Serializer>
7549 Serializer& serializer)
7550{
7551 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7552 serde::Serializable<decltype(obj.source_a)>::serialize(obj.source_a, serializer);
7553 serde::Serializable<decltype(obj.source_b)>::serialize(obj.source_b, serializer);
7554 serde::Serializable<decltype(obj.condition)>::serialize(obj.condition, serializer);
7555}
7556
7557template <>
7558template <typename Deserializer>
7560 Deserializer& deserializer)
7561{
7563 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7564 obj.source_a = serde::Deserializable<decltype(obj.source_a)>::deserialize(deserializer);
7565 obj.source_b = serde::Deserializable<decltype(obj.source_b)>::deserialize(deserializer);
7566 obj.condition = serde::Deserializable<decltype(obj.condition)>::deserialize(deserializer);
7567 return obj;
7568}
7569
7570namespace Acir {
7571
7572inline bool operator==(const BrilligOpcode::Load& lhs, const BrilligOpcode::Load& rhs)
7573{
7574 if (!(lhs.destination == rhs.destination)) {
7575 return false;
7576 }
7577 if (!(lhs.source_pointer == rhs.source_pointer)) {
7578 return false;
7579 }
7580 return true;
7581}
7582
7583} // end of namespace Acir
7584
7585template <>
7586template <typename Serializer>
7588 Serializer& serializer)
7589{
7590 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
7591 serde::Serializable<decltype(obj.source_pointer)>::serialize(obj.source_pointer, serializer);
7592}
7593
7594template <>
7595template <typename Deserializer>
7597{
7599 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
7600 obj.source_pointer = serde::Deserializable<decltype(obj.source_pointer)>::deserialize(deserializer);
7601 return obj;
7602}
7603
7604namespace Acir {
7605
7606inline bool operator==(const BrilligOpcode::Store& lhs, const BrilligOpcode::Store& rhs)
7607{
7608 if (!(lhs.destination_pointer == rhs.destination_pointer)) {
7609 return false;
7610 }
7611 if (!(lhs.source == rhs.source)) {
7612 return false;
7613 }
7614 return true;
7615}
7616
7617} // end of namespace Acir
7618
7619template <>
7620template <typename Serializer>
7622 Serializer& serializer)
7623{
7624 serde::Serializable<decltype(obj.destination_pointer)>::serialize(obj.destination_pointer, serializer);
7625 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
7626}
7627
7628template <>
7629template <typename Deserializer>
7631{
7633 obj.destination_pointer = serde::Deserializable<decltype(obj.destination_pointer)>::deserialize(deserializer);
7634 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
7635 return obj;
7636}
7637
7638namespace Acir {
7639
7641{
7642 if (!(lhs.value == rhs.value)) {
7643 return false;
7644 }
7645 return true;
7646}
7647
7648} // end of namespace Acir
7649
7650template <>
7651template <typename Serializer>
7653 Serializer& serializer)
7654{
7655 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7656}
7657
7658template <>
7659template <typename Deserializer>
7661 Deserializer& deserializer)
7662{
7664 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7665 return obj;
7666}
7667
7668namespace Acir {
7669
7670inline bool operator==(const BrilligOpcode::Trap& lhs, const BrilligOpcode::Trap& rhs)
7671{
7672 if (!(lhs.revert_data == rhs.revert_data)) {
7673 return false;
7674 }
7675 return true;
7676}
7677
7678} // end of namespace Acir
7679
7680template <>
7681template <typename Serializer>
7683 Serializer& serializer)
7684{
7685 serde::Serializable<decltype(obj.revert_data)>::serialize(obj.revert_data, serializer);
7686}
7687
7688template <>
7689template <typename Deserializer>
7691{
7693 obj.revert_data = serde::Deserializable<decltype(obj.revert_data)>::deserialize(deserializer);
7694 return obj;
7695}
7696
7697namespace Acir {
7698
7699inline bool operator==(const BrilligOpcode::Stop& lhs, const BrilligOpcode::Stop& rhs)
7700{
7701 if (!(lhs.return_data == rhs.return_data)) {
7702 return false;
7703 }
7704 return true;
7705}
7706
7707} // end of namespace Acir
7708
7709template <>
7710template <typename Serializer>
7712 Serializer& serializer)
7713{
7714 serde::Serializable<decltype(obj.return_data)>::serialize(obj.return_data, serializer);
7715}
7716
7717template <>
7718template <typename Deserializer>
7720{
7722 obj.return_data = serde::Deserializable<decltype(obj.return_data)>::deserialize(deserializer);
7723 return obj;
7724}
7725
7726namespace Acir {
7727
7728inline bool operator==(const BrilligOutputs& lhs, const BrilligOutputs& rhs)
7729{
7730 if (!(lhs.value == rhs.value)) {
7731 return false;
7732 }
7733 return true;
7734}
7735
7736} // end of namespace Acir
7737
7738template <>
7739template <typename Serializer>
7741{
7742 serializer.increase_container_depth();
7743 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7744 serializer.decrease_container_depth();
7745}
7746
7747template <>
7748template <typename Deserializer>
7750{
7751 deserializer.increase_container_depth();
7753 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7754 deserializer.decrease_container_depth();
7755 return obj;
7756}
7757
7758namespace Acir {
7759
7761{
7762 if (!(lhs.value == rhs.value)) {
7763 return false;
7764 }
7765 return true;
7766}
7767
7768} // end of namespace Acir
7769
7770template <>
7771template <typename Serializer>
7773 Serializer& serializer)
7774{
7775 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7776}
7777
7778template <>
7779template <typename Deserializer>
7781 Deserializer& deserializer)
7782{
7784 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7785 return obj;
7786}
7787
7788namespace Acir {
7789
7790inline bool operator==(const BrilligOutputs::Array& lhs, const BrilligOutputs::Array& rhs)
7791{
7792 if (!(lhs.value == rhs.value)) {
7793 return false;
7794 }
7795 return true;
7796}
7797
7798} // end of namespace Acir
7799
7800template <>
7801template <typename Serializer>
7803 Serializer& serializer)
7804{
7805 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7806}
7807
7808template <>
7809template <typename Deserializer>
7811{
7813 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7814 return obj;
7815}
7816
7817namespace Acir {
7818
7819inline bool operator==(const Circuit& lhs, const Circuit& rhs)
7820{
7821 if (!(lhs.function_name == rhs.function_name)) {
7822 return false;
7823 }
7824 if (!(lhs.current_witness_index == rhs.current_witness_index)) {
7825 return false;
7826 }
7827 if (!(lhs.opcodes == rhs.opcodes)) {
7828 return false;
7829 }
7830 if (!(lhs.private_parameters == rhs.private_parameters)) {
7831 return false;
7832 }
7833 if (!(lhs.public_parameters == rhs.public_parameters)) {
7834 return false;
7835 }
7836 if (!(lhs.return_values == rhs.return_values)) {
7837 return false;
7838 }
7839 if (!(lhs.assert_messages == rhs.assert_messages)) {
7840 return false;
7841 }
7842 return true;
7843}
7844
7845} // end of namespace Acir
7846
7847template <>
7848template <typename Serializer>
7849void serde::Serializable<Acir::Circuit>::serialize(const Acir::Circuit& obj, Serializer& serializer)
7850{
7851 serializer.increase_container_depth();
7852 serde::Serializable<decltype(obj.function_name)>::serialize(obj.function_name, serializer);
7853 serde::Serializable<decltype(obj.current_witness_index)>::serialize(obj.current_witness_index, serializer);
7854 serde::Serializable<decltype(obj.opcodes)>::serialize(obj.opcodes, serializer);
7855 serde::Serializable<decltype(obj.private_parameters)>::serialize(obj.private_parameters, serializer);
7856 serde::Serializable<decltype(obj.public_parameters)>::serialize(obj.public_parameters, serializer);
7857 serde::Serializable<decltype(obj.return_values)>::serialize(obj.return_values, serializer);
7858 serde::Serializable<decltype(obj.assert_messages)>::serialize(obj.assert_messages, serializer);
7859 serializer.decrease_container_depth();
7860}
7861
7862template <>
7863template <typename Deserializer>
7865{
7866 deserializer.increase_container_depth();
7867 Acir::Circuit obj;
7868 obj.function_name = serde::Deserializable<decltype(obj.function_name)>::deserialize(deserializer);
7869 obj.current_witness_index = serde::Deserializable<decltype(obj.current_witness_index)>::deserialize(deserializer);
7870 obj.opcodes = serde::Deserializable<decltype(obj.opcodes)>::deserialize(deserializer);
7871 obj.private_parameters = serde::Deserializable<decltype(obj.private_parameters)>::deserialize(deserializer);
7872 obj.public_parameters = serde::Deserializable<decltype(obj.public_parameters)>::deserialize(deserializer);
7873 obj.return_values = serde::Deserializable<decltype(obj.return_values)>::deserialize(deserializer);
7874 obj.assert_messages = serde::Deserializable<decltype(obj.assert_messages)>::deserialize(deserializer);
7875 deserializer.decrease_container_depth();
7876 return obj;
7877}
7878
7879namespace Acir {
7880
7881inline bool operator==(const Expression& lhs, const Expression& rhs)
7882{
7883 if (!(lhs.mul_terms == rhs.mul_terms)) {
7884 return false;
7885 }
7886 if (!(lhs.linear_combinations == rhs.linear_combinations)) {
7887 return false;
7888 }
7889 if (!(lhs.q_c == rhs.q_c)) {
7890 return false;
7891 }
7892 return true;
7893}
7894
7895} // end of namespace Acir
7896
7897template <>
7898template <typename Serializer>
7900{
7901 serializer.increase_container_depth();
7902 serde::Serializable<decltype(obj.mul_terms)>::serialize(obj.mul_terms, serializer);
7903 serde::Serializable<decltype(obj.linear_combinations)>::serialize(obj.linear_combinations, serializer);
7904 serde::Serializable<decltype(obj.q_c)>::serialize(obj.q_c, serializer);
7905 serializer.decrease_container_depth();
7906}
7907
7908template <>
7909template <typename Deserializer>
7911{
7912 deserializer.increase_container_depth();
7913 Acir::Expression obj;
7914 obj.mul_terms = serde::Deserializable<decltype(obj.mul_terms)>::deserialize(deserializer);
7915 obj.linear_combinations = serde::Deserializable<decltype(obj.linear_combinations)>::deserialize(deserializer);
7916 obj.q_c = serde::Deserializable<decltype(obj.q_c)>::deserialize(deserializer);
7917 deserializer.decrease_container_depth();
7918 return obj;
7919}
7920
7921namespace Acir {
7922
7923inline bool operator==(const ExpressionOrMemory& lhs, const ExpressionOrMemory& rhs)
7924{
7925 if (!(lhs.value == rhs.value)) {
7926 return false;
7927 }
7928 return true;
7929}
7930
7931} // end of namespace Acir
7932
7933template <>
7934template <typename Serializer>
7936 Serializer& serializer)
7937{
7938 serializer.increase_container_depth();
7939 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7940 serializer.decrease_container_depth();
7941}
7942
7943template <>
7944template <typename Deserializer>
7946{
7947 deserializer.increase_container_depth();
7949 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7950 deserializer.decrease_container_depth();
7951 return obj;
7952}
7953
7954namespace Acir {
7955
7957{
7958 if (!(lhs.value == rhs.value)) {
7959 return false;
7960 }
7961 return true;
7962}
7963
7964} // end of namespace Acir
7965
7966template <>
7967template <typename Serializer>
7969 const Acir::ExpressionOrMemory::Expression& obj, Serializer& serializer)
7970{
7971 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7972}
7973
7974template <>
7975template <typename Deserializer>
7977 Deserializer& deserializer)
7978{
7980 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7981 return obj;
7982}
7983
7984namespace Acir {
7985
7987{
7988 if (!(lhs.value == rhs.value)) {
7989 return false;
7990 }
7991 return true;
7992}
7993
7994} // end of namespace Acir
7995
7996template <>
7997template <typename Serializer>
7999 Serializer& serializer)
8000{
8001 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8002}
8003
8004template <>
8005template <typename Deserializer>
8007 Deserializer& deserializer)
8008{
8010 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8011 return obj;
8012}
8013
8014namespace Acir {
8015
8016inline bool operator==(const FunctionInput& lhs, const FunctionInput& rhs)
8017{
8018 if (!(lhs.value == rhs.value)) {
8019 return false;
8020 }
8021 return true;
8022}
8023
8024} // end of namespace Acir
8025
8026template <>
8027template <typename Serializer>
8029{
8030 serializer.increase_container_depth();
8031 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8032 serializer.decrease_container_depth();
8033}
8034
8035template <>
8036template <typename Deserializer>
8038{
8039 deserializer.increase_container_depth();
8041 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8042 deserializer.decrease_container_depth();
8043 return obj;
8044}
8045
8046namespace Acir {
8047
8049{
8050 if (!(lhs.value == rhs.value)) {
8051 return false;
8052 }
8053 return true;
8054}
8055
8056} // end of namespace Acir
8057
8058template <>
8059template <typename Serializer>
8061 Serializer& serializer)
8062{
8063 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8064}
8065
8066template <>
8067template <typename Deserializer>
8069 Deserializer& deserializer)
8070{
8072 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8073 return obj;
8074}
8075
8076namespace Acir {
8077
8079{
8080 if (!(lhs.value == rhs.value)) {
8081 return false;
8082 }
8083 return true;
8084}
8085
8086} // end of namespace Acir
8087
8088template <>
8089template <typename Serializer>
8091 Serializer& serializer)
8092{
8093 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8094}
8095
8096template <>
8097template <typename Deserializer>
8099 Deserializer& deserializer)
8100{
8102 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8103 return obj;
8104}
8105
8106namespace Acir {
8107
8108inline bool operator==(const HeapArray& lhs, const HeapArray& rhs)
8109{
8110 if (!(lhs.pointer == rhs.pointer)) {
8111 return false;
8112 }
8113 if (!(lhs.size == rhs.size)) {
8114 return false;
8115 }
8116 return true;
8117}
8118
8119} // end of namespace Acir
8120
8121template <>
8122template <typename Serializer>
8124{
8125 serializer.increase_container_depth();
8126 serde::Serializable<decltype(obj.pointer)>::serialize(obj.pointer, serializer);
8127 serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
8128 serializer.decrease_container_depth();
8129}
8130
8131template <>
8132template <typename Deserializer>
8134{
8135 deserializer.increase_container_depth();
8136 Acir::HeapArray obj;
8137 obj.pointer = serde::Deserializable<decltype(obj.pointer)>::deserialize(deserializer);
8138 obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
8139 deserializer.decrease_container_depth();
8140 return obj;
8141}
8142
8143namespace Acir {
8144
8145inline bool operator==(const HeapValueType& lhs, const HeapValueType& rhs)
8146{
8147 if (!(lhs.value == rhs.value)) {
8148 return false;
8149 }
8150 return true;
8151}
8152
8153} // end of namespace Acir
8154
8155template <>
8156template <typename Serializer>
8158{
8159 serializer.increase_container_depth();
8160 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8161 serializer.decrease_container_depth();
8162}
8163
8164template <>
8165template <typename Deserializer>
8167{
8168 deserializer.increase_container_depth();
8170 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8171 deserializer.decrease_container_depth();
8172 return obj;
8173}
8174
8175namespace Acir {
8176
8177inline bool operator==(const HeapValueType::Simple& lhs, const HeapValueType::Simple& rhs)
8178{
8179 if (!(lhs.value == rhs.value)) {
8180 return false;
8181 }
8182 return true;
8183}
8184
8185} // end of namespace Acir
8186
8187template <>
8188template <typename Serializer>
8190 Serializer& serializer)
8191{
8192 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8193}
8194
8195template <>
8196template <typename Deserializer>
8198{
8200 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8201 return obj;
8202}
8203
8204namespace Acir {
8205
8206inline bool operator==(const HeapValueType::Array& lhs, const HeapValueType::Array& rhs)
8207{
8208 if (!(lhs.value_types == rhs.value_types)) {
8209 return false;
8210 }
8211 if (!(lhs.size == rhs.size)) {
8212 return false;
8213 }
8214 return true;
8215}
8216
8217} // end of namespace Acir
8218
8219template <>
8220template <typename Serializer>
8222 Serializer& serializer)
8223{
8224 serde::Serializable<decltype(obj.value_types)>::serialize(obj.value_types, serializer);
8225 serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
8226}
8227
8228template <>
8229template <typename Deserializer>
8231{
8233 obj.value_types = serde::Deserializable<decltype(obj.value_types)>::deserialize(deserializer);
8234 obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
8235 return obj;
8236}
8237
8238namespace Acir {
8239
8240inline bool operator==(const HeapValueType::Vector& lhs, const HeapValueType::Vector& rhs)
8241{
8242 if (!(lhs.value_types == rhs.value_types)) {
8243 return false;
8244 }
8245 return true;
8246}
8247
8248} // end of namespace Acir
8249
8250template <>
8251template <typename Serializer>
8253 Serializer& serializer)
8254{
8255 serde::Serializable<decltype(obj.value_types)>::serialize(obj.value_types, serializer);
8256}
8257
8258template <>
8259template <typename Deserializer>
8261{
8263 obj.value_types = serde::Deserializable<decltype(obj.value_types)>::deserialize(deserializer);
8264 return obj;
8265}
8266
8267namespace Acir {
8268
8269inline bool operator==(const HeapVector& lhs, const HeapVector& rhs)
8270{
8271 if (!(lhs.pointer == rhs.pointer)) {
8272 return false;
8273 }
8274 if (!(lhs.size == rhs.size)) {
8275 return false;
8276 }
8277 return true;
8278}
8279
8280} // end of namespace Acir
8281
8282template <>
8283template <typename Serializer>
8285{
8286 serializer.increase_container_depth();
8287 serde::Serializable<decltype(obj.pointer)>::serialize(obj.pointer, serializer);
8288 serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
8289 serializer.decrease_container_depth();
8290}
8291
8292template <>
8293template <typename Deserializer>
8295{
8296 deserializer.increase_container_depth();
8297 Acir::HeapVector obj;
8298 obj.pointer = serde::Deserializable<decltype(obj.pointer)>::deserialize(deserializer);
8299 obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
8300 deserializer.decrease_container_depth();
8301 return obj;
8302}
8303
8304namespace Acir {
8305
8306inline bool operator==(const IntegerBitSize& lhs, const IntegerBitSize& rhs)
8307{
8308 if (!(lhs.value == rhs.value)) {
8309 return false;
8310 }
8311 return true;
8312}
8313
8314} // end of namespace Acir
8315
8316template <>
8317template <typename Serializer>
8319{
8320 serializer.increase_container_depth();
8321 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8322 serializer.decrease_container_depth();
8323}
8324
8325template <>
8326template <typename Deserializer>
8328{
8329 deserializer.increase_container_depth();
8331 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8332 deserializer.decrease_container_depth();
8333 return obj;
8334}
8335
8336namespace Acir {
8337
8338inline bool operator==(const IntegerBitSize::U1& lhs, const IntegerBitSize::U1& rhs)
8339{
8340 return true;
8341}
8342
8343} // end of namespace Acir
8344
8345template <>
8346template <typename Serializer>
8350
8351template <>
8352template <typename Deserializer>
8358
8359namespace Acir {
8360
8361inline bool operator==(const IntegerBitSize::U8& lhs, const IntegerBitSize::U8& rhs)
8362{
8363 return true;
8364}
8365
8366} // end of namespace Acir
8367
8368template <>
8369template <typename Serializer>
8373
8374template <>
8375template <typename Deserializer>
8381
8382namespace Acir {
8383
8384inline bool operator==(const IntegerBitSize::U16& lhs, const IntegerBitSize::U16& rhs)
8385{
8386 return true;
8387}
8388
8389} // end of namespace Acir
8390
8391template <>
8392template <typename Serializer>
8396
8397template <>
8398template <typename Deserializer>
8404
8405namespace Acir {
8406
8407inline bool operator==(const IntegerBitSize::U32& lhs, const IntegerBitSize::U32& rhs)
8408{
8409 return true;
8410}
8411
8412} // end of namespace Acir
8413
8414template <>
8415template <typename Serializer>
8419
8420template <>
8421template <typename Deserializer>
8427
8428namespace Acir {
8429
8430inline bool operator==(const IntegerBitSize::U64& lhs, const IntegerBitSize::U64& rhs)
8431{
8432 return true;
8433}
8434
8435} // end of namespace Acir
8436
8437template <>
8438template <typename Serializer>
8442
8443template <>
8444template <typename Deserializer>
8450
8451namespace Acir {
8452
8453inline bool operator==(const IntegerBitSize::U128& lhs, const IntegerBitSize::U128& rhs)
8454{
8455 return true;
8456}
8457
8458} // end of namespace Acir
8459
8460template <>
8461template <typename Serializer>
8465
8466template <>
8467template <typename Deserializer>
8473
8474namespace Acir {
8475
8476inline bool operator==(const MemOp& lhs, const MemOp& rhs)
8477{
8478 if (!(lhs.operation == rhs.operation)) {
8479 return false;
8480 }
8481 if (!(lhs.index == rhs.index)) {
8482 return false;
8483 }
8484 if (!(lhs.value == rhs.value)) {
8485 return false;
8486 }
8487 return true;
8488}
8489
8490} // end of namespace Acir
8491
8492template <>
8493template <typename Serializer>
8494void serde::Serializable<Acir::MemOp>::serialize(const Acir::MemOp& obj, Serializer& serializer)
8495{
8496 serializer.increase_container_depth();
8497 serde::Serializable<decltype(obj.operation)>::serialize(obj.operation, serializer);
8498 serde::Serializable<decltype(obj.index)>::serialize(obj.index, serializer);
8499 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8500 serializer.decrease_container_depth();
8501}
8502
8503template <>
8504template <typename Deserializer>
8506{
8507 deserializer.increase_container_depth();
8508 Acir::MemOp obj;
8509 obj.operation = serde::Deserializable<decltype(obj.operation)>::deserialize(deserializer);
8510 obj.index = serde::Deserializable<decltype(obj.index)>::deserialize(deserializer);
8511 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8512 deserializer.decrease_container_depth();
8513 return obj;
8514}
8515
8516namespace Acir {
8517
8518inline bool operator==(const MemoryAddress& lhs, const MemoryAddress& rhs)
8519{
8520 if (!(lhs.value == rhs.value)) {
8521 return false;
8522 }
8523 return true;
8524}
8525
8526} // end of namespace Acir
8527
8528template <>
8529template <typename Serializer>
8531{
8532 serializer.increase_container_depth();
8533 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8534 serializer.decrease_container_depth();
8535}
8536
8537template <>
8538template <typename Deserializer>
8540{
8541 deserializer.increase_container_depth();
8543 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8544 deserializer.decrease_container_depth();
8545 return obj;
8546}
8547
8548namespace Acir {
8549
8550inline bool operator==(const MemoryAddress::Direct& lhs, const MemoryAddress::Direct& rhs)
8551{
8552 if (!(lhs.value == rhs.value)) {
8553 return false;
8554 }
8555 return true;
8556}
8557
8558} // end of namespace Acir
8559
8560template <>
8561template <typename Serializer>
8563 Serializer& serializer)
8564{
8565 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8566}
8567
8568template <>
8569template <typename Deserializer>
8571{
8573 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8574 return obj;
8575}
8576
8577namespace Acir {
8578
8580{
8581 if (!(lhs.value == rhs.value)) {
8582 return false;
8583 }
8584 return true;
8585}
8586
8587} // end of namespace Acir
8588
8589template <>
8590template <typename Serializer>
8592 Serializer& serializer)
8593{
8594 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8595}
8596
8597template <>
8598template <typename Deserializer>
8600 Deserializer& deserializer)
8601{
8603 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8604 return obj;
8605}
8606
8607namespace Acir {
8608
8609inline bool operator==(const Opcode& lhs, const Opcode& rhs)
8610{
8611 if (!(lhs.value == rhs.value)) {
8612 return false;
8613 }
8614 return true;
8615}
8616
8617} // end of namespace Acir
8618
8619template <>
8620template <typename Serializer>
8621void serde::Serializable<Acir::Opcode>::serialize(const Acir::Opcode& obj, Serializer& serializer)
8622{
8623 serializer.increase_container_depth();
8624 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8625 serializer.decrease_container_depth();
8626}
8627
8628template <>
8629template <typename Deserializer>
8631{
8632 deserializer.increase_container_depth();
8633 Acir::Opcode obj;
8634 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8635 deserializer.decrease_container_depth();
8636 return obj;
8637}
8638
8639namespace Acir {
8640
8641inline bool operator==(const Opcode::AssertZero& lhs, const Opcode::AssertZero& rhs)
8642{
8643 if (!(lhs.value == rhs.value)) {
8644 return false;
8645 }
8646 return true;
8647}
8648
8649} // end of namespace Acir
8650
8651template <>
8652template <typename Serializer>
8654 Serializer& serializer)
8655{
8656 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8657}
8658
8659template <>
8660template <typename Deserializer>
8662{
8664 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8665 return obj;
8666}
8667
8668namespace Acir {
8669
8671{
8672 if (!(lhs.value == rhs.value)) {
8673 return false;
8674 }
8675 return true;
8676}
8677
8678} // end of namespace Acir
8679
8680template <>
8681template <typename Serializer>
8683 Serializer& serializer)
8684{
8685 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8686}
8687
8688template <>
8689template <typename Deserializer>
8691 Deserializer& deserializer)
8692{
8694 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8695 return obj;
8696}
8697
8698namespace Acir {
8699
8700inline bool operator==(const Opcode::MemoryOp& lhs, const Opcode::MemoryOp& rhs)
8701{
8702 if (!(lhs.block_id == rhs.block_id)) {
8703 return false;
8704 }
8705 if (!(lhs.op == rhs.op)) {
8706 return false;
8707 }
8708 return true;
8709}
8710
8711} // end of namespace Acir
8712
8713template <>
8714template <typename Serializer>
8716{
8717 serde::Serializable<decltype(obj.block_id)>::serialize(obj.block_id, serializer);
8718 serde::Serializable<decltype(obj.op)>::serialize(obj.op, serializer);
8719}
8720
8721template <>
8722template <typename Deserializer>
8724{
8726 obj.block_id = serde::Deserializable<decltype(obj.block_id)>::deserialize(deserializer);
8727 obj.op = serde::Deserializable<decltype(obj.op)>::deserialize(deserializer);
8728 return obj;
8729}
8730
8731namespace Acir {
8732
8733inline bool operator==(const Opcode::MemoryInit& lhs, const Opcode::MemoryInit& rhs)
8734{
8735 if (!(lhs.block_id == rhs.block_id)) {
8736 return false;
8737 }
8738 if (!(lhs.init == rhs.init)) {
8739 return false;
8740 }
8741 if (!(lhs.block_type == rhs.block_type)) {
8742 return false;
8743 }
8744 return true;
8745}
8746
8747} // end of namespace Acir
8748
8749template <>
8750template <typename Serializer>
8752 Serializer& serializer)
8753{
8754 serde::Serializable<decltype(obj.block_id)>::serialize(obj.block_id, serializer);
8755 serde::Serializable<decltype(obj.init)>::serialize(obj.init, serializer);
8756 serde::Serializable<decltype(obj.block_type)>::serialize(obj.block_type, serializer);
8757}
8758
8759template <>
8760template <typename Deserializer>
8762{
8764 obj.block_id = serde::Deserializable<decltype(obj.block_id)>::deserialize(deserializer);
8765 obj.init = serde::Deserializable<decltype(obj.init)>::deserialize(deserializer);
8766 obj.block_type = serde::Deserializable<decltype(obj.block_type)>::deserialize(deserializer);
8767 return obj;
8768}
8769
8770namespace Acir {
8771
8772inline bool operator==(const Opcode::BrilligCall& lhs, const Opcode::BrilligCall& rhs)
8773{
8774 if (!(lhs.id == rhs.id)) {
8775 return false;
8776 }
8777 if (!(lhs.inputs == rhs.inputs)) {
8778 return false;
8779 }
8780 if (!(lhs.outputs == rhs.outputs)) {
8781 return false;
8782 }
8783 if (!(lhs.predicate == rhs.predicate)) {
8784 return false;
8785 }
8786 return true;
8787}
8788
8789} // end of namespace Acir
8790
8791template <>
8792template <typename Serializer>
8794 Serializer& serializer)
8795{
8796 serde::Serializable<decltype(obj.id)>::serialize(obj.id, serializer);
8797 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8798 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8799 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8800}
8801
8802template <>
8803template <typename Deserializer>
8805{
8807 obj.id = serde::Deserializable<decltype(obj.id)>::deserialize(deserializer);
8808 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8809 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8810 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8811 return obj;
8812}
8813
8814namespace Acir {
8815
8816inline bool operator==(const Opcode::Call& lhs, const Opcode::Call& rhs)
8817{
8818 if (!(lhs.id == rhs.id)) {
8819 return false;
8820 }
8821 if (!(lhs.inputs == rhs.inputs)) {
8822 return false;
8823 }
8824 if (!(lhs.outputs == rhs.outputs)) {
8825 return false;
8826 }
8827 if (!(lhs.predicate == rhs.predicate)) {
8828 return false;
8829 }
8830 return true;
8831}
8832
8833} // end of namespace Acir
8834
8835template <>
8836template <typename Serializer>
8838{
8839 serde::Serializable<decltype(obj.id)>::serialize(obj.id, serializer);
8840 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8841 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8842 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8843}
8844
8845template <>
8846template <typename Deserializer>
8848{
8850 obj.id = serde::Deserializable<decltype(obj.id)>::deserialize(deserializer);
8851 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8852 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8853 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8854 return obj;
8855}
8856
8857namespace Acir {
8858
8859inline bool operator==(const OpcodeLocation& lhs, const OpcodeLocation& rhs)
8860{
8861 if (!(lhs.value == rhs.value)) {
8862 return false;
8863 }
8864 return true;
8865}
8866
8867} // end of namespace Acir
8868
8869template <>
8870template <typename Serializer>
8872{
8873 serializer.increase_container_depth();
8874 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8875 serializer.decrease_container_depth();
8876}
8877
8878template <>
8879template <typename Deserializer>
8881{
8882 deserializer.increase_container_depth();
8884 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8885 deserializer.decrease_container_depth();
8886 return obj;
8887}
8888
8889namespace Acir {
8890
8891inline bool operator==(const OpcodeLocation::Acir& lhs, const OpcodeLocation::Acir& rhs)
8892{
8893 if (!(lhs.value == rhs.value)) {
8894 return false;
8895 }
8896 return true;
8897}
8898
8899} // end of namespace Acir
8900
8901template <>
8902template <typename Serializer>
8904 Serializer& serializer)
8905{
8906 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8907}
8908
8909template <>
8910template <typename Deserializer>
8912{
8914 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8915 return obj;
8916}
8917
8918namespace Acir {
8919
8921{
8922 if (!(lhs.acir_index == rhs.acir_index)) {
8923 return false;
8924 }
8925 if (!(lhs.brillig_index == rhs.brillig_index)) {
8926 return false;
8927 }
8928 return true;
8929}
8930
8931} // end of namespace Acir
8932
8933template <>
8934template <typename Serializer>
8936 Serializer& serializer)
8937{
8938 serde::Serializable<decltype(obj.acir_index)>::serialize(obj.acir_index, serializer);
8939 serde::Serializable<decltype(obj.brillig_index)>::serialize(obj.brillig_index, serializer);
8940}
8941
8942template <>
8943template <typename Deserializer>
8945 Deserializer& deserializer)
8946{
8948 obj.acir_index = serde::Deserializable<decltype(obj.acir_index)>::deserialize(deserializer);
8949 obj.brillig_index = serde::Deserializable<decltype(obj.brillig_index)>::deserialize(deserializer);
8950 return obj;
8951}
8952
8953namespace Acir {
8954
8955inline bool operator==(const Program& lhs, const Program& rhs)
8956{
8957 if (!(lhs.functions == rhs.functions)) {
8958 return false;
8959 }
8960 if (!(lhs.unconstrained_functions == rhs.unconstrained_functions)) {
8961 return false;
8962 }
8963 return true;
8964}
8965
8966} // end of namespace Acir
8967
8968template <>
8969template <typename Serializer>
8970void serde::Serializable<Acir::Program>::serialize(const Acir::Program& obj, Serializer& serializer)
8971{
8972 serializer.increase_container_depth();
8973 serde::Serializable<decltype(obj.functions)>::serialize(obj.functions, serializer);
8974 serde::Serializable<decltype(obj.unconstrained_functions)>::serialize(obj.unconstrained_functions, serializer);
8975 serializer.decrease_container_depth();
8976}
8977
8978template <>
8979template <typename Deserializer>
8981{
8982 deserializer.increase_container_depth();
8983 Acir::Program obj;
8984 obj.functions = serde::Deserializable<decltype(obj.functions)>::deserialize(deserializer);
8986 serde::Deserializable<decltype(obj.unconstrained_functions)>::deserialize(deserializer);
8987 deserializer.decrease_container_depth();
8988 return obj;
8989}
8990
8991namespace Acir {
8992
8993inline bool operator==(const ProgramWithoutBrillig& lhs, const ProgramWithoutBrillig& rhs)
8994{
8995 if (!(lhs.functions == rhs.functions)) {
8996 return false;
8997 }
8998 if (!(lhs.unconstrained_functions == rhs.unconstrained_functions)) {
8999 return false;
9000 }
9001 return true;
9002}
9003
9004} // end of namespace Acir
9005
9006template <>
9007template <typename Serializer>
9009 Serializer& serializer)
9010{
9011 serializer.increase_container_depth();
9012 serde::Serializable<decltype(obj.functions)>::serialize(obj.functions, serializer);
9013 serde::Serializable<decltype(obj.unconstrained_functions)>::serialize(obj.unconstrained_functions, serializer);
9014 serializer.decrease_container_depth();
9015}
9016
9017template <>
9018template <typename Deserializer>
9020{
9021 deserializer.increase_container_depth();
9023 obj.functions = serde::Deserializable<decltype(obj.functions)>::deserialize(deserializer);
9025 serde::Deserializable<decltype(obj.unconstrained_functions)>::deserialize(deserializer);
9026 deserializer.decrease_container_depth();
9027 return obj;
9028}
9029
9030namespace Acir {
9031
9032inline bool operator==(const PublicInputs& lhs, const PublicInputs& rhs)
9033{
9034 if (!(lhs.value == rhs.value)) {
9035 return false;
9036 }
9037 return true;
9038}
9039
9040} // end of namespace Acir
9041
9042template <>
9043template <typename Serializer>
9045{
9046 serializer.increase_container_depth();
9047 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9048 serializer.decrease_container_depth();
9049}
9050
9051template <>
9052template <typename Deserializer>
9054{
9055 deserializer.increase_container_depth();
9057 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9058 deserializer.decrease_container_depth();
9059 return obj;
9060}
9061
9062namespace Acir {
9063
9064inline bool operator==(const SemanticLength& lhs, const SemanticLength& rhs)
9065{
9066 if (!(lhs.value == rhs.value)) {
9067 return false;
9068 }
9069 return true;
9070}
9071
9072} // end of namespace Acir
9073
9074template <>
9075template <typename Serializer>
9077{
9078 serializer.increase_container_depth();
9079 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9080 serializer.decrease_container_depth();
9081}
9082
9083template <>
9084template <typename Deserializer>
9086{
9087 deserializer.increase_container_depth();
9089 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9090 deserializer.decrease_container_depth();
9091 return obj;
9092}
9093
9094namespace Acir {
9095
9096inline bool operator==(const SemiFlattenedLength& lhs, const SemiFlattenedLength& rhs)
9097{
9098 if (!(lhs.value == rhs.value)) {
9099 return false;
9100 }
9101 return true;
9102}
9103
9104} // end of namespace Acir
9105
9106template <>
9107template <typename Serializer>
9109 Serializer& serializer)
9110{
9111 serializer.increase_container_depth();
9112 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9113 serializer.decrease_container_depth();
9114}
9115
9116template <>
9117template <typename Deserializer>
9119{
9120 deserializer.increase_container_depth();
9122 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9123 deserializer.decrease_container_depth();
9124 return obj;
9125}
9126
9127namespace Acir {
9128
9129inline bool operator==(const ValueOrArray& lhs, const ValueOrArray& rhs)
9130{
9131 if (!(lhs.value == rhs.value)) {
9132 return false;
9133 }
9134 return true;
9135}
9136
9137} // end of namespace Acir
9138
9139template <>
9140template <typename Serializer>
9142{
9143 serializer.increase_container_depth();
9144 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9145 serializer.decrease_container_depth();
9146}
9147
9148template <>
9149template <typename Deserializer>
9151{
9152 deserializer.increase_container_depth();
9154 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9155 deserializer.decrease_container_depth();
9156 return obj;
9157}
9158
9159namespace Acir {
9160
9162{
9163 if (!(lhs.value == rhs.value)) {
9164 return false;
9165 }
9166 return true;
9167}
9168
9169} // end of namespace Acir
9170
9171template <>
9172template <typename Serializer>
9174 Serializer& serializer)
9175{
9176 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9177}
9178
9179template <>
9180template <typename Deserializer>
9182 Deserializer& deserializer)
9183{
9185 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9186 return obj;
9187}
9188
9189namespace Acir {
9190
9192{
9193 if (!(lhs.value == rhs.value)) {
9194 return false;
9195 }
9196 return true;
9197}
9198
9199} // end of namespace Acir
9200
9201template <>
9202template <typename Serializer>
9204 Serializer& serializer)
9205{
9206 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9207}
9208
9209template <>
9210template <typename Deserializer>
9212 Deserializer& deserializer)
9213{
9215 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9216 return obj;
9217}
9218
9219namespace Acir {
9220
9222{
9223 if (!(lhs.value == rhs.value)) {
9224 return false;
9225 }
9226 return true;
9227}
9228
9229} // end of namespace Acir
9230
9231template <>
9232template <typename Serializer>
9234 Serializer& serializer)
9235{
9236 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9237}
9238
9239template <>
9240template <typename Deserializer>
9242 Deserializer& deserializer)
9243{
9245 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9246 return obj;
9247}
9248
9249namespace Acir {
9250
9251inline bool operator==(const Witness& lhs, const Witness& rhs)
9252{
9253 if (!(lhs.value == rhs.value)) {
9254 return false;
9255 }
9256 return true;
9257}
9258
9259} // end of namespace Acir
9260
9261template <>
9262template <typename Serializer>
9263void serde::Serializable<Acir::Witness>::serialize(const Acir::Witness& obj, Serializer& serializer)
9264{
9265 serializer.increase_container_depth();
9266 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9267 serializer.decrease_container_depth();
9268}
9269
9270template <>
9271template <typename Deserializer>
9273{
9274 deserializer.increase_container_depth();
9275 Acir::Witness obj;
9276 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9277 deserializer.decrease_container_depth();
9278 return obj;
9279}
Serves as a key-value node store for merkle trees. Caches all changes in memory before persisting the...
Definition acir.hpp:6
bool operator==(const AssertionPayload &lhs, const AssertionPayload &rhs)
Definition acir.hpp:4929
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
uint64_t error_selector
Definition acir.hpp:4608
std::vector< Acir::ExpressionOrMemory > payload
Definition acir.hpp:4609
friend bool operator==(const AssertionPayload &, const AssertionPayload &)
Definition acir.hpp:4929
void msgpack_pack(auto &packer) const
Definition acir.hpp:4613
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4620
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:75
void msgpack_pack(auto &packer) const
Definition acir.hpp:74
friend bool operator==(const Add &, const Add &)
Definition acir.hpp:4998
void msgpack_pack(auto &packer) const
Definition acir.hpp:95
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:96
friend bool operator==(const Div &, const Div &)
Definition acir.hpp:5067
void msgpack_pack(auto &packer) const
Definition acir.hpp:109
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:110
friend bool operator==(const Equals &, const Equals &)
Definition acir.hpp:5114
friend bool operator==(const IntegerDiv &, const IntegerDiv &)
Definition acir.hpp:5090
void msgpack_pack(auto &packer) const
Definition acir.hpp:102
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:103
friend bool operator==(const LessThanEquals &, const LessThanEquals &)
Definition acir.hpp:5161
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:124
void msgpack_pack(auto &packer) const
Definition acir.hpp:123
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:117
void msgpack_pack(auto &packer) const
Definition acir.hpp:116
friend bool operator==(const LessThan &, const LessThan &)
Definition acir.hpp:5137
void msgpack_pack(auto &packer) const
Definition acir.hpp:88
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:89
friend bool operator==(const Mul &, const Mul &)
Definition acir.hpp:5044
void msgpack_pack(auto &packer) const
Definition acir.hpp:81
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:82
friend bool operator==(const Sub &, const Sub &)
Definition acir.hpp:5021
std::variant< Add, Sub, Mul, Div, IntegerDiv, Equals, LessThan, LessThanEquals > value
Definition acir.hpp:127
void msgpack_pack(auto &packer) const
Definition acir.hpp:131
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:185
friend bool operator==(const BinaryFieldOp &, const BinaryFieldOp &)
Definition acir.hpp:4966
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:243
friend bool operator==(const Add &, const Add &)
Definition acir.hpp:5217
void msgpack_pack(auto &packer) const
Definition acir.hpp:242
void msgpack_pack(auto &packer) const
Definition acir.hpp:291
friend bool operator==(const And &, const And &)
Definition acir.hpp:5375
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:292
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:264
friend bool operator==(const Div &, const Div &)
Definition acir.hpp:5283
void msgpack_pack(auto &packer) const
Definition acir.hpp:263
void msgpack_pack(auto &packer) const
Definition acir.hpp:270
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:271
friend bool operator==(const Equals &, const Equals &)
Definition acir.hpp:5305
friend bool operator==(const LessThanEquals &, const LessThanEquals &)
Definition acir.hpp:5351
void msgpack_pack(auto &packer) const
Definition acir.hpp:284
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:285
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:278
friend bool operator==(const LessThan &, const LessThan &)
Definition acir.hpp:5328
void msgpack_pack(auto &packer) const
Definition acir.hpp:277
void msgpack_pack(auto &packer) const
Definition acir.hpp:256
friend bool operator==(const Mul &, const Mul &)
Definition acir.hpp:5261
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:257
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:299
void msgpack_pack(auto &packer) const
Definition acir.hpp:298
friend bool operator==(const Or &, const Or &)
Definition acir.hpp:5397
friend bool operator==(const Shl &, const Shl &)
Definition acir.hpp:5441
void msgpack_pack(auto &packer) const
Definition acir.hpp:312
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:313
void msgpack_pack(auto &packer) const
Definition acir.hpp:319
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:320
friend bool operator==(const Shr &, const Shr &)
Definition acir.hpp:5463
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:250
void msgpack_pack(auto &packer) const
Definition acir.hpp:249
friend bool operator==(const Sub &, const Sub &)
Definition acir.hpp:5239
friend bool operator==(const Xor &, const Xor &)
Definition acir.hpp:5419
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:306
void msgpack_pack(auto &packer) const
Definition acir.hpp:305
void msgpack_pack(auto &packer) const
Definition acir.hpp:327
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:397
std::variant< Add, Sub, Mul, Div, Equals, LessThan, LessThanEquals, And, Or, Xor, Shl, Shr > value
Definition acir.hpp:323
friend bool operator==(const BinaryIntOp &, const BinaryIntOp &)
Definition acir.hpp:5185
friend bool operator==(const Field &, const Field &)
Definition acir.hpp:5517
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:607
void msgpack_pack(auto &packer) const
Definition acir.hpp:606
Acir::IntegerBitSize value
Definition acir.hpp:611
friend bool operator==(const Integer &, const Integer &)
Definition acir.hpp:5539
void msgpack_pack(auto &packer) const
Definition acir.hpp:615
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:617
std::variant< Field, Integer > value
Definition acir.hpp:628
friend bool operator==(const BitSize &, const BitSize &)
Definition acir.hpp:5485
void msgpack_pack(auto &packer) const
Definition acir.hpp:632
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:662
void msgpack_pack(auto &packer) const
Definition acir.hpp:2929
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > key
Definition acir.hpp:2924
std::vector< Acir::Witness > outputs
Definition acir.hpp:2925
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:2922
friend bool operator==(const AES128Encrypt &, const AES128Encrypt &)
Definition acir.hpp:5599
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2938
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > iv
Definition acir.hpp:2923
friend bool operator==(const AND &, const AND &)
Definition acir.hpp:5644
Acir::FunctionInput lhs
Definition acir.hpp:2960
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2976
Acir::FunctionInput rhs
Definition acir.hpp:2961
void msgpack_pack(auto &packer) const
Definition acir.hpp:2967
std::shared_ptr< std::array< Acir::Witness, 32 > > outputs
Definition acir.hpp:3067
void msgpack_pack(auto &packer) const
Definition acir.hpp:3071
friend bool operator==(const Blake2s &, const Blake2s &)
Definition acir.hpp:5767
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3066
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3078
void msgpack_pack(auto &packer) const
Definition acir.hpp:3101
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3108
std::shared_ptr< std::array< Acir::Witness, 32 > > outputs
Definition acir.hpp:3097
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3096
friend bool operator==(const Blake3 &, const Blake3 &)
Definition acir.hpp:5802
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:3126
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > hashed_message
Definition acir.hpp:3129
void msgpack_pack(auto &packer) const
Definition acir.hpp:3135
friend bool operator==(const EcdsaSecp256k1 &, const EcdsaSecp256k1 &)
Definition acir.hpp:5837
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_y
Definition acir.hpp:3127
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3146
std::shared_ptr< std::array< Acir::FunctionInput, 64 > > signature
Definition acir.hpp:3128
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:3172
friend bool operator==(const EcdsaSecp256r1 &, const EcdsaSecp256r1 &)
Definition acir.hpp:5892
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3192
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > hashed_message
Definition acir.hpp:3175
void msgpack_pack(auto &packer) const
Definition acir.hpp:3181
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_y
Definition acir.hpp:3173
std::shared_ptr< std::array< Acir::FunctionInput, 64 > > signature
Definition acir.hpp:3174
std::shared_ptr< std::array< Acir::Witness, 3 > > outputs
Definition acir.hpp:3259
friend bool operator==(const EmbeddedCurveAdd &, const EmbeddedCurveAdd &)
Definition acir.hpp:5992
void msgpack_pack(auto &packer) const
Definition acir.hpp:3263
std::shared_ptr< std::array< Acir::FunctionInput, 3 > > input2
Definition acir.hpp:3257
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3272
std::shared_ptr< std::array< Acir::FunctionInput, 3 > > input1
Definition acir.hpp:3256
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
Definition acir.hpp:3294
friend bool operator==(const Keccakf1600 &, const Keccakf1600 &)
Definition acir.hpp:6037
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3306
void msgpack_pack(auto &packer) const
Definition acir.hpp:3299
std::shared_ptr< std::array< Acir::Witness, 25 > > outputs
Definition acir.hpp:3295
std::vector< Acir::FunctionInput > scalars
Definition acir.hpp:3219
std::vector< Acir::FunctionInput > points
Definition acir.hpp:3218
std::shared_ptr< std::array< Acir::Witness, 3 > > outputs
Definition acir.hpp:3221
friend bool operator==(const MultiScalarMul &, const MultiScalarMul &)
Definition acir.hpp:5947
void msgpack_pack(auto &packer) const
Definition acir.hpp:3225
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3234
std::vector< Acir::Witness > outputs
Definition acir.hpp:3371
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3370
void msgpack_pack(auto &packer) const
Definition acir.hpp:3375
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3382
friend bool operator==(const Poseidon2Permutation &, const Poseidon2Permutation &)
Definition acir.hpp:6128
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3048
friend bool operator==(const RANGE &, const RANGE &)
Definition acir.hpp:5732
void msgpack_pack(auto &packer) const
Definition acir.hpp:3041
Acir::FunctionInput input
Definition acir.hpp:3036
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:3324
std::vector< Acir::FunctionInput > proof
Definition acir.hpp:3325
void msgpack_pack(auto &packer) const
Definition acir.hpp:3333
std::vector< Acir::FunctionInput > public_inputs
Definition acir.hpp:3326
friend bool operator==(const RecursiveAggregation &, const RecursiveAggregation &)
Definition acir.hpp:6072
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3344
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3414
std::shared_ptr< std::array< Acir::FunctionInput, 8 > > hash_values
Definition acir.hpp:3401
friend bool operator==(const Sha256Compression &, const Sha256Compression &)
Definition acir.hpp:6164
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
Definition acir.hpp:3400
std::shared_ptr< std::array< Acir::Witness, 8 > > outputs
Definition acir.hpp:3402
void msgpack_pack(auto &packer) const
Definition acir.hpp:3406
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3014
Acir::FunctionInput rhs
Definition acir.hpp:2999
Acir::FunctionInput lhs
Definition acir.hpp:2998
void msgpack_pack(auto &packer) const
Definition acir.hpp:3005
friend bool operator==(const XOR &, const XOR &)
Definition acir.hpp:5688
void msgpack_pack(auto &packer) const
Definition acir.hpp:3451
friend bool operator==(const BlackBoxFuncCall &, const BlackBoxFuncCall &)
Definition acir.hpp:5567
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3529
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:3447
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:890
void msgpack_pack(auto &packer) const
Definition acir.hpp:881
friend bool operator==(const AES128Encrypt &, const AES128Encrypt &)
Definition acir.hpp:6236
Acir::HeapArray output
Definition acir.hpp:913
Acir::HeapArray message
Definition acir.hpp:912
friend bool operator==(const Blake2s &, const Blake2s &)
Definition acir.hpp:6281
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:924
void msgpack_pack(auto &packer) const
Definition acir.hpp:917
Acir::HeapArray message
Definition acir.hpp:942
Acir::HeapArray output
Definition acir.hpp:943
void msgpack_pack(auto &packer) const
Definition acir.hpp:947
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:954
friend bool operator==(const Blake3 &, const Blake3 &)
Definition acir.hpp:6315
Acir::MemoryAddress result
Definition acir.hpp:1006
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1020
friend bool operator==(const EcdsaSecp256k1 &, const EcdsaSecp256k1 &)
Definition acir.hpp:6384
void msgpack_pack(auto &packer) const
Definition acir.hpp:1010
Acir::MemoryAddress result
Definition acir.hpp:1048
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1062
friend bool operator==(const EcdsaSecp256r1 &, const EcdsaSecp256r1 &)
Definition acir.hpp:6434
void msgpack_pack(auto &packer) const
Definition acir.hpp:1052
Acir::MemoryAddress input1_x
Definition acir.hpp:1120
friend bool operator==(const EmbeddedCurveAdd &, const EmbeddedCurveAdd &)
Definition acir.hpp:6524
Acir::MemoryAddress input2_infinite
Definition acir.hpp:1125
Acir::MemoryAddress input1_y
Definition acir.hpp:1121
Acir::MemoryAddress input1_infinite
Definition acir.hpp:1122
Acir::MemoryAddress input2_x
Definition acir.hpp:1123
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1142
void msgpack_pack(auto &packer) const
Definition acir.hpp:1130
Acir::MemoryAddress input2_y
Definition acir.hpp:1124
Acir::HeapArray input
Definition acir.hpp:972
friend bool operator==(const Keccakf1600 &, const Keccakf1600 &)
Definition acir.hpp:6349
Acir::HeapArray output
Definition acir.hpp:973
void msgpack_pack(auto &packer) const
Definition acir.hpp:977
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:984
friend bool operator==(const MultiScalarMul &, const MultiScalarMul &)
Definition acir.hpp:6484
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1100
void msgpack_pack(auto &packer) const
Definition acir.hpp:1092
void msgpack_pack(auto &packer) const
Definition acir.hpp:1175
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1182
friend bool operator==(const Poseidon2Permutation &, const Poseidon2Permutation &)
Definition acir.hpp:6584
friend bool operator==(const Sha256Compression &, const Sha256Compression &)
Definition acir.hpp:6619
void msgpack_pack(auto &packer) const
Definition acir.hpp:1206
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1214
friend bool operator==(const ToRadix &, const ToRadix &)
Definition acir.hpp:6659
Acir::MemoryAddress output_pointer
Definition acir.hpp:1236
Acir::MemoryAddress radix
Definition acir.hpp:1235
Acir::MemoryAddress output_bits
Definition acir.hpp:1238
Acir::MemoryAddress input
Definition acir.hpp:1234
Acir::MemoryAddress num_limbs
Definition acir.hpp:1237
void msgpack_pack(auto &packer) const
Definition acir.hpp:1242
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1252
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1356
void msgpack_pack(auto &packer) const
Definition acir.hpp:1290
friend bool operator==(const BlackBoxOp &, const BlackBoxOp &)
Definition acir.hpp:6204
std::variant< AES128Encrypt, Blake2s, Blake3, Keccakf1600, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Poseidon2Permutation, Sha256Compression, ToRadix > value
Definition acir.hpp:1286
void msgpack_pack(auto &packer) const
Definition acir.hpp:3702
friend bool operator==(const BlockId &, const BlockId &)
Definition acir.hpp:6708
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3704
uint32_t value
Definition acir.hpp:3698
friend bool operator==(const CallData &, const CallData &)
Definition acir.hpp:6794
void msgpack_pack(auto &packer) const
Definition acir.hpp:3729
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3731
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3721
friend bool operator==(const Memory &, const Memory &)
Definition acir.hpp:6772
void msgpack_pack(auto &packer) const
Definition acir.hpp:3720
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3746
friend bool operator==(const ReturnData &, const ReturnData &)
Definition acir.hpp:6823
void msgpack_pack(auto &packer) const
Definition acir.hpp:3745
void msgpack_pack(auto &packer) const
Definition acir.hpp:3753
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3787
std::variant< Memory, CallData, ReturnData > value
Definition acir.hpp:3749
friend bool operator==(const BlockType &, const BlockType &)
Definition acir.hpp:6740
void msgpack_pack(auto &packer) const
Definition acir.hpp:4843
friend bool operator==(const BrilligBytecode &, const BrilligBytecode &)
Definition acir.hpp:6846
std::vector< Acir::BrilligOpcode > bytecode
Definition acir.hpp:4839
std::string function_name
Definition acir.hpp:4838
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4850
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3892
void msgpack_pack(auto &packer) const
Definition acir.hpp:3890
std::vector< Acir::Expression > value
Definition acir.hpp:3886
friend bool operator==(const Array &, const Array &)
Definition acir.hpp:6944
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3910
void msgpack_pack(auto &packer) const
Definition acir.hpp:3908
friend bool operator==(const MemoryArray &, const MemoryArray &)
Definition acir.hpp:6973
Acir::Expression value
Definition acir.hpp:3868
friend bool operator==(const Single &, const Single &)
Definition acir.hpp:6915
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3874
void msgpack_pack(auto &packer) const
Definition acir.hpp:3872
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3959
std::variant< Single, Array, MemoryArray > value
Definition acir.hpp:3921
void msgpack_pack(auto &packer) const
Definition acir.hpp:3925
friend bool operator==(const BrilligInputs &, const BrilligInputs &)
Definition acir.hpp:6883
void msgpack_pack(auto &packer) const
Definition acir.hpp:1878
friend bool operator==(const BinaryFieldOp &, const BinaryFieldOp &)
Definition acir.hpp:7035
Acir::MemoryAddress destination
Definition acir.hpp:1871
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1887
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1927
Acir::MemoryAddress destination
Definition acir.hpp:1909
Acir::MemoryAddress rhs
Definition acir.hpp:1913
void msgpack_pack(auto &packer) const
Definition acir.hpp:1917
friend bool operator==(const BinaryIntOp &, const BinaryIntOp &)
Definition acir.hpp:7080
Acir::IntegerBitSize bit_size
Definition acir.hpp:1911
Acir::MemoryAddress lhs
Definition acir.hpp:1912
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2386
Acir::BlackBoxOp value
Definition acir.hpp:2380
friend bool operator==(const BlackBox &, const BlackBox &)
Definition acir.hpp:7640
void msgpack_pack(auto &packer) const
Definition acir.hpp:2384
void msgpack_pack(auto &packer) const
Definition acir.hpp:2113
friend bool operator==(const Call &, const Call &)
Definition acir.hpp:7311
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2119
Acir::MemoryAddress offset_address
Definition acir.hpp:2077
friend bool operator==(const CalldataCopy &, const CalldataCopy &)
Definition acir.hpp:7271
Acir::MemoryAddress destination_address
Definition acir.hpp:2075
void msgpack_pack(auto &packer) const
Definition acir.hpp:2081
Acir::MemoryAddress size_address
Definition acir.hpp:2076
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2089
Acir::MemoryAddress source
Definition acir.hpp:1986
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1999
void msgpack_pack(auto &packer) const
Definition acir.hpp:1991
Acir::MemoryAddress destination
Definition acir.hpp:1985
Acir::BitSize bit_size
Definition acir.hpp:1987
friend bool operator==(const Cast &, const Cast &)
Definition acir.hpp:7169
Acir::MemoryAddress source_b
Definition acir.hpp:2284
friend bool operator==(const ConditionalMov &, const ConditionalMov &)
Definition acir.hpp:7527
Acir::MemoryAddress source_a
Definition acir.hpp:2283
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2298
void msgpack_pack(auto &packer) const
Definition acir.hpp:2289
Acir::MemoryAddress destination
Definition acir.hpp:2282
Acir::MemoryAddress condition
Definition acir.hpp:2285
Acir::BitSize bit_size
Definition acir.hpp:2136
friend bool operator==(const Const &, const Const &)
Definition acir.hpp:7340
std::vector< uint8_t > value
Definition acir.hpp:2137
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2149
void msgpack_pack(auto &packer) const
Definition acir.hpp:2141
Acir::MemoryAddress destination
Definition acir.hpp:2135
std::vector< Acir::HeapValueType > input_value_types
Definition acir.hpp:2214
std::vector< Acir::HeapValueType > destination_value_types
Definition acir.hpp:2212
std::vector< Acir::ValueOrArray > destinations
Definition acir.hpp:2211
friend bool operator==(const ForeignCall &, const ForeignCall &)
Definition acir.hpp:7442
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2228
void msgpack_pack(auto &packer) const
Definition acir.hpp:2218
std::vector< Acir::ValueOrArray > inputs
Definition acir.hpp:2213
std::vector< uint8_t > value
Definition acir.hpp:2171
void msgpack_pack(auto &packer) const
Definition acir.hpp:2175
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2183
friend bool operator==(const IndirectConst &, const IndirectConst &)
Definition acir.hpp:7379
Acir::MemoryAddress destination_pointer
Definition acir.hpp:2169
void msgpack_pack(auto &packer) const
Definition acir.hpp:2053
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2059
friend bool operator==(const Jump &, const Jump &)
Definition acir.hpp:7242
void msgpack_pack(auto &packer) const
Definition acir.hpp:2024
Acir::MemoryAddress condition
Definition acir.hpp:2019
friend bool operator==(const JumpIf &, const JumpIf &)
Definition acir.hpp:7208
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2031
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2332
Acir::MemoryAddress destination
Definition acir.hpp:2320
Acir::MemoryAddress source_pointer
Definition acir.hpp:2321
friend bool operator==(const Load &, const Load &)
Definition acir.hpp:7572
void msgpack_pack(auto &packer) const
Definition acir.hpp:2325
Acir::MemoryAddress destination
Definition acir.hpp:2252
friend bool operator==(const Mov &, const Mov &)
Definition acir.hpp:7493
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2264
Acir::MemoryAddress source
Definition acir.hpp:2253
void msgpack_pack(auto &packer) const
Definition acir.hpp:2257
friend bool operator==(const Not &, const Not &)
Definition acir.hpp:7130
Acir::MemoryAddress source
Definition acir.hpp:1952
void msgpack_pack(auto &packer) const
Definition acir.hpp:1957
Acir::IntegerBitSize bit_size
Definition acir.hpp:1953
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1965
Acir::MemoryAddress destination
Definition acir.hpp:1951
friend bool operator==(const Return &, const Return &)
Definition acir.hpp:7419
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2206
void msgpack_pack(auto &packer) const
Definition acir.hpp:2205
friend bool operator==(const Stop &, const Stop &)
Definition acir.hpp:7699
void msgpack_pack(auto &packer) const
Definition acir.hpp:2428
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2434
Acir::HeapVector return_data
Definition acir.hpp:2424
friend bool operator==(const Store &, const Store &)
Definition acir.hpp:7606
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2362
Acir::MemoryAddress source
Definition acir.hpp:2351
Acir::MemoryAddress destination_pointer
Definition acir.hpp:2350
void msgpack_pack(auto &packer) const
Definition acir.hpp:2355
friend bool operator==(const Trap &, const Trap &)
Definition acir.hpp:7670
void msgpack_pack(auto &packer) const
Definition acir.hpp:2402
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2408
Acir::HeapVector revert_data
Definition acir.hpp:2398
std::variant< BinaryFieldOp, BinaryIntOp, Not, Cast, JumpIf, Jump, CalldataCopy, Call, Const, IndirectConst, Return, ForeignCall, Mov, ConditionalMov, Load, Store, BlackBox, Trap, Stop > value
Definition acir.hpp:2468
friend bool operator==(const BrilligOpcode &, const BrilligOpcode &)
Definition acir.hpp:7003
void msgpack_pack(auto &packer) const
Definition acir.hpp:2472
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2570
void msgpack_pack(auto &packer) const
Definition acir.hpp:4042
std::vector< Acir::Witness > value
Definition acir.hpp:4038
friend bool operator==(const Array &, const Array &)
Definition acir.hpp:7790
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4044
void msgpack_pack(auto &packer) const
Definition acir.hpp:4024
friend bool operator==(const Simple &, const Simple &)
Definition acir.hpp:7760
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4026
friend bool operator==(const BrilligOutputs &, const BrilligOutputs &)
Definition acir.hpp:7728
void msgpack_pack(auto &packer) const
Definition acir.hpp:4059
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4089
std::variant< Simple, Array > value
Definition acir.hpp:4055
Acir::PublicInputs return_values
Definition acir.hpp:4793
void msgpack_pack(auto &packer) const
Definition acir.hpp:4798
std::vector< Acir::Opcode > opcodes
Definition acir.hpp:4790
friend bool operator==(const Circuit &, const Circuit &)
Definition acir.hpp:7819
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4810
uint32_t current_witness_index
Definition acir.hpp:4789
std::vector< Acir::Witness > private_parameters
Definition acir.hpp:4791
Acir::PublicInputs public_parameters
Definition acir.hpp:4792
std::string function_name
Definition acir.hpp:4788
std::vector< std::tuple< Acir::OpcodeLocation, Acir::AssertionPayload > > assert_messages
Definition acir.hpp:4794
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:3833
std::vector< uint8_t > q_c
Definition acir.hpp:3834
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:3832
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3846
void msgpack_pack(auto &packer) const
Definition acir.hpp:3838
friend bool operator==(const Expression &, const Expression &)
Definition acir.hpp:7881
void msgpack_pack(auto &packer) const
Definition acir.hpp:4494
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4496
friend bool operator==(const Expression &, const Expression &)
Definition acir.hpp:7956
void msgpack_pack(auto &packer) const
Definition acir.hpp:4512
friend bool operator==(const Memory &, const Memory &)
Definition acir.hpp:7986
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4514
std::variant< Expression, Memory > value
Definition acir.hpp:4525
void msgpack_pack(auto &packer) const
Definition acir.hpp:4529
friend bool operator==(const ExpressionOrMemory &, const ExpressionOrMemory &)
Definition acir.hpp:7923
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4559
std::vector< uint8_t > value
Definition acir.hpp:2802
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2808
friend bool operator==(const Constant &, const Constant &)
Definition acir.hpp:8048
void msgpack_pack(auto &packer) const
Definition acir.hpp:2806
void msgpack_pack(auto &packer) const
Definition acir.hpp:2824
friend bool operator==(const Witness &, const Witness &)
Definition acir.hpp:8078
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2826
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2871
void msgpack_pack(auto &packer) const
Definition acir.hpp:2841
std::variant< Constant, Witness > value
Definition acir.hpp:2837
friend bool operator==(const FunctionInput &, const FunctionInput &)
Definition acir.hpp:8016
void msgpack_pack(auto &packer) const
Definition acir.hpp:847
Acir::SemiFlattenedLength size
Definition acir.hpp:843
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:854
friend bool operator==(const HeapArray &, const HeapArray &)
Definition acir.hpp:8108
Acir::MemoryAddress pointer
Definition acir.hpp:842
Acir::SemanticLength size
Definition acir.hpp:1536
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1547
void msgpack_pack(auto &packer) const
Definition acir.hpp:1540
friend bool operator==(const Array &, const Array &)
Definition acir.hpp:8206
std::vector< Acir::HeapValueType > value_types
Definition acir.hpp:1535
void msgpack_pack(auto &packer) const
Definition acir.hpp:1521
friend bool operator==(const Simple &, const Simple &)
Definition acir.hpp:8177
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1523
friend bool operator==(const Vector &, const Vector &)
Definition acir.hpp:8240
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1575
void msgpack_pack(auto &packer) const
Definition acir.hpp:1569
std::vector< Acir::HeapValueType > value_types
Definition acir.hpp:1565
void msgpack_pack(auto &packer) const
Definition acir.hpp:1594
friend bool operator==(const HeapValueType &, const HeapValueType &)
Definition acir.hpp:8145
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1628
std::variant< Simple, Array, Vector > value
Definition acir.hpp:1590
void msgpack_pack(auto &packer) const
Definition acir.hpp:1692
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1699
friend bool operator==(const HeapVector &, const HeapVector &)
Definition acir.hpp:8269
Acir::MemoryAddress size
Definition acir.hpp:1688
Acir::MemoryAddress pointer
Definition acir.hpp:1687
static void conv_fld_from_kvmap(std::map< std::string, msgpack::object const * > const &kvmap, std::string const &struct_name, std::string const &field_name, T &field, bool is_optional)
Definition acir.hpp:27
static std::map< std::string, msgpack::object const * > make_kvmap(msgpack::object const &o, std::string const &name)
Definition acir.hpp:8
static void conv_fld_from_array(msgpack::object_array const &array, std::string const &struct_name, std::string const &field_name, T &field, uint32_t index)
Definition acir.hpp:47
friend bool operator==(const U128 &, const U128 &)
Definition acir.hpp:8453
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:502
void msgpack_pack(auto &packer) const
Definition acir.hpp:501
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:481
friend bool operator==(const U16 &, const U16 &)
Definition acir.hpp:8384
void msgpack_pack(auto &packer) const
Definition acir.hpp:480
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:467
void msgpack_pack(auto &packer) const
Definition acir.hpp:466
friend bool operator==(const U1 &, const U1 &)
Definition acir.hpp:8338
void msgpack_pack(auto &packer) const
Definition acir.hpp:487
friend bool operator==(const U32 &, const U32 &)
Definition acir.hpp:8407
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:488
void msgpack_pack(auto &packer) const
Definition acir.hpp:494
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:495
friend bool operator==(const U64 &, const U64 &)
Definition acir.hpp:8430
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:474
void msgpack_pack(auto &packer) const
Definition acir.hpp:473
friend bool operator==(const U8 &, const U8 &)
Definition acir.hpp:8361
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:555
friend bool operator==(const IntegerBitSize &, const IntegerBitSize &)
Definition acir.hpp:8306
std::variant< U1, U8, U16, U32, U64, U128 > value
Definition acir.hpp:505
void msgpack_pack(auto &packer) const
Definition acir.hpp:509
Acir::Expression value
Definition acir.hpp:4140
friend bool operator==(const MemOp &, const MemOp &)
Definition acir.hpp:8476
void msgpack_pack(auto &packer) const
Definition acir.hpp:4144
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4152
Acir::Expression operation
Definition acir.hpp:4138
Acir::Expression index
Definition acir.hpp:4139
void msgpack_pack(auto &packer) const
Definition acir.hpp:710
friend bool operator==(const Direct &, const Direct &)
Definition acir.hpp:8550
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:712
void msgpack_pack(auto &packer) const
Definition acir.hpp:728
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:730
friend bool operator==(const Relative &, const Relative &)
Definition acir.hpp:8579
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:775
friend bool operator==(const MemoryAddress &, const MemoryAddress &)
Definition acir.hpp:8518
void msgpack_pack(auto &packer) const
Definition acir.hpp:745
std::variant< Direct, Relative > value
Definition acir.hpp:741
void msgpack_pack(auto &packer) const
Definition acir.hpp:4178
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4180
Acir::Expression value
Definition acir.hpp:4174
friend bool operator==(const AssertZero &, const AssertZero &)
Definition acir.hpp:8641
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4198
Acir::BlackBoxFuncCall value
Definition acir.hpp:4192
friend bool operator==(const BlackBoxFuncCall &, const BlackBoxFuncCall &)
Definition acir.hpp:8670
void msgpack_pack(auto &packer) const
Definition acir.hpp:4196
friend bool operator==(const BrilligCall &, const BrilligCall &)
Definition acir.hpp:8772
std::vector< Acir::BrilligInputs > inputs
Definition acir.hpp:4275
Acir::Expression predicate
Definition acir.hpp:4277
void msgpack_pack(auto &packer) const
Definition acir.hpp:4281
std::vector< Acir::BrilligOutputs > outputs
Definition acir.hpp:4276
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4290
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4328
Acir::Expression predicate
Definition acir.hpp:4315
friend bool operator==(const Call &, const Call &)
Definition acir.hpp:8816
void msgpack_pack(auto &packer) const
Definition acir.hpp:4319
std::vector< Acir::Witness > outputs
Definition acir.hpp:4314
std::vector< Acir::Witness > inputs
Definition acir.hpp:4313
Acir::BlockId block_id
Definition acir.hpp:4240
std::vector< Acir::Witness > init
Definition acir.hpp:4241
Acir::BlockType block_type
Definition acir.hpp:4242
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4254
void msgpack_pack(auto &packer) const
Definition acir.hpp:4246
friend bool operator==(const MemoryInit &, const MemoryInit &)
Definition acir.hpp:8733
friend bool operator==(const MemoryOp &, const MemoryOp &)
Definition acir.hpp:8700
void msgpack_pack(auto &packer) const
Definition acir.hpp:4215
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4222
Acir::BlockId block_id
Definition acir.hpp:4210
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:4349
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4399
friend bool operator==(const Opcode &, const Opcode &)
Definition acir.hpp:8609
void msgpack_pack(auto &packer) const
Definition acir.hpp:4353
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4646
friend bool operator==(const Acir &, const Acir &)
Definition acir.hpp:8891
void msgpack_pack(auto &packer) const
Definition acir.hpp:4644
friend bool operator==(const Brillig &, const Brillig &)
Definition acir.hpp:8920
void msgpack_pack(auto &packer) const
Definition acir.hpp:4663
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4670
friend bool operator==(const OpcodeLocation &, const OpcodeLocation &)
Definition acir.hpp:8859
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4721
std::variant< Acir, Brillig > value
Definition acir.hpp:4687
void msgpack_pack(auto &packer) const
Definition acir.hpp:4691
void msgpack_pack(auto &packer) const
Definition acir.hpp:4873
std::vector< Acir::Circuit > functions
Definition acir.hpp:4868
friend bool operator==(const Program &, const Program &)
Definition acir.hpp:8955
std::vector< Acir::BrilligBytecode > unconstrained_functions
Definition acir.hpp:4869
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4880
void msgpack_pack(auto &packer) const
Definition acir.hpp:4903
std::vector< Acir::Circuit > functions
Definition acir.hpp:4898
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4910
std::monostate unconstrained_functions
Definition acir.hpp:4899
friend bool operator==(const ProgramWithoutBrillig &, const ProgramWithoutBrillig &)
Definition acir.hpp:8993
friend bool operator==(const PublicInputs &, const PublicInputs &)
Definition acir.hpp:9032
std::vector< Acir::Witness > value
Definition acir.hpp:4770
void msgpack_pack(auto &packer) const
Definition acir.hpp:4774
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4776
friend bool operator==(const SemanticLength &, const SemanticLength &)
Definition acir.hpp:9064
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1501
void msgpack_pack(auto &packer) const
Definition acir.hpp:1499
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:830
friend bool operator==(const SemiFlattenedLength &, const SemiFlattenedLength &)
Definition acir.hpp:9096
void msgpack_pack(auto &packer) const
Definition acir.hpp:828
void msgpack_pack(auto &packer) const
Definition acir.hpp:1741
friend bool operator==(const HeapArray &, const HeapArray &)
Definition acir.hpp:9191
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1743
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1761
void msgpack_pack(auto &packer) const
Definition acir.hpp:1759
friend bool operator==(const HeapVector &, const HeapVector &)
Definition acir.hpp:9221
void msgpack_pack(auto &packer) const
Definition acir.hpp:1723
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1725
friend bool operator==(const MemoryAddress &, const MemoryAddress &)
Definition acir.hpp:9161
Acir::MemoryAddress value
Definition acir.hpp:1719
void msgpack_pack(auto &packer) const
Definition acir.hpp:1776
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1810
std::variant< MemoryAddress, HeapArray, HeapVector > value
Definition acir.hpp:1772
friend bool operator==(const ValueOrArray &, const ValueOrArray &)
Definition acir.hpp:9129
uint32_t value
Definition acir.hpp:2782
void msgpack_pack(auto &packer) const
Definition acir.hpp:2786
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2788
friend bool operator==(const Witness &, const Witness &)
Definition acir.hpp:9251
static T deserialize(Deserializer &deserializer)
static void serialize(const T &value, Serializer &serializer)
void throw_or_abort(std::string const &err)