Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir.hpp
Go to the documentation of this file.
1// AUTO-GENERATED — DO NOT EDIT.
2//
3// Generated by the `cpp_codegen` tests in `acvm-repo/acir/src/lib.rs`.
4// To regenerate, run:
5//
6// NOIR_CODEGEN_OVERWRITE=1 cargo test -p acir cpp_codegen
7//
8#pragma once
9
11#include "serde.hpp"
12
13namespace Acir {
14struct Helpers {
15 static std::map<std::string, msgpack::object const*> make_kvmap(msgpack::object const& o, std::string const& name)
16 {
17 if (o.type != msgpack::type::MAP) {
18 std::cerr << o << std::endl;
19 throw_or_abort("expected MAP for " + name);
20 }
22 for (uint32_t i = 0; i < o.via.map.size; ++i) {
23 if (o.via.map.ptr[i].key.type != msgpack::type::STR) {
24 std::cerr << o << std::endl;
25 throw_or_abort("expected STR for keys of " + name);
26 }
27 kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size),
28 &o.via.map.ptr[i].val);
29 }
30 return kvmap;
31 }
32
33 template <typename T>
35 std::string const& struct_name,
36 std::string const& field_name,
37 T& field,
38 bool is_optional)
39 {
40 auto it = kvmap.find(field_name);
41 if (it != kvmap.end()) {
42 if (!is_optional && it->second->type == msgpack::type::NIL) {
43 throw_or_abort("nil value for required field: " + struct_name + "::" + field_name);
44 }
45 try {
46 it->second->convert(field);
47 } catch (const msgpack::type_error&) {
48 std::cerr << *it->second << std::endl;
49 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
50 }
51 } else if (!is_optional) {
52 throw_or_abort("missing field: " + struct_name + "::" + field_name);
53 }
54 }
55
56 template <typename T>
57 static void conv_fld_from_array(msgpack::object_array const& array,
58 std::string const& struct_name,
59 std::string const& field_name,
60 T& field,
61 uint32_t index)
62 {
63 if (index >= array.size) {
64 throw_or_abort("index out of bounds: " + struct_name + "::" + field_name + " at " + std::to_string(index));
65 }
66 auto element = array.ptr[index];
67 if (element.type == msgpack::type::NIL) {
68 throw_or_abort("nil value for required field: " + struct_name + "::" + field_name);
69 }
70 try {
71 element.convert(field);
72 } catch (const msgpack::type_error&) {
73 std::cerr << element << std::endl;
74 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
75 }
76 }
77
81 template <typename T>
82 static void convert_or_throw(msgpack::object const& val,
83 std::string const& struct_name,
84 std::string const& field_name,
85 T& field)
86 {
87 try {
88 val.convert(field);
89 } catch (const msgpack::type_error&) {
90 std::cerr << val << std::endl;
91 throw_or_abort("error converting into field " + struct_name + "::" + field_name);
92 }
93 }
94
100 static bool is_int_keyed_map(msgpack::object const& o)
101 {
102 return o.type == msgpack::type::MAP && o.via.map.size > 0 &&
103 o.via.map.ptr[0].key.type == msgpack::type::POSITIVE_INTEGER;
104 }
105
112 template <typename Dispatch>
113 static void int_map_dispatch(msgpack::object const& o, std::string const& name, Dispatch&& dispatch)
114 {
115 for (uint32_t i = 0; i < o.via.map.size; ++i) {
116 uint8_t tag;
117 try {
118 o.via.map.ptr[i].key.convert(tag);
119 } catch (const msgpack::type_error&) {
120 std::cerr << o.via.map.ptr[i].key << std::endl;
121 throw_or_abort("expected u8 tag in int-keyed map for " + name);
122 }
123 dispatch(tag, o.via.map.ptr[i].val);
124 }
125 }
126
138 static void check_size(uint32_t actual, std::string const& name, uint32_t active, uint32_t reserved)
139 {
140 uint32_t max_size = active + reserved;
141 if (actual > max_size) {
142 throw_or_abort(name + " has " + std::to_string(actual) + " entries but at most " +
143 std::to_string(max_size) + " are expected (" + std::to_string(active) + " active + " +
144 std::to_string(reserved) +
145 " reserved); opt into `#[tagged(allow_unknown_tags)]` on the Rust type to accept extras");
146 }
147 }
148};
149} // namespace Acir
150
151namespace Acir {
152
154
155 struct Add {
156 friend bool operator==(const Add&, const Add&);
157
158 void msgpack_pack(auto& packer) const {}
159 void msgpack_unpack(msgpack::object const& o) {}
160 };
161
162 struct Sub {
163 friend bool operator==(const Sub&, const Sub&);
164
165 void msgpack_pack(auto& packer) const {}
166 void msgpack_unpack(msgpack::object const& o) {}
167 };
168
169 struct Mul {
170 friend bool operator==(const Mul&, const Mul&);
171
172 void msgpack_pack(auto& packer) const {}
173 void msgpack_unpack(msgpack::object const& o) {}
174 };
175
176 struct Div {
177 friend bool operator==(const Div&, const Div&);
178
179 void msgpack_pack(auto& packer) const {}
180 void msgpack_unpack(msgpack::object const& o) {}
181 };
182
183 struct IntegerDiv {
184 friend bool operator==(const IntegerDiv&, const IntegerDiv&);
185
186 void msgpack_pack(auto& packer) const {}
187 void msgpack_unpack(msgpack::object const& o) {}
188 };
189
190 struct Equals {
191 friend bool operator==(const Equals&, const Equals&);
192
193 void msgpack_pack(auto& packer) const {}
194 void msgpack_unpack(msgpack::object const& o) {}
195 };
196
197 struct LessThan {
198 friend bool operator==(const LessThan&, const LessThan&);
199
200 void msgpack_pack(auto& packer) const {}
201 void msgpack_unpack(msgpack::object const& o) {}
202 };
203
205 friend bool operator==(const LessThanEquals&, const LessThanEquals&);
206
207 void msgpack_pack(auto& packer) const {}
208 void msgpack_unpack(msgpack::object const& o) {}
209 };
210
212
213 friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&);
214
215 void msgpack_pack(auto& packer) const
216 {
217 std::string tag;
218 bool is_unit;
219 switch (value.index()) {
220
221 case 0:
222 tag = "Add";
223 is_unit = true;
224 break;
225 case 1:
226 tag = "Sub";
227 is_unit = true;
228 break;
229 case 2:
230 tag = "Mul";
231 is_unit = true;
232 break;
233 case 3:
234 tag = "Div";
235 is_unit = true;
236 break;
237 case 4:
238 tag = "IntegerDiv";
239 is_unit = true;
240 break;
241 case 5:
242 tag = "Equals";
243 is_unit = true;
244 break;
245 case 6:
246 tag = "LessThan";
247 is_unit = true;
248 break;
249 case 7:
250 tag = "LessThanEquals";
251 is_unit = true;
252 break;
253 default:
254 throw_or_abort("unknown enum 'BinaryFieldOp' variant index: " + std::to_string(value.index()));
255 }
256 if (is_unit) {
257 packer.pack(tag);
258 } else {
259 std::visit(
260 [&packer, tag](const auto& arg) {
261 packer.pack_map(1);
262 packer.pack(tag);
263 packer.pack(arg);
264 },
265 value);
266 }
267 }
268
269 void msgpack_unpack(msgpack::object const& o)
270 {
271
272 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
273 std::cerr << o << std::endl;
274 throw_or_abort("expected MAP or STR for enum 'BinaryFieldOp'; got type " + std::to_string(o.type));
275 }
276 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
277 throw_or_abort("expected 1 entry for enum 'BinaryFieldOp'; got " + std::to_string(o.via.map.size));
278 }
280 // `Format::MsgpackTagged` — int-keyed variant.
281 uint8_t tag;
282 try {
283 o.via.map.ptr[0].key.convert(tag);
284 } catch (const msgpack::type_error&) {
285 std::cerr << o << std::endl;
286 throw_or_abort("expected u8 variant tag for enum 'BinaryFieldOp'");
287 }
288 switch (tag) {
289 case 0: {
290 Add v;
291 value = v;
292 break;
293 }
294 case 1: {
295 Sub v;
296 value = v;
297 break;
298 }
299 case 2: {
300 Mul v;
301 value = v;
302 break;
303 }
304 case 3: {
305 Div v;
306 value = v;
307 break;
308 }
309 case 4: {
310 IntegerDiv v;
311 value = v;
312 break;
313 }
314 case 5: {
315 Equals v;
316 value = v;
317 break;
318 }
319 case 6: {
320 LessThan v;
321 value = v;
322 break;
323 }
324 case 7: {
326 value = v;
327 break;
328 }
329 default:
330 std::cerr << o << std::endl;
331 throw_or_abort("unknown 'BinaryFieldOp' enum variant tag: " + std::to_string(tag));
332 }
333 } else {
334 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
335 // unit variant (bare STR) — both dispatch on the variant name.
336 std::string tag;
337 try {
338 if (o.type == msgpack::type::object_type::MAP) {
339 o.via.map.ptr[0].key.convert(tag);
340 } else {
341 o.convert(tag);
342 }
343 } catch (const msgpack::type_error&) {
344 std::cerr << o << std::endl;
345 throw_or_abort("error converting tag to string for enum 'BinaryFieldOp'");
346 }
347 if (tag == "Add") {
348 Add v;
349 value = v;
350 } else if (tag == "Sub") {
351 Sub v;
352 value = v;
353 } else if (tag == "Mul") {
354 Mul v;
355 value = v;
356 } else if (tag == "Div") {
357 Div v;
358 value = v;
359 } else if (tag == "IntegerDiv") {
360 IntegerDiv v;
361 value = v;
362 } else if (tag == "Equals") {
363 Equals v;
364 value = v;
365 } else if (tag == "LessThan") {
366 LessThan v;
367 value = v;
368 } else if (tag == "LessThanEquals") {
370 value = v;
371 } else {
372 std::cerr << o << std::endl;
373 throw_or_abort("unknown 'BinaryFieldOp' enum variant: " + tag);
374 }
375 }
376 }
377};
378
380
381 struct Add {
382 friend bool operator==(const Add&, const Add&);
383
384 void msgpack_pack(auto& packer) const {}
385 void msgpack_unpack(msgpack::object const& o) {}
386 };
387
388 struct Sub {
389 friend bool operator==(const Sub&, const Sub&);
390
391 void msgpack_pack(auto& packer) const {}
392 void msgpack_unpack(msgpack::object const& o) {}
393 };
394
395 struct Mul {
396 friend bool operator==(const Mul&, const Mul&);
397
398 void msgpack_pack(auto& packer) const {}
399 void msgpack_unpack(msgpack::object const& o) {}
400 };
401
402 struct Div {
403 friend bool operator==(const Div&, const Div&);
404
405 void msgpack_pack(auto& packer) const {}
406 void msgpack_unpack(msgpack::object const& o) {}
407 };
408
409 struct Equals {
410 friend bool operator==(const Equals&, const Equals&);
411
412 void msgpack_pack(auto& packer) const {}
413 void msgpack_unpack(msgpack::object const& o) {}
414 };
415
416 struct LessThan {
417 friend bool operator==(const LessThan&, const LessThan&);
418
419 void msgpack_pack(auto& packer) const {}
420 void msgpack_unpack(msgpack::object const& o) {}
421 };
422
424 friend bool operator==(const LessThanEquals&, const LessThanEquals&);
425
426 void msgpack_pack(auto& packer) const {}
427 void msgpack_unpack(msgpack::object const& o) {}
428 };
429
430 struct And {
431 friend bool operator==(const And&, const And&);
432
433 void msgpack_pack(auto& packer) const {}
434 void msgpack_unpack(msgpack::object const& o) {}
435 };
436
437 struct Or {
438 friend bool operator==(const Or&, const Or&);
439
440 void msgpack_pack(auto& packer) const {}
441 void msgpack_unpack(msgpack::object const& o) {}
442 };
443
444 struct Xor {
445 friend bool operator==(const Xor&, const Xor&);
446
447 void msgpack_pack(auto& packer) const {}
448 void msgpack_unpack(msgpack::object const& o) {}
449 };
450
451 struct Shl {
452 friend bool operator==(const Shl&, const Shl&);
453
454 void msgpack_pack(auto& packer) const {}
455 void msgpack_unpack(msgpack::object const& o) {}
456 };
457
458 struct Shr {
459 friend bool operator==(const Shr&, const Shr&);
460
461 void msgpack_pack(auto& packer) const {}
462 void msgpack_unpack(msgpack::object const& o) {}
463 };
464
466
467 friend bool operator==(const BinaryIntOp&, const BinaryIntOp&);
468
469 void msgpack_pack(auto& packer) const
470 {
471 std::string tag;
472 bool is_unit;
473 switch (value.index()) {
474
475 case 0:
476 tag = "Add";
477 is_unit = true;
478 break;
479 case 1:
480 tag = "Sub";
481 is_unit = true;
482 break;
483 case 2:
484 tag = "Mul";
485 is_unit = true;
486 break;
487 case 3:
488 tag = "Div";
489 is_unit = true;
490 break;
491 case 4:
492 tag = "Equals";
493 is_unit = true;
494 break;
495 case 5:
496 tag = "LessThan";
497 is_unit = true;
498 break;
499 case 6:
500 tag = "LessThanEquals";
501 is_unit = true;
502 break;
503 case 7:
504 tag = "And";
505 is_unit = true;
506 break;
507 case 8:
508 tag = "Or";
509 is_unit = true;
510 break;
511 case 9:
512 tag = "Xor";
513 is_unit = true;
514 break;
515 case 10:
516 tag = "Shl";
517 is_unit = true;
518 break;
519 case 11:
520 tag = "Shr";
521 is_unit = true;
522 break;
523 default:
524 throw_or_abort("unknown enum 'BinaryIntOp' variant index: " + std::to_string(value.index()));
525 }
526 if (is_unit) {
527 packer.pack(tag);
528 } else {
529 std::visit(
530 [&packer, tag](const auto& arg) {
531 packer.pack_map(1);
532 packer.pack(tag);
533 packer.pack(arg);
534 },
535 value);
536 }
537 }
538
539 void msgpack_unpack(msgpack::object const& o)
540 {
541
542 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
543 std::cerr << o << std::endl;
544 throw_or_abort("expected MAP or STR for enum 'BinaryIntOp'; got type " + std::to_string(o.type));
545 }
546 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
547 throw_or_abort("expected 1 entry for enum 'BinaryIntOp'; got " + std::to_string(o.via.map.size));
548 }
550 // `Format::MsgpackTagged` — int-keyed variant.
551 uint8_t tag;
552 try {
553 o.via.map.ptr[0].key.convert(tag);
554 } catch (const msgpack::type_error&) {
555 std::cerr << o << std::endl;
556 throw_or_abort("expected u8 variant tag for enum 'BinaryIntOp'");
557 }
558 switch (tag) {
559 case 0: {
560 Add v;
561 value = v;
562 break;
563 }
564 case 1: {
565 Sub v;
566 value = v;
567 break;
568 }
569 case 2: {
570 Mul v;
571 value = v;
572 break;
573 }
574 case 3: {
575 Div v;
576 value = v;
577 break;
578 }
579 case 4: {
580 Equals v;
581 value = v;
582 break;
583 }
584 case 5: {
585 LessThan v;
586 value = v;
587 break;
588 }
589 case 6: {
591 value = v;
592 break;
593 }
594 case 7: {
595 And v;
596 value = v;
597 break;
598 }
599 case 8: {
600 Or v;
601 value = v;
602 break;
603 }
604 case 9: {
605 Xor v;
606 value = v;
607 break;
608 }
609 case 10: {
610 Shl v;
611 value = v;
612 break;
613 }
614 case 11: {
615 Shr v;
616 value = v;
617 break;
618 }
619 default:
620 std::cerr << o << std::endl;
621 throw_or_abort("unknown 'BinaryIntOp' enum variant tag: " + std::to_string(tag));
622 }
623 } else {
624 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
625 // unit variant (bare STR) — both dispatch on the variant name.
626 std::string tag;
627 try {
628 if (o.type == msgpack::type::object_type::MAP) {
629 o.via.map.ptr[0].key.convert(tag);
630 } else {
631 o.convert(tag);
632 }
633 } catch (const msgpack::type_error&) {
634 std::cerr << o << std::endl;
635 throw_or_abort("error converting tag to string for enum 'BinaryIntOp'");
636 }
637 if (tag == "Add") {
638 Add v;
639 value = v;
640 } else if (tag == "Sub") {
641 Sub v;
642 value = v;
643 } else if (tag == "Mul") {
644 Mul v;
645 value = v;
646 } else if (tag == "Div") {
647 Div v;
648 value = v;
649 } else if (tag == "Equals") {
650 Equals v;
651 value = v;
652 } else if (tag == "LessThan") {
653 LessThan v;
654 value = v;
655 } else if (tag == "LessThanEquals") {
657 value = v;
658 } else if (tag == "And") {
659 And v;
660 value = v;
661 } else if (tag == "Or") {
662 Or v;
663 value = v;
664 } else if (tag == "Xor") {
665 Xor v;
666 value = v;
667 } else if (tag == "Shl") {
668 Shl v;
669 value = v;
670 } else if (tag == "Shr") {
671 Shr v;
672 value = v;
673 } else {
674 std::cerr << o << std::endl;
675 throw_or_abort("unknown 'BinaryIntOp' enum variant: " + tag);
676 }
677 }
678 }
679};
680
682
683 struct U1 {
684 friend bool operator==(const U1&, const U1&);
685
686 void msgpack_pack(auto& packer) const {}
687 void msgpack_unpack(msgpack::object const& o) {}
688 };
689
690 struct U8 {
691 friend bool operator==(const U8&, const U8&);
692
693 void msgpack_pack(auto& packer) const {}
694 void msgpack_unpack(msgpack::object const& o) {}
695 };
696
697 struct U16 {
698 friend bool operator==(const U16&, const U16&);
699
700 void msgpack_pack(auto& packer) const {}
701 void msgpack_unpack(msgpack::object const& o) {}
702 };
703
704 struct U32 {
705 friend bool operator==(const U32&, const U32&);
706
707 void msgpack_pack(auto& packer) const {}
708 void msgpack_unpack(msgpack::object const& o) {}
709 };
710
711 struct U64 {
712 friend bool operator==(const U64&, const U64&);
713
714 void msgpack_pack(auto& packer) const {}
715 void msgpack_unpack(msgpack::object const& o) {}
716 };
717
718 struct U128 {
719 friend bool operator==(const U128&, const U128&);
720
721 void msgpack_pack(auto& packer) const {}
722 void msgpack_unpack(msgpack::object const& o) {}
723 };
724
726
727 friend bool operator==(const IntegerBitSize&, const IntegerBitSize&);
728
729 void msgpack_pack(auto& packer) const
730 {
731 std::string tag;
732 bool is_unit;
733 switch (value.index()) {
734
735 case 0:
736 tag = "U1";
737 is_unit = true;
738 break;
739 case 1:
740 tag = "U8";
741 is_unit = true;
742 break;
743 case 2:
744 tag = "U16";
745 is_unit = true;
746 break;
747 case 3:
748 tag = "U32";
749 is_unit = true;
750 break;
751 case 4:
752 tag = "U64";
753 is_unit = true;
754 break;
755 case 5:
756 tag = "U128";
757 is_unit = true;
758 break;
759 default:
760 throw_or_abort("unknown enum 'IntegerBitSize' 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 'IntegerBitSize'; 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 'IntegerBitSize'; got " + std::to_string(o.via.map.size));
784 }
786 // `Format::MsgpackTagged` — int-keyed variant.
787 uint8_t tag;
788 try {
789 o.via.map.ptr[0].key.convert(tag);
790 } catch (const msgpack::type_error&) {
791 std::cerr << o << std::endl;
792 throw_or_abort("expected u8 variant tag for enum 'IntegerBitSize'");
793 }
794 switch (tag) {
795 case 0: {
796 U1 v;
797 value = v;
798 break;
799 }
800 case 1: {
801 U8 v;
802 value = v;
803 break;
804 }
805 case 2: {
806 U16 v;
807 value = v;
808 break;
809 }
810 case 3: {
811 U32 v;
812 value = v;
813 break;
814 }
815 case 4: {
816 U64 v;
817 value = v;
818 break;
819 }
820 case 5: {
821 U128 v;
822 value = v;
823 break;
824 }
825 default:
826 std::cerr << o << std::endl;
827 throw_or_abort("unknown 'IntegerBitSize' enum variant tag: " + std::to_string(tag));
828 }
829 } else {
830 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
831 // unit variant (bare STR) — both dispatch on the variant name.
832 std::string tag;
833 try {
834 if (o.type == msgpack::type::object_type::MAP) {
835 o.via.map.ptr[0].key.convert(tag);
836 } else {
837 o.convert(tag);
838 }
839 } catch (const msgpack::type_error&) {
840 std::cerr << o << std::endl;
841 throw_or_abort("error converting tag to string for enum 'IntegerBitSize'");
842 }
843 if (tag == "U1") {
844 U1 v;
845 value = v;
846 } else if (tag == "U8") {
847 U8 v;
848 value = v;
849 } else if (tag == "U16") {
850 U16 v;
851 value = v;
852 } else if (tag == "U32") {
853 U32 v;
854 value = v;
855 } else if (tag == "U64") {
856 U64 v;
857 value = v;
858 } else if (tag == "U128") {
859 U128 v;
860 value = v;
861 } else {
862 std::cerr << o << std::endl;
863 throw_or_abort("unknown 'IntegerBitSize' enum variant: " + tag);
864 }
865 }
866 }
867};
868
869struct BitSize {
870
871 struct Field {
872 friend bool operator==(const Field&, const Field&);
873
874 void msgpack_pack(auto& packer) const {}
875 void msgpack_unpack(msgpack::object const& o) {}
876 };
877
878 struct Integer {
880
881 friend bool operator==(const Integer&, const Integer&);
882
883 void msgpack_pack(auto& packer) const { packer.pack(value); }
884
885 void msgpack_unpack(msgpack::object const& o)
886 {
887 try {
888 o.convert(value);
889 } catch (const msgpack::type_error&) {
890 std::cerr << o << std::endl;
891 throw_or_abort("error converting into newtype 'Integer'");
892 }
893 }
894 };
895
897
898 friend bool operator==(const BitSize&, const BitSize&);
899
900 void msgpack_pack(auto& packer) const
901 {
902 std::string tag;
903 bool is_unit;
904 switch (value.index()) {
905
906 case 0:
907 tag = "Field";
908 is_unit = true;
909 break;
910 case 1:
911 tag = "Integer";
912 is_unit = false;
913 break;
914 default:
915 throw_or_abort("unknown enum 'BitSize' variant index: " + std::to_string(value.index()));
916 }
917 if (is_unit) {
918 packer.pack(tag);
919 } else {
920 std::visit(
921 [&packer, tag](const auto& arg) {
922 packer.pack_map(1);
923 packer.pack(tag);
924 packer.pack(arg);
925 },
926 value);
927 }
928 }
929
930 void msgpack_unpack(msgpack::object const& o)
931 {
932
933 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
934 std::cerr << o << std::endl;
935 throw_or_abort("expected MAP or STR for enum 'BitSize'; got type " + std::to_string(o.type));
936 }
937 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
938 throw_or_abort("expected 1 entry for enum 'BitSize'; got " + std::to_string(o.via.map.size));
939 }
941 // `Format::MsgpackTagged` — int-keyed variant.
942 uint8_t tag;
943 try {
944 o.via.map.ptr[0].key.convert(tag);
945 } catch (const msgpack::type_error&) {
946 std::cerr << o << std::endl;
947 throw_or_abort("expected u8 variant tag for enum 'BitSize'");
948 }
949 switch (tag) {
950 case 0: {
951 Field v;
952 value = v;
953 break;
954 }
955 case 1: {
956 Integer v;
957 try {
958 o.via.map.ptr[0].val.convert(v);
959 } catch (const msgpack::type_error&) {
960 std::cerr << o << std::endl;
961 throw_or_abort("error converting into enum variant 'BitSize::Integer'");
962 }
963 value = v;
964 break;
965 }
966 default:
967 std::cerr << o << std::endl;
968 throw_or_abort("unknown 'BitSize' enum variant tag: " + std::to_string(tag));
969 }
970 } else {
971 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
972 // unit variant (bare STR) — both dispatch on the variant name.
973 std::string tag;
974 try {
975 if (o.type == msgpack::type::object_type::MAP) {
976 o.via.map.ptr[0].key.convert(tag);
977 } else {
978 o.convert(tag);
979 }
980 } catch (const msgpack::type_error&) {
981 std::cerr << o << std::endl;
982 throw_or_abort("error converting tag to string for enum 'BitSize'");
983 }
984 if (tag == "Field") {
985 Field v;
986 value = v;
987 } else if (tag == "Integer") {
988 Integer v;
989 try {
990 o.via.map.ptr[0].val.convert(v);
991 } catch (const msgpack::type_error&) {
992 std::cerr << o << std::endl;
993 throw_or_abort("error converting into enum variant 'BitSize::Integer'");
994 }
995
996 value = v;
997 } else {
998 std::cerr << o << std::endl;
999 throw_or_abort("unknown 'BitSize' enum variant: " + tag);
1000 }
1001 }
1002 }
1003};
1004
1006
1007 struct Direct {
1008 uint32_t value;
1009
1010 friend bool operator==(const Direct&, const Direct&);
1011
1012 void msgpack_pack(auto& packer) const { packer.pack(value); }
1013
1014 void msgpack_unpack(msgpack::object const& o)
1015 {
1016 try {
1017 o.convert(value);
1018 } catch (const msgpack::type_error&) {
1019 std::cerr << o << std::endl;
1020 throw_or_abort("error converting into newtype 'Direct'");
1021 }
1022 }
1023 };
1024
1025 struct Relative {
1026 uint32_t value;
1027
1028 friend bool operator==(const Relative&, const Relative&);
1029
1030 void msgpack_pack(auto& packer) const { packer.pack(value); }
1031
1032 void msgpack_unpack(msgpack::object const& o)
1033 {
1034 try {
1035 o.convert(value);
1036 } catch (const msgpack::type_error&) {
1037 std::cerr << o << std::endl;
1038 throw_or_abort("error converting into newtype 'Relative'");
1039 }
1040 }
1041 };
1042
1044
1045 friend bool operator==(const MemoryAddress&, const MemoryAddress&);
1046
1047 void msgpack_pack(auto& packer) const
1048 {
1049 std::string tag;
1050 bool is_unit;
1051 switch (value.index()) {
1052
1053 case 0:
1054 tag = "Direct";
1055 is_unit = false;
1056 break;
1057 case 1:
1058 tag = "Relative";
1059 is_unit = false;
1060 break;
1061 default:
1062 throw_or_abort("unknown enum 'MemoryAddress' variant index: " + std::to_string(value.index()));
1063 }
1064 if (is_unit) {
1065 packer.pack(tag);
1066 } else {
1067 std::visit(
1068 [&packer, tag](const auto& arg) {
1069 packer.pack_map(1);
1070 packer.pack(tag);
1071 packer.pack(arg);
1072 },
1073 value);
1074 }
1075 }
1076
1077 void msgpack_unpack(msgpack::object const& o)
1078 {
1079
1080 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
1081 std::cerr << o << std::endl;
1082 throw_or_abort("expected MAP or STR for enum 'MemoryAddress'; got type " + std::to_string(o.type));
1083 }
1084 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
1085 throw_or_abort("expected 1 entry for enum 'MemoryAddress'; got " + std::to_string(o.via.map.size));
1086 }
1088 // `Format::MsgpackTagged` — int-keyed variant.
1089 uint8_t tag;
1090 try {
1091 o.via.map.ptr[0].key.convert(tag);
1092 } catch (const msgpack::type_error&) {
1093 std::cerr << o << std::endl;
1094 throw_or_abort("expected u8 variant tag for enum 'MemoryAddress'");
1095 }
1096 switch (tag) {
1097 case 0: {
1098 Direct v;
1099 try {
1100 o.via.map.ptr[0].val.convert(v);
1101 } catch (const msgpack::type_error&) {
1102 std::cerr << o << std::endl;
1103 throw_or_abort("error converting into enum variant 'MemoryAddress::Direct'");
1104 }
1105 value = v;
1106 break;
1107 }
1108 case 1: {
1109 Relative v;
1110 try {
1111 o.via.map.ptr[0].val.convert(v);
1112 } catch (const msgpack::type_error&) {
1113 std::cerr << o << std::endl;
1114 throw_or_abort("error converting into enum variant 'MemoryAddress::Relative'");
1115 }
1116 value = v;
1117 break;
1118 }
1119 default:
1120 std::cerr << o << std::endl;
1121 throw_or_abort("unknown 'MemoryAddress' enum variant tag: " + std::to_string(tag));
1122 }
1123 } else {
1124 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
1125 // unit variant (bare STR) — both dispatch on the variant name.
1126 std::string tag;
1127 try {
1128 if (o.type == msgpack::type::object_type::MAP) {
1129 o.via.map.ptr[0].key.convert(tag);
1130 } else {
1131 o.convert(tag);
1132 }
1133 } catch (const msgpack::type_error&) {
1134 std::cerr << o << std::endl;
1135 throw_or_abort("error converting tag to string for enum 'MemoryAddress'");
1136 }
1137 if (tag == "Direct") {
1138 Direct v;
1139 try {
1140 o.via.map.ptr[0].val.convert(v);
1141 } catch (const msgpack::type_error&) {
1142 std::cerr << o << std::endl;
1143 throw_or_abort("error converting into enum variant 'MemoryAddress::Direct'");
1144 }
1145
1146 value = v;
1147 } else if (tag == "Relative") {
1148 Relative v;
1149 try {
1150 o.via.map.ptr[0].val.convert(v);
1151 } catch (const msgpack::type_error&) {
1152 std::cerr << o << std::endl;
1153 throw_or_abort("error converting into enum variant 'MemoryAddress::Relative'");
1154 }
1155
1156 value = v;
1157 } else {
1158 std::cerr << o << std::endl;
1159 throw_or_abort("unknown 'MemoryAddress' enum variant: " + tag);
1160 }
1161 }
1162 }
1163};
1164
1166 uint32_t value;
1167
1168 friend bool operator==(const SemiFlattenedLength&, const SemiFlattenedLength&);
1169
1170 void msgpack_pack(auto& packer) const { packer.pack(value); }
1171
1172 void msgpack_unpack(msgpack::object const& o)
1173 {
1174 try {
1175 o.convert(value);
1176 } catch (const msgpack::type_error&) {
1177 std::cerr << o << std::endl;
1178 throw_or_abort("error converting into newtype 'SemiFlattenedLength'");
1179 }
1180 }
1181};
1182
1186
1187 friend bool operator==(const HeapArray&, const HeapArray&);
1188
1189 void msgpack_pack(auto& packer) const
1190 {
1191 packer.pack_array(2);
1192 packer.pack(pointer);
1193 packer.pack(size);
1194 }
1195
1196 void msgpack_unpack(msgpack::object const& o)
1197 {
1198 std::string name = "HeapArray";
1199 if (o.type == msgpack::type::MAP) {
1201 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1202 switch (tag) {
1203 case 0:
1204 Helpers::convert_or_throw(val, name, "pointer", pointer);
1205 break;
1206 case 1:
1207 Helpers::convert_or_throw(val, name, "size", size);
1208 break;
1209 default:
1210 std::cerr << val << std::endl;
1211 throw_or_abort("unknown tag for HeapArray: " + std::to_string(tag));
1212 }
1213 });
1214 } else {
1215 Helpers::check_size(o.via.map.size, name, 2, 0);
1216 auto kvmap = Helpers::make_kvmap(o, name);
1217 Helpers::conv_fld_from_kvmap(kvmap, name, "pointer", pointer, false);
1218 Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false);
1219 }
1220 } else if (o.type == msgpack::type::ARRAY) {
1221 auto array = o.via.array;
1222 Helpers::check_size(array.size, name, 2, 0);
1223 Helpers::conv_fld_from_array(array, name, "pointer", pointer, 0);
1224 Helpers::conv_fld_from_array(array, name, "size", size, 1);
1225 } else {
1226 throw_or_abort("expected MAP or ARRAY for " + name);
1227 }
1228 }
1229};
1230
1232
1238
1239 friend bool operator==(const AES128Encrypt&, const AES128Encrypt&);
1240
1241 void msgpack_pack(auto& packer) const
1242 {
1243 packer.pack_array(4);
1244 packer.pack(inputs);
1245 packer.pack(iv);
1246 packer.pack(key);
1247 packer.pack(outputs);
1248 }
1249
1250 void msgpack_unpack(msgpack::object const& o)
1251 {
1252 std::string name = "AES128Encrypt";
1253 if (o.type == msgpack::type::MAP) {
1255 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1256 switch (tag) {
1257 case 0:
1258 Helpers::convert_or_throw(val, name, "inputs", inputs);
1259 break;
1260 case 1:
1261 Helpers::convert_or_throw(val, name, "iv", iv);
1262 break;
1263 case 2:
1264 Helpers::convert_or_throw(val, name, "key", key);
1265 break;
1266 case 3:
1267 Helpers::convert_or_throw(val, name, "outputs", outputs);
1268 break;
1269 default:
1270 std::cerr << val << std::endl;
1271 throw_or_abort("unknown tag for AES128Encrypt: " + std::to_string(tag));
1272 }
1273 });
1274 } else {
1275 Helpers::check_size(o.via.map.size, name, 4, 0);
1276 auto kvmap = Helpers::make_kvmap(o, name);
1277 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
1278 Helpers::conv_fld_from_kvmap(kvmap, name, "iv", iv, false);
1279 Helpers::conv_fld_from_kvmap(kvmap, name, "key", key, false);
1280 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
1281 }
1282 } else if (o.type == msgpack::type::ARRAY) {
1283 auto array = o.via.array;
1284 Helpers::check_size(array.size, name, 4, 0);
1285 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
1286 Helpers::conv_fld_from_array(array, name, "iv", iv, 1);
1287 Helpers::conv_fld_from_array(array, name, "key", key, 2);
1288 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
1289 } else {
1290 throw_or_abort("expected MAP or ARRAY for " + name);
1291 }
1292 }
1293 };
1294
1295 struct Blake2s {
1298
1299 friend bool operator==(const Blake2s&, const Blake2s&);
1300
1301 void msgpack_pack(auto& packer) const
1302 {
1303 packer.pack_array(2);
1304 packer.pack(message);
1305 packer.pack(output);
1306 }
1307
1308 void msgpack_unpack(msgpack::object const& o)
1309 {
1310 std::string name = "Blake2s";
1311 if (o.type == msgpack::type::MAP) {
1313 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1314 switch (tag) {
1315 case 0:
1316 Helpers::convert_or_throw(val, name, "message", message);
1317 break;
1318 case 1:
1319 Helpers::convert_or_throw(val, name, "output", output);
1320 break;
1321 default:
1322 std::cerr << val << std::endl;
1323 throw_or_abort("unknown tag for Blake2s: " + std::to_string(tag));
1324 }
1325 });
1326 } else {
1327 Helpers::check_size(o.via.map.size, name, 2, 0);
1328 auto kvmap = Helpers::make_kvmap(o, name);
1329 Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false);
1330 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1331 }
1332 } else if (o.type == msgpack::type::ARRAY) {
1333 auto array = o.via.array;
1334 Helpers::check_size(array.size, name, 2, 0);
1335 Helpers::conv_fld_from_array(array, name, "message", message, 0);
1336 Helpers::conv_fld_from_array(array, name, "output", output, 1);
1337 } else {
1338 throw_or_abort("expected MAP or ARRAY for " + name);
1339 }
1340 }
1341 };
1342
1343 struct Blake3 {
1346
1347 friend bool operator==(const Blake3&, const Blake3&);
1348
1349 void msgpack_pack(auto& packer) const
1350 {
1351 packer.pack_array(2);
1352 packer.pack(message);
1353 packer.pack(output);
1354 }
1355
1356 void msgpack_unpack(msgpack::object const& o)
1357 {
1358 std::string name = "Blake3";
1359 if (o.type == msgpack::type::MAP) {
1361 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1362 switch (tag) {
1363 case 0:
1364 Helpers::convert_or_throw(val, name, "message", message);
1365 break;
1366 case 1:
1367 Helpers::convert_or_throw(val, name, "output", output);
1368 break;
1369 default:
1370 std::cerr << val << std::endl;
1371 throw_or_abort("unknown tag for Blake3: " + std::to_string(tag));
1372 }
1373 });
1374 } else {
1375 Helpers::check_size(o.via.map.size, name, 2, 0);
1376 auto kvmap = Helpers::make_kvmap(o, name);
1377 Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false);
1378 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1379 }
1380 } else if (o.type == msgpack::type::ARRAY) {
1381 auto array = o.via.array;
1382 Helpers::check_size(array.size, name, 2, 0);
1383 Helpers::conv_fld_from_array(array, name, "message", message, 0);
1384 Helpers::conv_fld_from_array(array, name, "output", output, 1);
1385 } else {
1386 throw_or_abort("expected MAP or ARRAY for " + name);
1387 }
1388 }
1389 };
1390
1394
1395 friend bool operator==(const Keccakf1600&, const Keccakf1600&);
1396
1397 void msgpack_pack(auto& packer) const
1398 {
1399 packer.pack_array(2);
1400 packer.pack(input);
1401 packer.pack(output);
1402 }
1403
1404 void msgpack_unpack(msgpack::object const& o)
1405 {
1406 std::string name = "Keccakf1600";
1407 if (o.type == msgpack::type::MAP) {
1409 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1410 switch (tag) {
1411 case 0:
1412 Helpers::convert_or_throw(val, name, "input", input);
1413 break;
1414 case 1:
1415 Helpers::convert_or_throw(val, name, "output", output);
1416 break;
1417 default:
1418 std::cerr << val << std::endl;
1419 throw_or_abort("unknown tag for Keccakf1600: " + std::to_string(tag));
1420 }
1421 });
1422 } else {
1423 Helpers::check_size(o.via.map.size, name, 2, 0);
1424 auto kvmap = Helpers::make_kvmap(o, name);
1425 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
1426 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1427 }
1428 } else if (o.type == msgpack::type::ARRAY) {
1429 auto array = o.via.array;
1430 Helpers::check_size(array.size, name, 2, 0);
1431 Helpers::conv_fld_from_array(array, name, "input", input, 0);
1432 Helpers::conv_fld_from_array(array, name, "output", output, 1);
1433 } else {
1434 throw_or_abort("expected MAP or ARRAY for " + name);
1435 }
1436 }
1437 };
1438
1445
1446 friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&);
1447
1448 void msgpack_pack(auto& packer) const
1449 {
1450 packer.pack_array(5);
1451 packer.pack(hashed_msg);
1452 packer.pack(public_key_x);
1453 packer.pack(public_key_y);
1454 packer.pack(signature);
1455 packer.pack(result);
1456 }
1457
1458 void msgpack_unpack(msgpack::object const& o)
1459 {
1460 std::string name = "EcdsaSecp256k1";
1461 if (o.type == msgpack::type::MAP) {
1463 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1464 switch (tag) {
1465 case 0:
1466 Helpers::convert_or_throw(val, name, "hashed_msg", hashed_msg);
1467 break;
1468 case 1:
1469 Helpers::convert_or_throw(val, name, "public_key_x", public_key_x);
1470 break;
1471 case 2:
1472 Helpers::convert_or_throw(val, name, "public_key_y", public_key_y);
1473 break;
1474 case 3:
1475 Helpers::convert_or_throw(val, name, "signature", signature);
1476 break;
1477 case 4:
1478 Helpers::convert_or_throw(val, name, "result", result);
1479 break;
1480 default:
1481 std::cerr << val << std::endl;
1482 throw_or_abort("unknown tag for EcdsaSecp256k1: " + std::to_string(tag));
1483 }
1484 });
1485 } else {
1486 Helpers::check_size(o.via.map.size, name, 5, 0);
1487 auto kvmap = Helpers::make_kvmap(o, name);
1488 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_msg", hashed_msg, false);
1489 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
1490 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
1491 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
1492 Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false);
1493 }
1494 } else if (o.type == msgpack::type::ARRAY) {
1495 auto array = o.via.array;
1496 Helpers::check_size(array.size, name, 5, 0);
1497 Helpers::conv_fld_from_array(array, name, "hashed_msg", hashed_msg, 0);
1498 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 1);
1499 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 2);
1500 Helpers::conv_fld_from_array(array, name, "signature", signature, 3);
1501 Helpers::conv_fld_from_array(array, name, "result", result, 4);
1502 } else {
1503 throw_or_abort("expected MAP or ARRAY for " + name);
1504 }
1505 }
1506 };
1507
1514
1515 friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&);
1516
1517 void msgpack_pack(auto& packer) const
1518 {
1519 packer.pack_array(5);
1520 packer.pack(hashed_msg);
1521 packer.pack(public_key_x);
1522 packer.pack(public_key_y);
1523 packer.pack(signature);
1524 packer.pack(result);
1525 }
1526
1527 void msgpack_unpack(msgpack::object const& o)
1528 {
1529 std::string name = "EcdsaSecp256r1";
1530 if (o.type == msgpack::type::MAP) {
1532 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1533 switch (tag) {
1534 case 0:
1535 Helpers::convert_or_throw(val, name, "hashed_msg", hashed_msg);
1536 break;
1537 case 1:
1538 Helpers::convert_or_throw(val, name, "public_key_x", public_key_x);
1539 break;
1540 case 2:
1541 Helpers::convert_or_throw(val, name, "public_key_y", public_key_y);
1542 break;
1543 case 3:
1544 Helpers::convert_or_throw(val, name, "signature", signature);
1545 break;
1546 case 4:
1547 Helpers::convert_or_throw(val, name, "result", result);
1548 break;
1549 default:
1550 std::cerr << val << std::endl;
1551 throw_or_abort("unknown tag for EcdsaSecp256r1: " + std::to_string(tag));
1552 }
1553 });
1554 } else {
1555 Helpers::check_size(o.via.map.size, name, 5, 0);
1556 auto kvmap = Helpers::make_kvmap(o, name);
1557 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_msg", hashed_msg, false);
1558 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
1559 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
1560 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
1561 Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false);
1562 }
1563 } else if (o.type == msgpack::type::ARRAY) {
1564 auto array = o.via.array;
1565 Helpers::check_size(array.size, name, 5, 0);
1566 Helpers::conv_fld_from_array(array, name, "hashed_msg", hashed_msg, 0);
1567 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 1);
1568 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 2);
1569 Helpers::conv_fld_from_array(array, name, "signature", signature, 3);
1570 Helpers::conv_fld_from_array(array, name, "result", result, 4);
1571 } else {
1572 throw_or_abort("expected MAP or ARRAY for " + name);
1573 }
1574 }
1575 };
1576
1581
1582 friend bool operator==(const MultiScalarMul&, const MultiScalarMul&);
1583
1584 void msgpack_pack(auto& packer) const
1585 {
1586 packer.pack_array(3);
1587 packer.pack(points);
1588 packer.pack(scalars);
1589 packer.pack(outputs);
1590 }
1591
1592 void msgpack_unpack(msgpack::object const& o)
1593 {
1594 std::string name = "MultiScalarMul";
1595 if (o.type == msgpack::type::MAP) {
1597 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1598 switch (tag) {
1599 case 0:
1600 Helpers::convert_or_throw(val, name, "points", points);
1601 break;
1602 case 1:
1603 Helpers::convert_or_throw(val, name, "scalars", scalars);
1604 break;
1605 case 2:
1606 Helpers::convert_or_throw(val, name, "outputs", outputs);
1607 break;
1608 default:
1609 std::cerr << val << std::endl;
1610 throw_or_abort("unknown tag for MultiScalarMul: " + std::to_string(tag));
1611 }
1612 });
1613 } else {
1614 Helpers::check_size(o.via.map.size, name, 3, 0);
1615 auto kvmap = Helpers::make_kvmap(o, name);
1616 Helpers::conv_fld_from_kvmap(kvmap, name, "points", points, false);
1617 Helpers::conv_fld_from_kvmap(kvmap, name, "scalars", scalars, false);
1618 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
1619 }
1620 } else if (o.type == msgpack::type::ARRAY) {
1621 auto array = o.via.array;
1622 Helpers::check_size(array.size, name, 3, 0);
1623 Helpers::conv_fld_from_array(array, name, "points", points, 0);
1624 Helpers::conv_fld_from_array(array, name, "scalars", scalars, 1);
1625 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
1626 } else {
1627 throw_or_abort("expected MAP or ARRAY for " + name);
1628 }
1629 }
1630 };
1631
1638
1639 friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&);
1640
1641 void msgpack_pack(auto& packer) const
1642 {
1643 packer.pack_array(5);
1644 packer.pack(input1_x);
1645 packer.pack(input1_y);
1646 packer.pack(input2_x);
1647 packer.pack(input2_y);
1648 packer.pack(result);
1649 }
1650
1651 void msgpack_unpack(msgpack::object const& o)
1652 {
1653 std::string name = "EmbeddedCurveAdd";
1654 if (o.type == msgpack::type::MAP) {
1656 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1657 switch (tag) {
1658 case 0:
1659 Helpers::convert_or_throw(val, name, "input1_x", input1_x);
1660 break;
1661 case 1:
1662 Helpers::convert_or_throw(val, name, "input1_y", input1_y);
1663 break;
1664 case 2:
1665 Helpers::convert_or_throw(val, name, "input2_x", input2_x);
1666 break;
1667 case 3:
1668 Helpers::convert_or_throw(val, name, "input2_y", input2_y);
1669 break;
1670 case 4:
1671 Helpers::convert_or_throw(val, name, "result", result);
1672 break;
1673 default:
1674 std::cerr << val << std::endl;
1675 throw_or_abort("unknown tag for EmbeddedCurveAdd: " + std::to_string(tag));
1676 }
1677 });
1678 } else {
1679 Helpers::check_size(o.via.map.size, name, 5, 0);
1680 auto kvmap = Helpers::make_kvmap(o, name);
1681 Helpers::conv_fld_from_kvmap(kvmap, name, "input1_x", input1_x, false);
1682 Helpers::conv_fld_from_kvmap(kvmap, name, "input1_y", input1_y, false);
1683 Helpers::conv_fld_from_kvmap(kvmap, name, "input2_x", input2_x, false);
1684 Helpers::conv_fld_from_kvmap(kvmap, name, "input2_y", input2_y, false);
1685 Helpers::conv_fld_from_kvmap(kvmap, name, "result", result, false);
1686 }
1687 } else if (o.type == msgpack::type::ARRAY) {
1688 auto array = o.via.array;
1689 Helpers::check_size(array.size, name, 5, 0);
1690 Helpers::conv_fld_from_array(array, name, "input1_x", input1_x, 0);
1691 Helpers::conv_fld_from_array(array, name, "input1_y", input1_y, 1);
1692 Helpers::conv_fld_from_array(array, name, "input2_x", input2_x, 2);
1693 Helpers::conv_fld_from_array(array, name, "input2_y", input2_y, 3);
1694 Helpers::conv_fld_from_array(array, name, "result", result, 4);
1695 } else {
1696 throw_or_abort("expected MAP or ARRAY for " + name);
1697 }
1698 }
1699 };
1700
1704
1705 friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&);
1706
1707 void msgpack_pack(auto& packer) const
1708 {
1709 packer.pack_array(2);
1710 packer.pack(message);
1711 packer.pack(output);
1712 }
1713
1714 void msgpack_unpack(msgpack::object const& o)
1715 {
1716 std::string name = "Poseidon2Permutation";
1717 if (o.type == msgpack::type::MAP) {
1719 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1720 switch (tag) {
1721 case 0:
1722 Helpers::convert_or_throw(val, name, "message", message);
1723 break;
1724 case 1:
1725 Helpers::convert_or_throw(val, name, "output", output);
1726 break;
1727 default:
1728 std::cerr << val << std::endl;
1729 throw_or_abort("unknown tag for Poseidon2Permutation: " + std::to_string(tag));
1730 }
1731 });
1732 } else {
1733 Helpers::check_size(o.via.map.size, name, 2, 0);
1734 auto kvmap = Helpers::make_kvmap(o, name);
1735 Helpers::conv_fld_from_kvmap(kvmap, name, "message", message, false);
1736 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1737 }
1738 } else if (o.type == msgpack::type::ARRAY) {
1739 auto array = o.via.array;
1740 Helpers::check_size(array.size, name, 2, 0);
1741 Helpers::conv_fld_from_array(array, name, "message", message, 0);
1742 Helpers::conv_fld_from_array(array, name, "output", output, 1);
1743 } else {
1744 throw_or_abort("expected MAP or ARRAY for " + name);
1745 }
1746 }
1747 };
1748
1753
1754 friend bool operator==(const Sha256Compression&, const Sha256Compression&);
1755
1756 void msgpack_pack(auto& packer) const
1757 {
1758 packer.pack_array(3);
1759 packer.pack(input);
1760 packer.pack(hash_values);
1761 packer.pack(output);
1762 }
1763
1764 void msgpack_unpack(msgpack::object const& o)
1765 {
1766 std::string name = "Sha256Compression";
1767 if (o.type == msgpack::type::MAP) {
1769 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1770 switch (tag) {
1771 case 0:
1772 Helpers::convert_or_throw(val, name, "input", input);
1773 break;
1774 case 1:
1775 Helpers::convert_or_throw(val, name, "hash_values", hash_values);
1776 break;
1777 case 2:
1778 Helpers::convert_or_throw(val, name, "output", output);
1779 break;
1780 default:
1781 std::cerr << val << std::endl;
1782 throw_or_abort("unknown tag for Sha256Compression: " + std::to_string(tag));
1783 }
1784 });
1785 } else {
1786 Helpers::check_size(o.via.map.size, name, 3, 0);
1787 auto kvmap = Helpers::make_kvmap(o, name);
1788 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
1789 Helpers::conv_fld_from_kvmap(kvmap, name, "hash_values", hash_values, false);
1790 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
1791 }
1792 } else if (o.type == msgpack::type::ARRAY) {
1793 auto array = o.via.array;
1794 Helpers::check_size(array.size, name, 3, 0);
1795 Helpers::conv_fld_from_array(array, name, "input", input, 0);
1796 Helpers::conv_fld_from_array(array, name, "hash_values", hash_values, 1);
1797 Helpers::conv_fld_from_array(array, name, "output", output, 2);
1798 } else {
1799 throw_or_abort("expected MAP or ARRAY for " + name);
1800 }
1801 }
1802 };
1803
1804 struct ToRadix {
1810
1811 friend bool operator==(const ToRadix&, const ToRadix&);
1812
1813 void msgpack_pack(auto& packer) const
1814 {
1815 packer.pack_array(5);
1816 packer.pack(input);
1817 packer.pack(radix);
1818 packer.pack(output_pointer);
1819 packer.pack(num_limbs);
1820 packer.pack(output_bits);
1821 }
1822
1823 void msgpack_unpack(msgpack::object const& o)
1824 {
1825 std::string name = "ToRadix";
1826 if (o.type == msgpack::type::MAP) {
1828 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
1829 switch (tag) {
1830 case 0:
1831 Helpers::convert_or_throw(val, name, "input", input);
1832 break;
1833 case 1:
1834 Helpers::convert_or_throw(val, name, "radix", radix);
1835 break;
1836 case 2:
1837 Helpers::convert_or_throw(val, name, "output_pointer", output_pointer);
1838 break;
1839 case 3:
1840 Helpers::convert_or_throw(val, name, "num_limbs", num_limbs);
1841 break;
1842 case 4:
1843 Helpers::convert_or_throw(val, name, "output_bits", output_bits);
1844 break;
1845 default:
1846 std::cerr << val << std::endl;
1847 throw_or_abort("unknown tag for ToRadix: " + std::to_string(tag));
1848 }
1849 });
1850 } else {
1851 Helpers::check_size(o.via.map.size, name, 5, 0);
1852 auto kvmap = Helpers::make_kvmap(o, name);
1853 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
1854 Helpers::conv_fld_from_kvmap(kvmap, name, "radix", radix, false);
1855 Helpers::conv_fld_from_kvmap(kvmap, name, "output_pointer", output_pointer, false);
1856 Helpers::conv_fld_from_kvmap(kvmap, name, "num_limbs", num_limbs, false);
1857 Helpers::conv_fld_from_kvmap(kvmap, name, "output_bits", output_bits, false);
1858 }
1859 } else if (o.type == msgpack::type::ARRAY) {
1860 auto array = o.via.array;
1861 Helpers::check_size(array.size, name, 5, 0);
1862 Helpers::conv_fld_from_array(array, name, "input", input, 0);
1863 Helpers::conv_fld_from_array(array, name, "radix", radix, 1);
1864 Helpers::conv_fld_from_array(array, name, "output_pointer", output_pointer, 2);
1865 Helpers::conv_fld_from_array(array, name, "num_limbs", num_limbs, 3);
1866 Helpers::conv_fld_from_array(array, name, "output_bits", output_bits, 4);
1867 } else {
1868 throw_or_abort("expected MAP or ARRAY for " + name);
1869 }
1870 }
1871 };
1872
1873 std::variant<AES128Encrypt,
1874 Blake2s,
1875 Blake3,
1876 Keccakf1600,
1877 EcdsaSecp256k1,
1878 EcdsaSecp256r1,
1879 MultiScalarMul,
1880 EmbeddedCurveAdd,
1881 Poseidon2Permutation,
1882 Sha256Compression,
1883 ToRadix>
1885
1886 friend bool operator==(const BlackBoxOp&, const BlackBoxOp&);
1887
1888 void msgpack_pack(auto& packer) const
1889 {
1890 std::string tag;
1891 bool is_unit;
1892 switch (value.index()) {
1893
1894 case 0:
1895 tag = "AES128Encrypt";
1896 is_unit = false;
1897 break;
1898 case 1:
1899 tag = "Blake2s";
1900 is_unit = false;
1901 break;
1902 case 2:
1903 tag = "Blake3";
1904 is_unit = false;
1905 break;
1906 case 3:
1907 tag = "Keccakf1600";
1908 is_unit = false;
1909 break;
1910 case 4:
1911 tag = "EcdsaSecp256k1";
1912 is_unit = false;
1913 break;
1914 case 5:
1915 tag = "EcdsaSecp256r1";
1916 is_unit = false;
1917 break;
1918 case 6:
1919 tag = "MultiScalarMul";
1920 is_unit = false;
1921 break;
1922 case 7:
1923 tag = "EmbeddedCurveAdd";
1924 is_unit = false;
1925 break;
1926 case 8:
1927 tag = "Poseidon2Permutation";
1928 is_unit = false;
1929 break;
1930 case 9:
1931 tag = "Sha256Compression";
1932 is_unit = false;
1933 break;
1934 case 10:
1935 tag = "ToRadix";
1936 is_unit = false;
1937 break;
1938 default:
1939 throw_or_abort("unknown enum 'BlackBoxOp' variant index: " + std::to_string(value.index()));
1940 }
1941 if (is_unit) {
1942 packer.pack(tag);
1943 } else {
1944 std::visit(
1945 [&packer, tag](const auto& arg) {
1946 packer.pack_map(1);
1947 packer.pack(tag);
1948 packer.pack(arg);
1949 },
1950 value);
1951 }
1952 }
1953
1954 void msgpack_unpack(msgpack::object const& o)
1955 {
1956
1957 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
1958 std::cerr << o << std::endl;
1959 throw_or_abort("expected MAP or STR for enum 'BlackBoxOp'; got type " + std::to_string(o.type));
1960 }
1961 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
1962 throw_or_abort("expected 1 entry for enum 'BlackBoxOp'; got " + std::to_string(o.via.map.size));
1963 }
1965 // `Format::MsgpackTagged` — int-keyed variant.
1966 uint8_t tag;
1967 try {
1968 o.via.map.ptr[0].key.convert(tag);
1969 } catch (const msgpack::type_error&) {
1970 std::cerr << o << std::endl;
1971 throw_or_abort("expected u8 variant tag for enum 'BlackBoxOp'");
1972 }
1973 switch (tag) {
1974 case 0: {
1975 AES128Encrypt v;
1976 try {
1977 o.via.map.ptr[0].val.convert(v);
1978 } catch (const msgpack::type_error&) {
1979 std::cerr << o << std::endl;
1980 throw_or_abort("error converting into enum variant 'BlackBoxOp::AES128Encrypt'");
1981 }
1982 value = v;
1983 break;
1984 }
1985 case 1: {
1986 Blake2s v;
1987 try {
1988 o.via.map.ptr[0].val.convert(v);
1989 } catch (const msgpack::type_error&) {
1990 std::cerr << o << std::endl;
1991 throw_or_abort("error converting into enum variant 'BlackBoxOp::Blake2s'");
1992 }
1993 value = v;
1994 break;
1995 }
1996 case 2: {
1997 Blake3 v;
1998 try {
1999 o.via.map.ptr[0].val.convert(v);
2000 } catch (const msgpack::type_error&) {
2001 std::cerr << o << std::endl;
2002 throw_or_abort("error converting into enum variant 'BlackBoxOp::Blake3'");
2003 }
2004 value = v;
2005 break;
2006 }
2007 case 3: {
2008 Keccakf1600 v;
2009 try {
2010 o.via.map.ptr[0].val.convert(v);
2011 } catch (const msgpack::type_error&) {
2012 std::cerr << o << std::endl;
2013 throw_or_abort("error converting into enum variant 'BlackBoxOp::Keccakf1600'");
2014 }
2015 value = v;
2016 break;
2017 }
2018 case 4: {
2020 try {
2021 o.via.map.ptr[0].val.convert(v);
2022 } catch (const msgpack::type_error&) {
2023 std::cerr << o << std::endl;
2024 throw_or_abort("error converting into enum variant 'BlackBoxOp::EcdsaSecp256k1'");
2025 }
2026 value = v;
2027 break;
2028 }
2029 case 5: {
2031 try {
2032 o.via.map.ptr[0].val.convert(v);
2033 } catch (const msgpack::type_error&) {
2034 std::cerr << o << std::endl;
2035 throw_or_abort("error converting into enum variant 'BlackBoxOp::EcdsaSecp256r1'");
2036 }
2037 value = v;
2038 break;
2039 }
2040 case 6: {
2042 try {
2043 o.via.map.ptr[0].val.convert(v);
2044 } catch (const msgpack::type_error&) {
2045 std::cerr << o << std::endl;
2046 throw_or_abort("error converting into enum variant 'BlackBoxOp::MultiScalarMul'");
2047 }
2048 value = v;
2049 break;
2050 }
2051 case 7: {
2053 try {
2054 o.via.map.ptr[0].val.convert(v);
2055 } catch (const msgpack::type_error&) {
2056 std::cerr << o << std::endl;
2057 throw_or_abort("error converting into enum variant 'BlackBoxOp::EmbeddedCurveAdd'");
2058 }
2059 value = v;
2060 break;
2061 }
2062 case 8: {
2064 try {
2065 o.via.map.ptr[0].val.convert(v);
2066 } catch (const msgpack::type_error&) {
2067 std::cerr << o << std::endl;
2068 throw_or_abort("error converting into enum variant 'BlackBoxOp::Poseidon2Permutation'");
2069 }
2070 value = v;
2071 break;
2072 }
2073 case 9: {
2075 try {
2076 o.via.map.ptr[0].val.convert(v);
2077 } catch (const msgpack::type_error&) {
2078 std::cerr << o << std::endl;
2079 throw_or_abort("error converting into enum variant 'BlackBoxOp::Sha256Compression'");
2080 }
2081 value = v;
2082 break;
2083 }
2084 case 10: {
2085 ToRadix v;
2086 try {
2087 o.via.map.ptr[0].val.convert(v);
2088 } catch (const msgpack::type_error&) {
2089 std::cerr << o << std::endl;
2090 throw_or_abort("error converting into enum variant 'BlackBoxOp::ToRadix'");
2091 }
2092 value = v;
2093 break;
2094 }
2095 default:
2096 std::cerr << o << std::endl;
2097 throw_or_abort("unknown 'BlackBoxOp' enum variant tag: " + std::to_string(tag));
2098 }
2099 } else {
2100 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
2101 // unit variant (bare STR) — both dispatch on the variant name.
2102 std::string tag;
2103 try {
2104 if (o.type == msgpack::type::object_type::MAP) {
2105 o.via.map.ptr[0].key.convert(tag);
2106 } else {
2107 o.convert(tag);
2108 }
2109 } catch (const msgpack::type_error&) {
2110 std::cerr << o << std::endl;
2111 throw_or_abort("error converting tag to string for enum 'BlackBoxOp'");
2112 }
2113 if (tag == "AES128Encrypt") {
2114 AES128Encrypt v;
2115 try {
2116 o.via.map.ptr[0].val.convert(v);
2117 } catch (const msgpack::type_error&) {
2118 std::cerr << o << std::endl;
2119 throw_or_abort("error converting into enum variant 'BlackBoxOp::AES128Encrypt'");
2120 }
2121
2122 value = v;
2123 } else if (tag == "Blake2s") {
2124 Blake2s v;
2125 try {
2126 o.via.map.ptr[0].val.convert(v);
2127 } catch (const msgpack::type_error&) {
2128 std::cerr << o << std::endl;
2129 throw_or_abort("error converting into enum variant 'BlackBoxOp::Blake2s'");
2130 }
2131
2132 value = v;
2133 } else if (tag == "Blake3") {
2134 Blake3 v;
2135 try {
2136 o.via.map.ptr[0].val.convert(v);
2137 } catch (const msgpack::type_error&) {
2138 std::cerr << o << std::endl;
2139 throw_or_abort("error converting into enum variant 'BlackBoxOp::Blake3'");
2140 }
2141
2142 value = v;
2143 } else if (tag == "Keccakf1600") {
2144 Keccakf1600 v;
2145 try {
2146 o.via.map.ptr[0].val.convert(v);
2147 } catch (const msgpack::type_error&) {
2148 std::cerr << o << std::endl;
2149 throw_or_abort("error converting into enum variant 'BlackBoxOp::Keccakf1600'");
2150 }
2151
2152 value = v;
2153 } else if (tag == "EcdsaSecp256k1") {
2155 try {
2156 o.via.map.ptr[0].val.convert(v);
2157 } catch (const msgpack::type_error&) {
2158 std::cerr << o << std::endl;
2159 throw_or_abort("error converting into enum variant 'BlackBoxOp::EcdsaSecp256k1'");
2160 }
2161
2162 value = v;
2163 } else if (tag == "EcdsaSecp256r1") {
2165 try {
2166 o.via.map.ptr[0].val.convert(v);
2167 } catch (const msgpack::type_error&) {
2168 std::cerr << o << std::endl;
2169 throw_or_abort("error converting into enum variant 'BlackBoxOp::EcdsaSecp256r1'");
2170 }
2171
2172 value = v;
2173 } else if (tag == "MultiScalarMul") {
2175 try {
2176 o.via.map.ptr[0].val.convert(v);
2177 } catch (const msgpack::type_error&) {
2178 std::cerr << o << std::endl;
2179 throw_or_abort("error converting into enum variant 'BlackBoxOp::MultiScalarMul'");
2180 }
2181
2182 value = v;
2183 } else if (tag == "EmbeddedCurveAdd") {
2185 try {
2186 o.via.map.ptr[0].val.convert(v);
2187 } catch (const msgpack::type_error&) {
2188 std::cerr << o << std::endl;
2189 throw_or_abort("error converting into enum variant 'BlackBoxOp::EmbeddedCurveAdd'");
2190 }
2191
2192 value = v;
2193 } else if (tag == "Poseidon2Permutation") {
2195 try {
2196 o.via.map.ptr[0].val.convert(v);
2197 } catch (const msgpack::type_error&) {
2198 std::cerr << o << std::endl;
2199 throw_or_abort("error converting into enum variant 'BlackBoxOp::Poseidon2Permutation'");
2200 }
2201
2202 value = v;
2203 } else if (tag == "Sha256Compression") {
2205 try {
2206 o.via.map.ptr[0].val.convert(v);
2207 } catch (const msgpack::type_error&) {
2208 std::cerr << o << std::endl;
2209 throw_or_abort("error converting into enum variant 'BlackBoxOp::Sha256Compression'");
2210 }
2211
2212 value = v;
2213 } else if (tag == "ToRadix") {
2214 ToRadix v;
2215 try {
2216 o.via.map.ptr[0].val.convert(v);
2217 } catch (const msgpack::type_error&) {
2218 std::cerr << o << std::endl;
2219 throw_or_abort("error converting into enum variant 'BlackBoxOp::ToRadix'");
2220 }
2221
2222 value = v;
2223 } else {
2224 std::cerr << o << std::endl;
2225 throw_or_abort("unknown 'BlackBoxOp' enum variant: " + tag);
2226 }
2227 }
2228 }
2229};
2230
2232 uint32_t value;
2233
2234 friend bool operator==(const SemanticLength&, const SemanticLength&);
2235
2236 void msgpack_pack(auto& packer) const { packer.pack(value); }
2237
2238 void msgpack_unpack(msgpack::object const& o)
2239 {
2240 try {
2241 o.convert(value);
2242 } catch (const msgpack::type_error&) {
2243 std::cerr << o << std::endl;
2244 throw_or_abort("error converting into newtype 'SemanticLength'");
2245 }
2246 }
2247};
2248
2249struct HeapValueType;
2250
2252
2253 struct Simple {
2255
2256 friend bool operator==(const Simple&, const Simple&);
2257
2258 void msgpack_pack(auto& packer) const { packer.pack(value); }
2259
2260 void msgpack_unpack(msgpack::object const& o)
2261 {
2262 try {
2263 o.convert(value);
2264 } catch (const msgpack::type_error&) {
2265 std::cerr << o << std::endl;
2266 throw_or_abort("error converting into newtype 'Simple'");
2267 }
2268 }
2269 };
2270
2271 struct Array {
2272 std::vector<Acir::HeapValueType> value_types;
2274
2275 friend bool operator==(const Array&, const Array&);
2276
2277 void msgpack_pack(auto& packer) const
2278 {
2279 packer.pack_array(2);
2280 packer.pack(value_types);
2281 packer.pack(size);
2282 }
2283
2284 void msgpack_unpack(msgpack::object const& o)
2285 {
2286 std::string name = "Array";
2287 if (o.type == msgpack::type::MAP) {
2289 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2290 switch (tag) {
2291 case 0:
2292 Helpers::convert_or_throw(val, name, "value_types", value_types);
2293 break;
2294 case 1:
2295 Helpers::convert_or_throw(val, name, "size", size);
2296 break;
2297 default:
2298 std::cerr << val << std::endl;
2299 throw_or_abort("unknown tag for Array: " + std::to_string(tag));
2300 }
2301 });
2302 } else {
2303 Helpers::check_size(o.via.map.size, name, 2, 0);
2304 auto kvmap = Helpers::make_kvmap(o, name);
2305 Helpers::conv_fld_from_kvmap(kvmap, name, "value_types", value_types, false);
2306 Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false);
2307 }
2308 } else if (o.type == msgpack::type::ARRAY) {
2309 auto array = o.via.array;
2310 Helpers::check_size(array.size, name, 2, 0);
2311 Helpers::conv_fld_from_array(array, name, "value_types", value_types, 0);
2312 Helpers::conv_fld_from_array(array, name, "size", size, 1);
2313 } else {
2314 throw_or_abort("expected MAP or ARRAY for " + name);
2315 }
2316 }
2317 };
2318
2319 struct Vector {
2320 std::vector<Acir::HeapValueType> value_types;
2321
2322 friend bool operator==(const Vector&, const Vector&);
2323
2324 void msgpack_pack(auto& packer) const
2325 {
2326 packer.pack_array(1);
2327 packer.pack(value_types);
2328 }
2329
2330 void msgpack_unpack(msgpack::object const& o)
2331 {
2332 std::string name = "Vector";
2333 if (o.type == msgpack::type::MAP) {
2335 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2336 switch (tag) {
2337 case 0:
2338 Helpers::convert_or_throw(val, name, "value_types", value_types);
2339 break;
2340 default:
2341 std::cerr << val << std::endl;
2342 throw_or_abort("unknown tag for Vector: " + std::to_string(tag));
2343 }
2344 });
2345 } else {
2346 Helpers::check_size(o.via.map.size, name, 1, 0);
2347 auto kvmap = Helpers::make_kvmap(o, name);
2348 Helpers::conv_fld_from_kvmap(kvmap, name, "value_types", value_types, false);
2349 }
2350 } else if (o.type == msgpack::type::ARRAY) {
2351 auto array = o.via.array;
2352 Helpers::check_size(array.size, name, 1, 0);
2353 Helpers::conv_fld_from_array(array, name, "value_types", value_types, 0);
2354 } else {
2355 throw_or_abort("expected MAP or ARRAY for " + name);
2356 }
2357 }
2358 };
2359
2361
2362 friend bool operator==(const HeapValueType&, const HeapValueType&);
2363
2364 void msgpack_pack(auto& packer) const
2365 {
2366 std::string tag;
2367 bool is_unit;
2368 switch (value.index()) {
2369
2370 case 0:
2371 tag = "Simple";
2372 is_unit = false;
2373 break;
2374 case 1:
2375 tag = "Array";
2376 is_unit = false;
2377 break;
2378 case 2:
2379 tag = "Vector";
2380 is_unit = false;
2381 break;
2382 default:
2383 throw_or_abort("unknown enum 'HeapValueType' variant index: " + std::to_string(value.index()));
2384 }
2385 if (is_unit) {
2386 packer.pack(tag);
2387 } else {
2388 std::visit(
2389 [&packer, tag](const auto& arg) {
2390 packer.pack_map(1);
2391 packer.pack(tag);
2392 packer.pack(arg);
2393 },
2394 value);
2395 }
2396 }
2397
2398 void msgpack_unpack(msgpack::object const& o)
2399 {
2400
2401 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
2402 std::cerr << o << std::endl;
2403 throw_or_abort("expected MAP or STR for enum 'HeapValueType'; got type " + std::to_string(o.type));
2404 }
2405 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
2406 throw_or_abort("expected 1 entry for enum 'HeapValueType'; got " + std::to_string(o.via.map.size));
2407 }
2409 // `Format::MsgpackTagged` — int-keyed variant.
2410 uint8_t tag;
2411 try {
2412 o.via.map.ptr[0].key.convert(tag);
2413 } catch (const msgpack::type_error&) {
2414 std::cerr << o << std::endl;
2415 throw_or_abort("expected u8 variant tag for enum 'HeapValueType'");
2416 }
2417 switch (tag) {
2418 case 0: {
2419 Simple v;
2420 try {
2421 o.via.map.ptr[0].val.convert(v);
2422 } catch (const msgpack::type_error&) {
2423 std::cerr << o << std::endl;
2424 throw_or_abort("error converting into enum variant 'HeapValueType::Simple'");
2425 }
2426 value = v;
2427 break;
2428 }
2429 case 1: {
2430 Array v;
2431 try {
2432 o.via.map.ptr[0].val.convert(v);
2433 } catch (const msgpack::type_error&) {
2434 std::cerr << o << std::endl;
2435 throw_or_abort("error converting into enum variant 'HeapValueType::Array'");
2436 }
2437 value = v;
2438 break;
2439 }
2440 case 2: {
2441 Vector v;
2442 try {
2443 o.via.map.ptr[0].val.convert(v);
2444 } catch (const msgpack::type_error&) {
2445 std::cerr << o << std::endl;
2446 throw_or_abort("error converting into enum variant 'HeapValueType::Vector'");
2447 }
2448 value = v;
2449 break;
2450 }
2451 default:
2452 std::cerr << o << std::endl;
2453 throw_or_abort("unknown 'HeapValueType' enum variant tag: " + std::to_string(tag));
2454 }
2455 } else {
2456 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
2457 // unit variant (bare STR) — both dispatch on the variant name.
2458 std::string tag;
2459 try {
2460 if (o.type == msgpack::type::object_type::MAP) {
2461 o.via.map.ptr[0].key.convert(tag);
2462 } else {
2463 o.convert(tag);
2464 }
2465 } catch (const msgpack::type_error&) {
2466 std::cerr << o << std::endl;
2467 throw_or_abort("error converting tag to string for enum 'HeapValueType'");
2468 }
2469 if (tag == "Simple") {
2470 Simple v;
2471 try {
2472 o.via.map.ptr[0].val.convert(v);
2473 } catch (const msgpack::type_error&) {
2474 std::cerr << o << std::endl;
2475 throw_or_abort("error converting into enum variant 'HeapValueType::Simple'");
2476 }
2477
2478 value = v;
2479 } else if (tag == "Array") {
2480 Array v;
2481 try {
2482 o.via.map.ptr[0].val.convert(v);
2483 } catch (const msgpack::type_error&) {
2484 std::cerr << o << std::endl;
2485 throw_or_abort("error converting into enum variant 'HeapValueType::Array'");
2486 }
2487
2488 value = v;
2489 } else if (tag == "Vector") {
2490 Vector v;
2491 try {
2492 o.via.map.ptr[0].val.convert(v);
2493 } catch (const msgpack::type_error&) {
2494 std::cerr << o << std::endl;
2495 throw_or_abort("error converting into enum variant 'HeapValueType::Vector'");
2496 }
2497
2498 value = v;
2499 } else {
2500 std::cerr << o << std::endl;
2501 throw_or_abort("unknown 'HeapValueType' enum variant: " + tag);
2502 }
2503 }
2504 }
2505};
2506
2510
2511 friend bool operator==(const HeapVector&, const HeapVector&);
2512
2513 void msgpack_pack(auto& packer) const
2514 {
2515 packer.pack_array(2);
2516 packer.pack(pointer);
2517 packer.pack(size);
2518 }
2519
2520 void msgpack_unpack(msgpack::object const& o)
2521 {
2522 std::string name = "HeapVector";
2523 if (o.type == msgpack::type::MAP) {
2525 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2526 switch (tag) {
2527 case 0:
2528 Helpers::convert_or_throw(val, name, "pointer", pointer);
2529 break;
2530 case 1:
2531 Helpers::convert_or_throw(val, name, "size", size);
2532 break;
2533 default:
2534 std::cerr << val << std::endl;
2535 throw_or_abort("unknown tag for HeapVector: " + std::to_string(tag));
2536 }
2537 });
2538 } else {
2539 Helpers::check_size(o.via.map.size, name, 2, 0);
2540 auto kvmap = Helpers::make_kvmap(o, name);
2541 Helpers::conv_fld_from_kvmap(kvmap, name, "pointer", pointer, false);
2542 Helpers::conv_fld_from_kvmap(kvmap, name, "size", size, false);
2543 }
2544 } else if (o.type == msgpack::type::ARRAY) {
2545 auto array = o.via.array;
2546 Helpers::check_size(array.size, name, 2, 0);
2547 Helpers::conv_fld_from_array(array, name, "pointer", pointer, 0);
2548 Helpers::conv_fld_from_array(array, name, "size", size, 1);
2549 } else {
2550 throw_or_abort("expected MAP or ARRAY for " + name);
2551 }
2552 }
2553};
2554
2556
2559
2560 friend bool operator==(const MemoryAddress&, const MemoryAddress&);
2561
2562 void msgpack_pack(auto& packer) const { packer.pack(value); }
2563
2564 void msgpack_unpack(msgpack::object const& o)
2565 {
2566 try {
2567 o.convert(value);
2568 } catch (const msgpack::type_error&) {
2569 std::cerr << o << std::endl;
2570 throw_or_abort("error converting into newtype 'MemoryAddress'");
2571 }
2572 }
2573 };
2574
2575 struct HeapArray {
2577
2578 friend bool operator==(const HeapArray&, const HeapArray&);
2579
2580 void msgpack_pack(auto& packer) const { packer.pack(value); }
2581
2582 void msgpack_unpack(msgpack::object const& o)
2583 {
2584 try {
2585 o.convert(value);
2586 } catch (const msgpack::type_error&) {
2587 std::cerr << o << std::endl;
2588 throw_or_abort("error converting into newtype 'HeapArray'");
2589 }
2590 }
2591 };
2592
2593 struct HeapVector {
2595
2596 friend bool operator==(const HeapVector&, const HeapVector&);
2597
2598 void msgpack_pack(auto& packer) const { packer.pack(value); }
2599
2600 void msgpack_unpack(msgpack::object const& o)
2601 {
2602 try {
2603 o.convert(value);
2604 } catch (const msgpack::type_error&) {
2605 std::cerr << o << std::endl;
2606 throw_or_abort("error converting into newtype 'HeapVector'");
2607 }
2608 }
2609 };
2610
2612
2613 friend bool operator==(const ValueOrArray&, const ValueOrArray&);
2614
2615 void msgpack_pack(auto& packer) const
2616 {
2617 std::string tag;
2618 bool is_unit;
2619 switch (value.index()) {
2620
2621 case 0:
2622 tag = "MemoryAddress";
2623 is_unit = false;
2624 break;
2625 case 1:
2626 tag = "HeapArray";
2627 is_unit = false;
2628 break;
2629 case 2:
2630 tag = "HeapVector";
2631 is_unit = false;
2632 break;
2633 default:
2634 throw_or_abort("unknown enum 'ValueOrArray' variant index: " + std::to_string(value.index()));
2635 }
2636 if (is_unit) {
2637 packer.pack(tag);
2638 } else {
2639 std::visit(
2640 [&packer, tag](const auto& arg) {
2641 packer.pack_map(1);
2642 packer.pack(tag);
2643 packer.pack(arg);
2644 },
2645 value);
2646 }
2647 }
2648
2649 void msgpack_unpack(msgpack::object const& o)
2650 {
2651
2652 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
2653 std::cerr << o << std::endl;
2654 throw_or_abort("expected MAP or STR for enum 'ValueOrArray'; got type " + std::to_string(o.type));
2655 }
2656 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
2657 throw_or_abort("expected 1 entry for enum 'ValueOrArray'; got " + std::to_string(o.via.map.size));
2658 }
2660 // `Format::MsgpackTagged` — int-keyed variant.
2661 uint8_t tag;
2662 try {
2663 o.via.map.ptr[0].key.convert(tag);
2664 } catch (const msgpack::type_error&) {
2665 std::cerr << o << std::endl;
2666 throw_or_abort("expected u8 variant tag for enum 'ValueOrArray'");
2667 }
2668 switch (tag) {
2669 case 0: {
2670 MemoryAddress v;
2671 try {
2672 o.via.map.ptr[0].val.convert(v);
2673 } catch (const msgpack::type_error&) {
2674 std::cerr << o << std::endl;
2675 throw_or_abort("error converting into enum variant 'ValueOrArray::MemoryAddress'");
2676 }
2677 value = v;
2678 break;
2679 }
2680 case 1: {
2681 HeapArray v;
2682 try {
2683 o.via.map.ptr[0].val.convert(v);
2684 } catch (const msgpack::type_error&) {
2685 std::cerr << o << std::endl;
2686 throw_or_abort("error converting into enum variant 'ValueOrArray::HeapArray'");
2687 }
2688 value = v;
2689 break;
2690 }
2691 case 2: {
2692 HeapVector v;
2693 try {
2694 o.via.map.ptr[0].val.convert(v);
2695 } catch (const msgpack::type_error&) {
2696 std::cerr << o << std::endl;
2697 throw_or_abort("error converting into enum variant 'ValueOrArray::HeapVector'");
2698 }
2699 value = v;
2700 break;
2701 }
2702 default:
2703 std::cerr << o << std::endl;
2704 throw_or_abort("unknown 'ValueOrArray' enum variant tag: " + std::to_string(tag));
2705 }
2706 } else {
2707 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
2708 // unit variant (bare STR) — both dispatch on the variant name.
2709 std::string tag;
2710 try {
2711 if (o.type == msgpack::type::object_type::MAP) {
2712 o.via.map.ptr[0].key.convert(tag);
2713 } else {
2714 o.convert(tag);
2715 }
2716 } catch (const msgpack::type_error&) {
2717 std::cerr << o << std::endl;
2718 throw_or_abort("error converting tag to string for enum 'ValueOrArray'");
2719 }
2720 if (tag == "MemoryAddress") {
2721 MemoryAddress v;
2722 try {
2723 o.via.map.ptr[0].val.convert(v);
2724 } catch (const msgpack::type_error&) {
2725 std::cerr << o << std::endl;
2726 throw_or_abort("error converting into enum variant 'ValueOrArray::MemoryAddress'");
2727 }
2728
2729 value = v;
2730 } else if (tag == "HeapArray") {
2731 HeapArray v;
2732 try {
2733 o.via.map.ptr[0].val.convert(v);
2734 } catch (const msgpack::type_error&) {
2735 std::cerr << o << std::endl;
2736 throw_or_abort("error converting into enum variant 'ValueOrArray::HeapArray'");
2737 }
2738
2739 value = v;
2740 } else if (tag == "HeapVector") {
2741 HeapVector v;
2742 try {
2743 o.via.map.ptr[0].val.convert(v);
2744 } catch (const msgpack::type_error&) {
2745 std::cerr << o << std::endl;
2746 throw_or_abort("error converting into enum variant 'ValueOrArray::HeapVector'");
2747 }
2748
2749 value = v;
2750 } else {
2751 std::cerr << o << std::endl;
2752 throw_or_abort("unknown 'ValueOrArray' enum variant: " + tag);
2753 }
2754 }
2755 }
2756};
2757
2759
2765
2766 friend bool operator==(const BinaryFieldOp&, const BinaryFieldOp&);
2767
2768 void msgpack_pack(auto& packer) const
2769 {
2770 packer.pack_array(4);
2771 packer.pack(destination);
2772 packer.pack(op);
2773 packer.pack(lhs);
2774 packer.pack(rhs);
2775 }
2776
2777 void msgpack_unpack(msgpack::object const& o)
2778 {
2779 std::string name = "BinaryFieldOp";
2780 if (o.type == msgpack::type::MAP) {
2782 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2783 switch (tag) {
2784 case 0:
2785 Helpers::convert_or_throw(val, name, "destination", destination);
2786 break;
2787 case 1:
2788 Helpers::convert_or_throw(val, name, "op", op);
2789 break;
2790 case 2:
2791 Helpers::convert_or_throw(val, name, "lhs", lhs);
2792 break;
2793 case 3:
2794 Helpers::convert_or_throw(val, name, "rhs", rhs);
2795 break;
2796 default:
2797 std::cerr << val << std::endl;
2798 throw_or_abort("unknown tag for BinaryFieldOp: " + std::to_string(tag));
2799 }
2800 });
2801 } else {
2802 Helpers::check_size(o.via.map.size, name, 4, 0);
2803 auto kvmap = Helpers::make_kvmap(o, name);
2804 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2805 Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false);
2806 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
2807 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
2808 }
2809 } else if (o.type == msgpack::type::ARRAY) {
2810 auto array = o.via.array;
2811 Helpers::check_size(array.size, name, 4, 0);
2812 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2813 Helpers::conv_fld_from_array(array, name, "op", op, 1);
2814 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 2);
2815 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 3);
2816 } else {
2817 throw_or_abort("expected MAP or ARRAY for " + name);
2818 }
2819 }
2820 };
2821
2828
2829 friend bool operator==(const BinaryIntOp&, const BinaryIntOp&);
2830
2831 void msgpack_pack(auto& packer) const
2832 {
2833 packer.pack_array(5);
2834 packer.pack(destination);
2835 packer.pack(op);
2836 packer.pack(bit_size);
2837 packer.pack(lhs);
2838 packer.pack(rhs);
2839 }
2840
2841 void msgpack_unpack(msgpack::object const& o)
2842 {
2843 std::string name = "BinaryIntOp";
2844 if (o.type == msgpack::type::MAP) {
2846 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2847 switch (tag) {
2848 case 0:
2849 Helpers::convert_or_throw(val, name, "destination", destination);
2850 break;
2851 case 1:
2852 Helpers::convert_or_throw(val, name, "op", op);
2853 break;
2854 case 2:
2855 Helpers::convert_or_throw(val, name, "bit_size", bit_size);
2856 break;
2857 case 3:
2858 Helpers::convert_or_throw(val, name, "lhs", lhs);
2859 break;
2860 case 4:
2861 Helpers::convert_or_throw(val, name, "rhs", rhs);
2862 break;
2863 default:
2864 std::cerr << val << std::endl;
2865 throw_or_abort("unknown tag for BinaryIntOp: " + std::to_string(tag));
2866 }
2867 });
2868 } else {
2869 Helpers::check_size(o.via.map.size, name, 5, 0);
2870 auto kvmap = Helpers::make_kvmap(o, name);
2871 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2872 Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false);
2873 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
2874 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
2875 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
2876 }
2877 } else if (o.type == msgpack::type::ARRAY) {
2878 auto array = o.via.array;
2879 Helpers::check_size(array.size, name, 5, 0);
2880 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2881 Helpers::conv_fld_from_array(array, name, "op", op, 1);
2882 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 2);
2883 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 3);
2884 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 4);
2885 } else {
2886 throw_or_abort("expected MAP or ARRAY for " + name);
2887 }
2888 }
2889 };
2890
2891 struct Not {
2895
2896 friend bool operator==(const Not&, const Not&);
2897
2898 void msgpack_pack(auto& packer) const
2899 {
2900 packer.pack_array(3);
2901 packer.pack(destination);
2902 packer.pack(source);
2903 packer.pack(bit_size);
2904 }
2905
2906 void msgpack_unpack(msgpack::object const& o)
2907 {
2908 std::string name = "Not";
2909 if (o.type == msgpack::type::MAP) {
2911 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2912 switch (tag) {
2913 case 0:
2914 Helpers::convert_or_throw(val, name, "destination", destination);
2915 break;
2916 case 1:
2917 Helpers::convert_or_throw(val, name, "source", source);
2918 break;
2919 case 2:
2920 Helpers::convert_or_throw(val, name, "bit_size", bit_size);
2921 break;
2922 default:
2923 std::cerr << val << std::endl;
2924 throw_or_abort("unknown tag for Not: " + std::to_string(tag));
2925 }
2926 });
2927 } else {
2928 Helpers::check_size(o.via.map.size, name, 3, 0);
2929 auto kvmap = Helpers::make_kvmap(o, name);
2930 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2931 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
2932 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
2933 }
2934 } else if (o.type == msgpack::type::ARRAY) {
2935 auto array = o.via.array;
2936 Helpers::check_size(array.size, name, 3, 0);
2937 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2938 Helpers::conv_fld_from_array(array, name, "source", source, 1);
2939 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 2);
2940 } else {
2941 throw_or_abort("expected MAP or ARRAY for " + name);
2942 }
2943 }
2944 };
2945
2946 struct Cast {
2950
2951 friend bool operator==(const Cast&, const Cast&);
2952
2953 void msgpack_pack(auto& packer) const
2954 {
2955 packer.pack_array(3);
2956 packer.pack(destination);
2957 packer.pack(source);
2958 packer.pack(bit_size);
2959 }
2960
2961 void msgpack_unpack(msgpack::object const& o)
2962 {
2963 std::string name = "Cast";
2964 if (o.type == msgpack::type::MAP) {
2966 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
2967 switch (tag) {
2968 case 0:
2969 Helpers::convert_or_throw(val, name, "destination", destination);
2970 break;
2971 case 1:
2972 Helpers::convert_or_throw(val, name, "source", source);
2973 break;
2974 case 2:
2975 Helpers::convert_or_throw(val, name, "bit_size", bit_size);
2976 break;
2977 default:
2978 std::cerr << val << std::endl;
2979 throw_or_abort("unknown tag for Cast: " + std::to_string(tag));
2980 }
2981 });
2982 } else {
2983 Helpers::check_size(o.via.map.size, name, 3, 0);
2984 auto kvmap = Helpers::make_kvmap(o, name);
2985 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
2986 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
2987 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
2988 }
2989 } else if (o.type == msgpack::type::ARRAY) {
2990 auto array = o.via.array;
2991 Helpers::check_size(array.size, name, 3, 0);
2992 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
2993 Helpers::conv_fld_from_array(array, name, "source", source, 1);
2994 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 2);
2995 } else {
2996 throw_or_abort("expected MAP or ARRAY for " + name);
2997 }
2998 }
2999 };
3000
3001 struct JumpIf {
3003 uint64_t location;
3004
3005 friend bool operator==(const JumpIf&, const JumpIf&);
3006
3007 void msgpack_pack(auto& packer) const
3008 {
3009 packer.pack_array(2);
3010 packer.pack(condition);
3011 packer.pack(location);
3012 }
3013
3014 void msgpack_unpack(msgpack::object const& o)
3015 {
3016 std::string name = "JumpIf";
3017 if (o.type == msgpack::type::MAP) {
3019 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3020 switch (tag) {
3021 case 0:
3022 Helpers::convert_or_throw(val, name, "condition", condition);
3023 break;
3024 case 1:
3025 Helpers::convert_or_throw(val, name, "location", location);
3026 break;
3027 default:
3028 std::cerr << val << std::endl;
3029 throw_or_abort("unknown tag for JumpIf: " + std::to_string(tag));
3030 }
3031 });
3032 } else {
3033 Helpers::check_size(o.via.map.size, name, 2, 0);
3034 auto kvmap = Helpers::make_kvmap(o, name);
3035 Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false);
3036 Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false);
3037 }
3038 } else if (o.type == msgpack::type::ARRAY) {
3039 auto array = o.via.array;
3040 Helpers::check_size(array.size, name, 2, 0);
3041 Helpers::conv_fld_from_array(array, name, "condition", condition, 0);
3042 Helpers::conv_fld_from_array(array, name, "location", location, 1);
3043 } else {
3044 throw_or_abort("expected MAP or ARRAY for " + name);
3045 }
3046 }
3047 };
3048
3049 struct Jump {
3050 uint64_t location;
3051
3052 friend bool operator==(const Jump&, const Jump&);
3053
3054 void msgpack_pack(auto& packer) const
3055 {
3056 packer.pack_array(1);
3057 packer.pack(location);
3058 }
3059
3060 void msgpack_unpack(msgpack::object const& o)
3061 {
3062 std::string name = "Jump";
3063 if (o.type == msgpack::type::MAP) {
3065 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3066 switch (tag) {
3067 case 0:
3068 Helpers::convert_or_throw(val, name, "location", location);
3069 break;
3070 default:
3071 std::cerr << val << std::endl;
3072 throw_or_abort("unknown tag for Jump: " + std::to_string(tag));
3073 }
3074 });
3075 } else {
3076 Helpers::check_size(o.via.map.size, name, 1, 0);
3077 auto kvmap = Helpers::make_kvmap(o, name);
3078 Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false);
3079 }
3080 } else if (o.type == msgpack::type::ARRAY) {
3081 auto array = o.via.array;
3082 Helpers::check_size(array.size, name, 1, 0);
3083 Helpers::conv_fld_from_array(array, name, "location", location, 0);
3084 } else {
3085 throw_or_abort("expected MAP or ARRAY for " + name);
3086 }
3087 }
3088 };
3089
3094
3095 friend bool operator==(const CalldataCopy&, const CalldataCopy&);
3096
3097 void msgpack_pack(auto& packer) const
3098 {
3099 packer.pack_array(3);
3100 packer.pack(destination_address);
3101 packer.pack(size_address);
3102 packer.pack(offset_address);
3103 }
3104
3105 void msgpack_unpack(msgpack::object const& o)
3106 {
3107 std::string name = "CalldataCopy";
3108 if (o.type == msgpack::type::MAP) {
3110 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3111 switch (tag) {
3112 case 0:
3113 Helpers::convert_or_throw(val, name, "destination_address", destination_address);
3114 break;
3115 case 1:
3116 Helpers::convert_or_throw(val, name, "size_address", size_address);
3117 break;
3118 case 2:
3119 Helpers::convert_or_throw(val, name, "offset_address", offset_address);
3120 break;
3121 default:
3122 std::cerr << val << std::endl;
3123 throw_or_abort("unknown tag for CalldataCopy: " + std::to_string(tag));
3124 }
3125 });
3126 } else {
3127 Helpers::check_size(o.via.map.size, name, 3, 0);
3128 auto kvmap = Helpers::make_kvmap(o, name);
3129 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_address", destination_address, false);
3130 Helpers::conv_fld_from_kvmap(kvmap, name, "size_address", size_address, false);
3131 Helpers::conv_fld_from_kvmap(kvmap, name, "offset_address", offset_address, false);
3132 }
3133 } else if (o.type == msgpack::type::ARRAY) {
3134 auto array = o.via.array;
3135 Helpers::check_size(array.size, name, 3, 0);
3136 Helpers::conv_fld_from_array(array, name, "destination_address", destination_address, 0);
3137 Helpers::conv_fld_from_array(array, name, "size_address", size_address, 1);
3138 Helpers::conv_fld_from_array(array, name, "offset_address", offset_address, 2);
3139 } else {
3140 throw_or_abort("expected MAP or ARRAY for " + name);
3141 }
3142 }
3143 };
3144
3145 struct Call {
3146 uint64_t location;
3147
3148 friend bool operator==(const Call&, const Call&);
3149
3150 void msgpack_pack(auto& packer) const
3151 {
3152 packer.pack_array(1);
3153 packer.pack(location);
3154 }
3155
3156 void msgpack_unpack(msgpack::object const& o)
3157 {
3158 std::string name = "Call";
3159 if (o.type == msgpack::type::MAP) {
3161 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3162 switch (tag) {
3163 case 0:
3164 Helpers::convert_or_throw(val, name, "location", location);
3165 break;
3166 default:
3167 std::cerr << val << std::endl;
3168 throw_or_abort("unknown tag for Call: " + std::to_string(tag));
3169 }
3170 });
3171 } else {
3172 Helpers::check_size(o.via.map.size, name, 1, 0);
3173 auto kvmap = Helpers::make_kvmap(o, name);
3174 Helpers::conv_fld_from_kvmap(kvmap, name, "location", location, false);
3175 }
3176 } else if (o.type == msgpack::type::ARRAY) {
3177 auto array = o.via.array;
3178 Helpers::check_size(array.size, name, 1, 0);
3179 Helpers::conv_fld_from_array(array, name, "location", location, 0);
3180 } else {
3181 throw_or_abort("expected MAP or ARRAY for " + name);
3182 }
3183 }
3184 };
3185
3186 struct Const {
3189 std::vector<uint8_t> value;
3190
3191 friend bool operator==(const Const&, const Const&);
3192
3193 void msgpack_pack(auto& packer) const
3194 {
3195 packer.pack_array(3);
3196 packer.pack(destination);
3197 packer.pack(bit_size);
3198 packer.pack(value);
3199 }
3200
3201 void msgpack_unpack(msgpack::object const& o)
3202 {
3203 std::string name = "Const";
3204 if (o.type == msgpack::type::MAP) {
3206 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3207 switch (tag) {
3208 case 0:
3209 Helpers::convert_or_throw(val, name, "destination", destination);
3210 break;
3211 case 1:
3212 Helpers::convert_or_throw(val, name, "bit_size", bit_size);
3213 break;
3214 case 2:
3215 Helpers::convert_or_throw(val, name, "value", value);
3216 break;
3217 default:
3218 std::cerr << val << std::endl;
3219 throw_or_abort("unknown tag for Const: " + std::to_string(tag));
3220 }
3221 });
3222 } else {
3223 Helpers::check_size(o.via.map.size, name, 3, 0);
3224 auto kvmap = Helpers::make_kvmap(o, name);
3225 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
3226 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
3227 Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false);
3228 }
3229 } else if (o.type == msgpack::type::ARRAY) {
3230 auto array = o.via.array;
3231 Helpers::check_size(array.size, name, 3, 0);
3232 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
3233 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 1);
3234 Helpers::conv_fld_from_array(array, name, "value", value, 2);
3235 } else {
3236 throw_or_abort("expected MAP or ARRAY for " + name);
3237 }
3238 }
3239 };
3240
3244 std::vector<uint8_t> value;
3245
3246 friend bool operator==(const IndirectConst&, const IndirectConst&);
3247
3248 void msgpack_pack(auto& packer) const
3249 {
3250 packer.pack_array(3);
3251 packer.pack(destination_pointer);
3252 packer.pack(bit_size);
3253 packer.pack(value);
3254 }
3255
3256 void msgpack_unpack(msgpack::object const& o)
3257 {
3258 std::string name = "IndirectConst";
3259 if (o.type == msgpack::type::MAP) {
3261 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3262 switch (tag) {
3263 case 0:
3264 Helpers::convert_or_throw(val, name, "destination_pointer", destination_pointer);
3265 break;
3266 case 1:
3267 Helpers::convert_or_throw(val, name, "bit_size", bit_size);
3268 break;
3269 case 2:
3270 Helpers::convert_or_throw(val, name, "value", value);
3271 break;
3272 default:
3273 std::cerr << val << std::endl;
3274 throw_or_abort("unknown tag for IndirectConst: " + std::to_string(tag));
3275 }
3276 });
3277 } else {
3278 Helpers::check_size(o.via.map.size, name, 3, 0);
3279 auto kvmap = Helpers::make_kvmap(o, name);
3280 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_pointer", destination_pointer, false);
3281 Helpers::conv_fld_from_kvmap(kvmap, name, "bit_size", bit_size, false);
3282 Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false);
3283 }
3284 } else if (o.type == msgpack::type::ARRAY) {
3285 auto array = o.via.array;
3286 Helpers::check_size(array.size, name, 3, 0);
3287 Helpers::conv_fld_from_array(array, name, "destination_pointer", destination_pointer, 0);
3288 Helpers::conv_fld_from_array(array, name, "bit_size", bit_size, 1);
3289 Helpers::conv_fld_from_array(array, name, "value", value, 2);
3290 } else {
3291 throw_or_abort("expected MAP or ARRAY for " + name);
3292 }
3293 }
3294 };
3295
3296 struct Return {
3297 friend bool operator==(const Return&, const Return&);
3298
3299 void msgpack_pack(auto& packer) const {}
3300 void msgpack_unpack(msgpack::object const& o) {}
3301 };
3302
3304 std::string function;
3305 std::vector<Acir::ValueOrArray> destinations;
3306 std::vector<Acir::HeapValueType> destination_value_types;
3307 std::vector<Acir::ValueOrArray> inputs;
3308 std::vector<Acir::HeapValueType> input_value_types;
3309
3310 friend bool operator==(const ForeignCall&, const ForeignCall&);
3311
3312 void msgpack_pack(auto& packer) const
3313 {
3314 packer.pack_array(5);
3315 packer.pack(function);
3316 packer.pack(destinations);
3317 packer.pack(destination_value_types);
3318 packer.pack(inputs);
3319 packer.pack(input_value_types);
3320 }
3321
3322 void msgpack_unpack(msgpack::object const& o)
3323 {
3324 std::string name = "ForeignCall";
3325 if (o.type == msgpack::type::MAP) {
3327 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3328 switch (tag) {
3329 case 0:
3330 Helpers::convert_or_throw(val, name, "function", function);
3331 break;
3332 case 1:
3333 Helpers::convert_or_throw(val, name, "destinations", destinations);
3334 break;
3335 case 2:
3336 Helpers::convert_or_throw(val, name, "destination_value_types", destination_value_types);
3337 break;
3338 case 3:
3339 Helpers::convert_or_throw(val, name, "inputs", inputs);
3340 break;
3341 case 4:
3342 Helpers::convert_or_throw(val, name, "input_value_types", input_value_types);
3343 break;
3344 default:
3345 std::cerr << val << std::endl;
3346 throw_or_abort("unknown tag for ForeignCall: " + std::to_string(tag));
3347 }
3348 });
3349 } else {
3350 Helpers::check_size(o.via.map.size, name, 5, 0);
3351 auto kvmap = Helpers::make_kvmap(o, name);
3352 Helpers::conv_fld_from_kvmap(kvmap, name, "function", function, false);
3353 Helpers::conv_fld_from_kvmap(kvmap, name, "destinations", destinations, false);
3355 kvmap, name, "destination_value_types", destination_value_types, false);
3356 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
3357 Helpers::conv_fld_from_kvmap(kvmap, name, "input_value_types", input_value_types, false);
3358 }
3359 } else if (o.type == msgpack::type::ARRAY) {
3360 auto array = o.via.array;
3361 Helpers::check_size(array.size, name, 5, 0);
3362 Helpers::conv_fld_from_array(array, name, "function", function, 0);
3363 Helpers::conv_fld_from_array(array, name, "destinations", destinations, 1);
3364 Helpers::conv_fld_from_array(array, name, "destination_value_types", destination_value_types, 2);
3365 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 3);
3366 Helpers::conv_fld_from_array(array, name, "input_value_types", input_value_types, 4);
3367 } else {
3368 throw_or_abort("expected MAP or ARRAY for " + name);
3369 }
3370 }
3371 };
3372
3373 struct Mov {
3376
3377 friend bool operator==(const Mov&, const Mov&);
3378
3379 void msgpack_pack(auto& packer) const
3380 {
3381 packer.pack_array(2);
3382 packer.pack(destination);
3383 packer.pack(source);
3384 }
3385
3386 void msgpack_unpack(msgpack::object const& o)
3387 {
3388 std::string name = "Mov";
3389 if (o.type == msgpack::type::MAP) {
3391 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3392 switch (tag) {
3393 case 0:
3394 Helpers::convert_or_throw(val, name, "destination", destination);
3395 break;
3396 case 1:
3397 Helpers::convert_or_throw(val, name, "source", source);
3398 break;
3399 default:
3400 std::cerr << val << std::endl;
3401 throw_or_abort("unknown tag for Mov: " + std::to_string(tag));
3402 }
3403 });
3404 } else {
3405 Helpers::check_size(o.via.map.size, name, 2, 0);
3406 auto kvmap = Helpers::make_kvmap(o, name);
3407 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
3408 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
3409 }
3410 } else if (o.type == msgpack::type::ARRAY) {
3411 auto array = o.via.array;
3412 Helpers::check_size(array.size, name, 2, 0);
3413 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
3414 Helpers::conv_fld_from_array(array, name, "source", source, 1);
3415 } else {
3416 throw_or_abort("expected MAP or ARRAY for " + name);
3417 }
3418 }
3419 };
3420
3426
3427 friend bool operator==(const ConditionalMov&, const ConditionalMov&);
3428
3429 void msgpack_pack(auto& packer) const
3430 {
3431 packer.pack_array(4);
3432 packer.pack(destination);
3433 packer.pack(source_a);
3434 packer.pack(source_b);
3435 packer.pack(condition);
3436 }
3437
3438 void msgpack_unpack(msgpack::object const& o)
3439 {
3440 std::string name = "ConditionalMov";
3441 if (o.type == msgpack::type::MAP) {
3443 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3444 switch (tag) {
3445 case 0:
3446 Helpers::convert_or_throw(val, name, "destination", destination);
3447 break;
3448 case 1:
3449 Helpers::convert_or_throw(val, name, "source_a", source_a);
3450 break;
3451 case 2:
3452 Helpers::convert_or_throw(val, name, "source_b", source_b);
3453 break;
3454 case 3:
3455 Helpers::convert_or_throw(val, name, "condition", condition);
3456 break;
3457 default:
3458 std::cerr << val << std::endl;
3459 throw_or_abort("unknown tag for ConditionalMov: " + std::to_string(tag));
3460 }
3461 });
3462 } else {
3463 Helpers::check_size(o.via.map.size, name, 4, 0);
3464 auto kvmap = Helpers::make_kvmap(o, name);
3465 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
3466 Helpers::conv_fld_from_kvmap(kvmap, name, "source_a", source_a, false);
3467 Helpers::conv_fld_from_kvmap(kvmap, name, "source_b", source_b, false);
3468 Helpers::conv_fld_from_kvmap(kvmap, name, "condition", condition, false);
3469 }
3470 } else if (o.type == msgpack::type::ARRAY) {
3471 auto array = o.via.array;
3472 Helpers::check_size(array.size, name, 4, 0);
3473 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
3474 Helpers::conv_fld_from_array(array, name, "source_a", source_a, 1);
3475 Helpers::conv_fld_from_array(array, name, "source_b", source_b, 2);
3476 Helpers::conv_fld_from_array(array, name, "condition", condition, 3);
3477 } else {
3478 throw_or_abort("expected MAP or ARRAY for " + name);
3479 }
3480 }
3481 };
3482
3483 struct Load {
3486
3487 friend bool operator==(const Load&, const Load&);
3488
3489 void msgpack_pack(auto& packer) const
3490 {
3491 packer.pack_array(2);
3492 packer.pack(destination);
3493 packer.pack(source_pointer);
3494 }
3495
3496 void msgpack_unpack(msgpack::object const& o)
3497 {
3498 std::string name = "Load";
3499 if (o.type == msgpack::type::MAP) {
3501 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3502 switch (tag) {
3503 case 0:
3504 Helpers::convert_or_throw(val, name, "destination", destination);
3505 break;
3506 case 1:
3507 Helpers::convert_or_throw(val, name, "source_pointer", source_pointer);
3508 break;
3509 default:
3510 std::cerr << val << std::endl;
3511 throw_or_abort("unknown tag for Load: " + std::to_string(tag));
3512 }
3513 });
3514 } else {
3515 Helpers::check_size(o.via.map.size, name, 2, 0);
3516 auto kvmap = Helpers::make_kvmap(o, name);
3517 Helpers::conv_fld_from_kvmap(kvmap, name, "destination", destination, false);
3518 Helpers::conv_fld_from_kvmap(kvmap, name, "source_pointer", source_pointer, false);
3519 }
3520 } else if (o.type == msgpack::type::ARRAY) {
3521 auto array = o.via.array;
3522 Helpers::check_size(array.size, name, 2, 0);
3523 Helpers::conv_fld_from_array(array, name, "destination", destination, 0);
3524 Helpers::conv_fld_from_array(array, name, "source_pointer", source_pointer, 1);
3525 } else {
3526 throw_or_abort("expected MAP or ARRAY for " + name);
3527 }
3528 }
3529 };
3530
3531 struct Store {
3534
3535 friend bool operator==(const Store&, const Store&);
3536
3537 void msgpack_pack(auto& packer) const
3538 {
3539 packer.pack_array(2);
3540 packer.pack(destination_pointer);
3541 packer.pack(source);
3542 }
3543
3544 void msgpack_unpack(msgpack::object const& o)
3545 {
3546 std::string name = "Store";
3547 if (o.type == msgpack::type::MAP) {
3549 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3550 switch (tag) {
3551 case 0:
3552 Helpers::convert_or_throw(val, name, "destination_pointer", destination_pointer);
3553 break;
3554 case 1:
3555 Helpers::convert_or_throw(val, name, "source", source);
3556 break;
3557 default:
3558 std::cerr << val << std::endl;
3559 throw_or_abort("unknown tag for Store: " + std::to_string(tag));
3560 }
3561 });
3562 } else {
3563 Helpers::check_size(o.via.map.size, name, 2, 0);
3564 auto kvmap = Helpers::make_kvmap(o, name);
3565 Helpers::conv_fld_from_kvmap(kvmap, name, "destination_pointer", destination_pointer, false);
3566 Helpers::conv_fld_from_kvmap(kvmap, name, "source", source, false);
3567 }
3568 } else if (o.type == msgpack::type::ARRAY) {
3569 auto array = o.via.array;
3570 Helpers::check_size(array.size, name, 2, 0);
3571 Helpers::conv_fld_from_array(array, name, "destination_pointer", destination_pointer, 0);
3572 Helpers::conv_fld_from_array(array, name, "source", source, 1);
3573 } else {
3574 throw_or_abort("expected MAP or ARRAY for " + name);
3575 }
3576 }
3577 };
3578
3579 struct BlackBox {
3581
3582 friend bool operator==(const BlackBox&, const BlackBox&);
3583
3584 void msgpack_pack(auto& packer) const { packer.pack(value); }
3585
3586 void msgpack_unpack(msgpack::object const& o)
3587 {
3588 try {
3589 o.convert(value);
3590 } catch (const msgpack::type_error&) {
3591 std::cerr << o << std::endl;
3592 throw_or_abort("error converting into newtype 'BlackBox'");
3593 }
3594 }
3595 };
3596
3597 struct Trap {
3599
3600 friend bool operator==(const Trap&, const Trap&);
3601
3602 void msgpack_pack(auto& packer) const
3603 {
3604 packer.pack_array(1);
3605 packer.pack(revert_data);
3606 }
3607
3608 void msgpack_unpack(msgpack::object const& o)
3609 {
3610 std::string name = "Trap";
3611 if (o.type == msgpack::type::MAP) {
3613 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3614 switch (tag) {
3615 case 0:
3616 Helpers::convert_or_throw(val, name, "revert_data", revert_data);
3617 break;
3618 default:
3619 std::cerr << val << std::endl;
3620 throw_or_abort("unknown tag for Trap: " + std::to_string(tag));
3621 }
3622 });
3623 } else {
3624 Helpers::check_size(o.via.map.size, name, 1, 0);
3625 auto kvmap = Helpers::make_kvmap(o, name);
3626 Helpers::conv_fld_from_kvmap(kvmap, name, "revert_data", revert_data, false);
3627 }
3628 } else if (o.type == msgpack::type::ARRAY) {
3629 auto array = o.via.array;
3630 Helpers::check_size(array.size, name, 1, 0);
3631 Helpers::conv_fld_from_array(array, name, "revert_data", revert_data, 0);
3632 } else {
3633 throw_or_abort("expected MAP or ARRAY for " + name);
3634 }
3635 }
3636 };
3637
3638 struct Stop {
3640
3641 friend bool operator==(const Stop&, const Stop&);
3642
3643 void msgpack_pack(auto& packer) const
3644 {
3645 packer.pack_array(1);
3646 packer.pack(return_data);
3647 }
3648
3649 void msgpack_unpack(msgpack::object const& o)
3650 {
3651 std::string name = "Stop";
3652 if (o.type == msgpack::type::MAP) {
3654 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
3655 switch (tag) {
3656 case 0:
3657 Helpers::convert_or_throw(val, name, "return_data", return_data);
3658 break;
3659 default:
3660 std::cerr << val << std::endl;
3661 throw_or_abort("unknown tag for Stop: " + std::to_string(tag));
3662 }
3663 });
3664 } else {
3665 Helpers::check_size(o.via.map.size, name, 1, 0);
3666 auto kvmap = Helpers::make_kvmap(o, name);
3667 Helpers::conv_fld_from_kvmap(kvmap, name, "return_data", return_data, false);
3668 }
3669 } else if (o.type == msgpack::type::ARRAY) {
3670 auto array = o.via.array;
3671 Helpers::check_size(array.size, name, 1, 0);
3672 Helpers::conv_fld_from_array(array, name, "return_data", return_data, 0);
3673 } else {
3674 throw_or_abort("expected MAP or ARRAY for " + name);
3675 }
3676 }
3677 };
3678
3681 Not,
3682 Cast,
3683 JumpIf,
3684 Jump,
3685 CalldataCopy,
3686 Call,
3687 Const,
3688 IndirectConst,
3689 Return,
3690 ForeignCall,
3691 Mov,
3692 ConditionalMov,
3693 Load,
3694 Store,
3695 BlackBox,
3696 Trap,
3697 Stop>
3699
3700 friend bool operator==(const BrilligOpcode&, const BrilligOpcode&);
3701
3702 void msgpack_pack(auto& packer) const
3703 {
3704 std::string tag;
3705 bool is_unit;
3706 switch (value.index()) {
3707
3708 case 0:
3709 tag = "BinaryFieldOp";
3710 is_unit = false;
3711 break;
3712 case 1:
3713 tag = "BinaryIntOp";
3714 is_unit = false;
3715 break;
3716 case 2:
3717 tag = "Not";
3718 is_unit = false;
3719 break;
3720 case 3:
3721 tag = "Cast";
3722 is_unit = false;
3723 break;
3724 case 4:
3725 tag = "JumpIf";
3726 is_unit = false;
3727 break;
3728 case 5:
3729 tag = "Jump";
3730 is_unit = false;
3731 break;
3732 case 6:
3733 tag = "CalldataCopy";
3734 is_unit = false;
3735 break;
3736 case 7:
3737 tag = "Call";
3738 is_unit = false;
3739 break;
3740 case 8:
3741 tag = "Const";
3742 is_unit = false;
3743 break;
3744 case 9:
3745 tag = "IndirectConst";
3746 is_unit = false;
3747 break;
3748 case 10:
3749 tag = "Return";
3750 is_unit = true;
3751 break;
3752 case 11:
3753 tag = "ForeignCall";
3754 is_unit = false;
3755 break;
3756 case 12:
3757 tag = "Mov";
3758 is_unit = false;
3759 break;
3760 case 13:
3761 tag = "ConditionalMov";
3762 is_unit = false;
3763 break;
3764 case 14:
3765 tag = "Load";
3766 is_unit = false;
3767 break;
3768 case 15:
3769 tag = "Store";
3770 is_unit = false;
3771 break;
3772 case 16:
3773 tag = "BlackBox";
3774 is_unit = false;
3775 break;
3776 case 17:
3777 tag = "Trap";
3778 is_unit = false;
3779 break;
3780 case 18:
3781 tag = "Stop";
3782 is_unit = false;
3783 break;
3784 default:
3785 throw_or_abort("unknown enum 'BrilligOpcode' variant index: " + std::to_string(value.index()));
3786 }
3787 if (is_unit) {
3788 packer.pack(tag);
3789 } else {
3790 std::visit(
3791 [&packer, tag](const auto& arg) {
3792 packer.pack_map(1);
3793 packer.pack(tag);
3794 packer.pack(arg);
3795 },
3796 value);
3797 }
3798 }
3799
3800 void msgpack_unpack(msgpack::object const& o)
3801 {
3802
3803 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
3804 std::cerr << o << std::endl;
3805 throw_or_abort("expected MAP or STR for enum 'BrilligOpcode'; got type " + std::to_string(o.type));
3806 }
3807 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
3808 throw_or_abort("expected 1 entry for enum 'BrilligOpcode'; got " + std::to_string(o.via.map.size));
3809 }
3811 // `Format::MsgpackTagged` — int-keyed variant.
3812 uint8_t tag;
3813 try {
3814 o.via.map.ptr[0].key.convert(tag);
3815 } catch (const msgpack::type_error&) {
3816 std::cerr << o << std::endl;
3817 throw_or_abort("expected u8 variant tag for enum 'BrilligOpcode'");
3818 }
3819 switch (tag) {
3820 case 0: {
3821 BinaryFieldOp v;
3822 try {
3823 o.via.map.ptr[0].val.convert(v);
3824 } catch (const msgpack::type_error&) {
3825 std::cerr << o << std::endl;
3826 throw_or_abort("error converting into enum variant 'BrilligOpcode::BinaryFieldOp'");
3827 }
3828 value = v;
3829 break;
3830 }
3831 case 1: {
3832 BinaryIntOp v;
3833 try {
3834 o.via.map.ptr[0].val.convert(v);
3835 } catch (const msgpack::type_error&) {
3836 std::cerr << o << std::endl;
3837 throw_or_abort("error converting into enum variant 'BrilligOpcode::BinaryIntOp'");
3838 }
3839 value = v;
3840 break;
3841 }
3842 case 2: {
3843 Not v;
3844 try {
3845 o.via.map.ptr[0].val.convert(v);
3846 } catch (const msgpack::type_error&) {
3847 std::cerr << o << std::endl;
3848 throw_or_abort("error converting into enum variant 'BrilligOpcode::Not'");
3849 }
3850 value = v;
3851 break;
3852 }
3853 case 3: {
3854 Cast v;
3855 try {
3856 o.via.map.ptr[0].val.convert(v);
3857 } catch (const msgpack::type_error&) {
3858 std::cerr << o << std::endl;
3859 throw_or_abort("error converting into enum variant 'BrilligOpcode::Cast'");
3860 }
3861 value = v;
3862 break;
3863 }
3864 case 4: {
3865 JumpIf v;
3866 try {
3867 o.via.map.ptr[0].val.convert(v);
3868 } catch (const msgpack::type_error&) {
3869 std::cerr << o << std::endl;
3870 throw_or_abort("error converting into enum variant 'BrilligOpcode::JumpIf'");
3871 }
3872 value = v;
3873 break;
3874 }
3875 case 5: {
3876 Jump v;
3877 try {
3878 o.via.map.ptr[0].val.convert(v);
3879 } catch (const msgpack::type_error&) {
3880 std::cerr << o << std::endl;
3881 throw_or_abort("error converting into enum variant 'BrilligOpcode::Jump'");
3882 }
3883 value = v;
3884 break;
3885 }
3886 case 6: {
3887 CalldataCopy v;
3888 try {
3889 o.via.map.ptr[0].val.convert(v);
3890 } catch (const msgpack::type_error&) {
3891 std::cerr << o << std::endl;
3892 throw_or_abort("error converting into enum variant 'BrilligOpcode::CalldataCopy'");
3893 }
3894 value = v;
3895 break;
3896 }
3897 case 7: {
3898 Call v;
3899 try {
3900 o.via.map.ptr[0].val.convert(v);
3901 } catch (const msgpack::type_error&) {
3902 std::cerr << o << std::endl;
3903 throw_or_abort("error converting into enum variant 'BrilligOpcode::Call'");
3904 }
3905 value = v;
3906 break;
3907 }
3908 case 8: {
3909 Const v;
3910 try {
3911 o.via.map.ptr[0].val.convert(v);
3912 } catch (const msgpack::type_error&) {
3913 std::cerr << o << std::endl;
3914 throw_or_abort("error converting into enum variant 'BrilligOpcode::Const'");
3915 }
3916 value = v;
3917 break;
3918 }
3919 case 9: {
3920 IndirectConst v;
3921 try {
3922 o.via.map.ptr[0].val.convert(v);
3923 } catch (const msgpack::type_error&) {
3924 std::cerr << o << std::endl;
3925 throw_or_abort("error converting into enum variant 'BrilligOpcode::IndirectConst'");
3926 }
3927 value = v;
3928 break;
3929 }
3930 case 10: {
3931 Return v;
3932 value = v;
3933 break;
3934 }
3935 case 11: {
3936 ForeignCall v;
3937 try {
3938 o.via.map.ptr[0].val.convert(v);
3939 } catch (const msgpack::type_error&) {
3940 std::cerr << o << std::endl;
3941 throw_or_abort("error converting into enum variant 'BrilligOpcode::ForeignCall'");
3942 }
3943 value = v;
3944 break;
3945 }
3946 case 12: {
3947 Mov v;
3948 try {
3949 o.via.map.ptr[0].val.convert(v);
3950 } catch (const msgpack::type_error&) {
3951 std::cerr << o << std::endl;
3952 throw_or_abort("error converting into enum variant 'BrilligOpcode::Mov'");
3953 }
3954 value = v;
3955 break;
3956 }
3957 case 13: {
3959 try {
3960 o.via.map.ptr[0].val.convert(v);
3961 } catch (const msgpack::type_error&) {
3962 std::cerr << o << std::endl;
3963 throw_or_abort("error converting into enum variant 'BrilligOpcode::ConditionalMov'");
3964 }
3965 value = v;
3966 break;
3967 }
3968 case 14: {
3969 Load v;
3970 try {
3971 o.via.map.ptr[0].val.convert(v);
3972 } catch (const msgpack::type_error&) {
3973 std::cerr << o << std::endl;
3974 throw_or_abort("error converting into enum variant 'BrilligOpcode::Load'");
3975 }
3976 value = v;
3977 break;
3978 }
3979 case 15: {
3980 Store v;
3981 try {
3982 o.via.map.ptr[0].val.convert(v);
3983 } catch (const msgpack::type_error&) {
3984 std::cerr << o << std::endl;
3985 throw_or_abort("error converting into enum variant 'BrilligOpcode::Store'");
3986 }
3987 value = v;
3988 break;
3989 }
3990 case 16: {
3991 BlackBox 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 'BrilligOpcode::BlackBox'");
3997 }
3998 value = v;
3999 break;
4000 }
4001 case 17: {
4002 Trap v;
4003 try {
4004 o.via.map.ptr[0].val.convert(v);
4005 } catch (const msgpack::type_error&) {
4006 std::cerr << o << std::endl;
4007 throw_or_abort("error converting into enum variant 'BrilligOpcode::Trap'");
4008 }
4009 value = v;
4010 break;
4011 }
4012 case 18: {
4013 Stop v;
4014 try {
4015 o.via.map.ptr[0].val.convert(v);
4016 } catch (const msgpack::type_error&) {
4017 std::cerr << o << std::endl;
4018 throw_or_abort("error converting into enum variant 'BrilligOpcode::Stop'");
4019 }
4020 value = v;
4021 break;
4022 }
4023 default:
4024 std::cerr << o << std::endl;
4025 throw_or_abort("unknown 'BrilligOpcode' enum variant tag: " + std::to_string(tag));
4026 }
4027 } else {
4028 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
4029 // unit variant (bare STR) — both dispatch on the variant name.
4030 std::string tag;
4031 try {
4032 if (o.type == msgpack::type::object_type::MAP) {
4033 o.via.map.ptr[0].key.convert(tag);
4034 } else {
4035 o.convert(tag);
4036 }
4037 } catch (const msgpack::type_error&) {
4038 std::cerr << o << std::endl;
4039 throw_or_abort("error converting tag to string for enum 'BrilligOpcode'");
4040 }
4041 if (tag == "BinaryFieldOp") {
4042 BinaryFieldOp v;
4043 try {
4044 o.via.map.ptr[0].val.convert(v);
4045 } catch (const msgpack::type_error&) {
4046 std::cerr << o << std::endl;
4047 throw_or_abort("error converting into enum variant 'BrilligOpcode::BinaryFieldOp'");
4048 }
4049
4050 value = v;
4051 } else if (tag == "BinaryIntOp") {
4052 BinaryIntOp v;
4053 try {
4054 o.via.map.ptr[0].val.convert(v);
4055 } catch (const msgpack::type_error&) {
4056 std::cerr << o << std::endl;
4057 throw_or_abort("error converting into enum variant 'BrilligOpcode::BinaryIntOp'");
4058 }
4059
4060 value = v;
4061 } else if (tag == "Not") {
4062 Not v;
4063 try {
4064 o.via.map.ptr[0].val.convert(v);
4065 } catch (const msgpack::type_error&) {
4066 std::cerr << o << std::endl;
4067 throw_or_abort("error converting into enum variant 'BrilligOpcode::Not'");
4068 }
4069
4070 value = v;
4071 } else if (tag == "Cast") {
4072 Cast v;
4073 try {
4074 o.via.map.ptr[0].val.convert(v);
4075 } catch (const msgpack::type_error&) {
4076 std::cerr << o << std::endl;
4077 throw_or_abort("error converting into enum variant 'BrilligOpcode::Cast'");
4078 }
4079
4080 value = v;
4081 } else if (tag == "JumpIf") {
4082 JumpIf v;
4083 try {
4084 o.via.map.ptr[0].val.convert(v);
4085 } catch (const msgpack::type_error&) {
4086 std::cerr << o << std::endl;
4087 throw_or_abort("error converting into enum variant 'BrilligOpcode::JumpIf'");
4088 }
4089
4090 value = v;
4091 } else if (tag == "Jump") {
4092 Jump v;
4093 try {
4094 o.via.map.ptr[0].val.convert(v);
4095 } catch (const msgpack::type_error&) {
4096 std::cerr << o << std::endl;
4097 throw_or_abort("error converting into enum variant 'BrilligOpcode::Jump'");
4098 }
4099
4100 value = v;
4101 } else if (tag == "CalldataCopy") {
4102 CalldataCopy v;
4103 try {
4104 o.via.map.ptr[0].val.convert(v);
4105 } catch (const msgpack::type_error&) {
4106 std::cerr << o << std::endl;
4107 throw_or_abort("error converting into enum variant 'BrilligOpcode::CalldataCopy'");
4108 }
4109
4110 value = v;
4111 } else if (tag == "Call") {
4112 Call v;
4113 try {
4114 o.via.map.ptr[0].val.convert(v);
4115 } catch (const msgpack::type_error&) {
4116 std::cerr << o << std::endl;
4117 throw_or_abort("error converting into enum variant 'BrilligOpcode::Call'");
4118 }
4119
4120 value = v;
4121 } else if (tag == "Const") {
4122 Const v;
4123 try {
4124 o.via.map.ptr[0].val.convert(v);
4125 } catch (const msgpack::type_error&) {
4126 std::cerr << o << std::endl;
4127 throw_or_abort("error converting into enum variant 'BrilligOpcode::Const'");
4128 }
4129
4130 value = v;
4131 } else if (tag == "IndirectConst") {
4132 IndirectConst v;
4133 try {
4134 o.via.map.ptr[0].val.convert(v);
4135 } catch (const msgpack::type_error&) {
4136 std::cerr << o << std::endl;
4137 throw_or_abort("error converting into enum variant 'BrilligOpcode::IndirectConst'");
4138 }
4139
4140 value = v;
4141 } else if (tag == "Return") {
4142 Return v;
4143 value = v;
4144 } else if (tag == "ForeignCall") {
4145 ForeignCall v;
4146 try {
4147 o.via.map.ptr[0].val.convert(v);
4148 } catch (const msgpack::type_error&) {
4149 std::cerr << o << std::endl;
4150 throw_or_abort("error converting into enum variant 'BrilligOpcode::ForeignCall'");
4151 }
4152
4153 value = v;
4154 } else if (tag == "Mov") {
4155 Mov v;
4156 try {
4157 o.via.map.ptr[0].val.convert(v);
4158 } catch (const msgpack::type_error&) {
4159 std::cerr << o << std::endl;
4160 throw_or_abort("error converting into enum variant 'BrilligOpcode::Mov'");
4161 }
4162
4163 value = v;
4164 } else if (tag == "ConditionalMov") {
4166 try {
4167 o.via.map.ptr[0].val.convert(v);
4168 } catch (const msgpack::type_error&) {
4169 std::cerr << o << std::endl;
4170 throw_or_abort("error converting into enum variant 'BrilligOpcode::ConditionalMov'");
4171 }
4172
4173 value = v;
4174 } else if (tag == "Load") {
4175 Load v;
4176 try {
4177 o.via.map.ptr[0].val.convert(v);
4178 } catch (const msgpack::type_error&) {
4179 std::cerr << o << std::endl;
4180 throw_or_abort("error converting into enum variant 'BrilligOpcode::Load'");
4181 }
4182
4183 value = v;
4184 } else if (tag == "Store") {
4185 Store v;
4186 try {
4187 o.via.map.ptr[0].val.convert(v);
4188 } catch (const msgpack::type_error&) {
4189 std::cerr << o << std::endl;
4190 throw_or_abort("error converting into enum variant 'BrilligOpcode::Store'");
4191 }
4192
4193 value = v;
4194 } else if (tag == "BlackBox") {
4195 BlackBox v;
4196 try {
4197 o.via.map.ptr[0].val.convert(v);
4198 } catch (const msgpack::type_error&) {
4199 std::cerr << o << std::endl;
4200 throw_or_abort("error converting into enum variant 'BrilligOpcode::BlackBox'");
4201 }
4202
4203 value = v;
4204 } else if (tag == "Trap") {
4205 Trap v;
4206 try {
4207 o.via.map.ptr[0].val.convert(v);
4208 } catch (const msgpack::type_error&) {
4209 std::cerr << o << std::endl;
4210 throw_or_abort("error converting into enum variant 'BrilligOpcode::Trap'");
4211 }
4212
4213 value = v;
4214 } else if (tag == "Stop") {
4215 Stop v;
4216 try {
4217 o.via.map.ptr[0].val.convert(v);
4218 } catch (const msgpack::type_error&) {
4219 std::cerr << o << std::endl;
4220 throw_or_abort("error converting into enum variant 'BrilligOpcode::Stop'");
4221 }
4222
4223 value = v;
4224 } else {
4225 std::cerr << o << std::endl;
4226 throw_or_abort("unknown 'BrilligOpcode' enum variant: " + tag);
4227 }
4228 }
4229 }
4230};
4231
4232struct Witness {
4233 uint32_t value;
4234
4235 friend bool operator==(const Witness&, const Witness&);
4236
4237 void msgpack_pack(auto& packer) const { packer.pack(value); }
4238
4239 void msgpack_unpack(msgpack::object const& o)
4240 {
4241 try {
4242 o.convert(value);
4243 } catch (const msgpack::type_error&) {
4244 std::cerr << o << std::endl;
4245 throw_or_abort("error converting into newtype 'Witness'");
4246 }
4247 }
4248};
4249
4251
4252 struct Constant {
4253 std::vector<uint8_t> value;
4254
4255 friend bool operator==(const Constant&, const Constant&);
4256
4257 void msgpack_pack(auto& packer) const { packer.pack(value); }
4258
4259 void msgpack_unpack(msgpack::object const& o)
4260 {
4261 try {
4262 o.convert(value);
4263 } catch (const msgpack::type_error&) {
4264 std::cerr << o << std::endl;
4265 throw_or_abort("error converting into newtype 'Constant'");
4266 }
4267 }
4268 };
4269
4270 struct Witness {
4272
4273 friend bool operator==(const Witness&, const Witness&);
4274
4275 void msgpack_pack(auto& packer) const { packer.pack(value); }
4276
4277 void msgpack_unpack(msgpack::object const& o)
4278 {
4279 try {
4280 o.convert(value);
4281 } catch (const msgpack::type_error&) {
4282 std::cerr << o << std::endl;
4283 throw_or_abort("error converting into newtype 'Witness'");
4284 }
4285 }
4286 };
4287
4289
4290 friend bool operator==(const FunctionInput&, const FunctionInput&);
4291
4292 void msgpack_pack(auto& packer) const
4293 {
4294 std::string tag;
4295 bool is_unit;
4296 switch (value.index()) {
4297
4298 case 0:
4299 tag = "Constant";
4300 is_unit = false;
4301 break;
4302 case 1:
4303 tag = "Witness";
4304 is_unit = false;
4305 break;
4306 default:
4307 throw_or_abort("unknown enum 'FunctionInput' variant index: " + std::to_string(value.index()));
4308 }
4309 if (is_unit) {
4310 packer.pack(tag);
4311 } else {
4312 std::visit(
4313 [&packer, tag](const auto& arg) {
4314 packer.pack_map(1);
4315 packer.pack(tag);
4316 packer.pack(arg);
4317 },
4318 value);
4319 }
4320 }
4321
4322 void msgpack_unpack(msgpack::object const& o)
4323 {
4324
4325 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
4326 std::cerr << o << std::endl;
4327 throw_or_abort("expected MAP or STR for enum 'FunctionInput'; got type " + std::to_string(o.type));
4328 }
4329 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
4330 throw_or_abort("expected 1 entry for enum 'FunctionInput'; got " + std::to_string(o.via.map.size));
4331 }
4333 // `Format::MsgpackTagged` — int-keyed variant.
4334 uint8_t tag;
4335 try {
4336 o.via.map.ptr[0].key.convert(tag);
4337 } catch (const msgpack::type_error&) {
4338 std::cerr << o << std::endl;
4339 throw_or_abort("expected u8 variant tag for enum 'FunctionInput'");
4340 }
4341 switch (tag) {
4342 case 0: {
4343 Constant v;
4344 try {
4345 o.via.map.ptr[0].val.convert(v);
4346 } catch (const msgpack::type_error&) {
4347 std::cerr << o << std::endl;
4348 throw_or_abort("error converting into enum variant 'FunctionInput::Constant'");
4349 }
4350 value = v;
4351 break;
4352 }
4353 case 1: {
4354 Witness v;
4355 try {
4356 o.via.map.ptr[0].val.convert(v);
4357 } catch (const msgpack::type_error&) {
4358 std::cerr << o << std::endl;
4359 throw_or_abort("error converting into enum variant 'FunctionInput::Witness'");
4360 }
4361 value = v;
4362 break;
4363 }
4364 default:
4365 std::cerr << o << std::endl;
4366 throw_or_abort("unknown 'FunctionInput' enum variant tag: " + std::to_string(tag));
4367 }
4368 } else {
4369 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
4370 // unit variant (bare STR) — both dispatch on the variant name.
4371 std::string tag;
4372 try {
4373 if (o.type == msgpack::type::object_type::MAP) {
4374 o.via.map.ptr[0].key.convert(tag);
4375 } else {
4376 o.convert(tag);
4377 }
4378 } catch (const msgpack::type_error&) {
4379 std::cerr << o << std::endl;
4380 throw_or_abort("error converting tag to string for enum 'FunctionInput'");
4381 }
4382 if (tag == "Constant") {
4383 Constant v;
4384 try {
4385 o.via.map.ptr[0].val.convert(v);
4386 } catch (const msgpack::type_error&) {
4387 std::cerr << o << std::endl;
4388 throw_or_abort("error converting into enum variant 'FunctionInput::Constant'");
4389 }
4390
4391 value = v;
4392 } else if (tag == "Witness") {
4393 Witness v;
4394 try {
4395 o.via.map.ptr[0].val.convert(v);
4396 } catch (const msgpack::type_error&) {
4397 std::cerr << o << std::endl;
4398 throw_or_abort("error converting into enum variant 'FunctionInput::Witness'");
4399 }
4400
4401 value = v;
4402 } else {
4403 std::cerr << o << std::endl;
4404 throw_or_abort("unknown 'FunctionInput' enum variant: " + tag);
4405 }
4406 }
4407 }
4408};
4409
4411
4413 std::vector<Acir::FunctionInput> inputs;
4416 std::vector<Acir::Witness> outputs;
4417
4418 friend bool operator==(const AES128Encrypt&, const AES128Encrypt&);
4419
4420 void msgpack_pack(auto& packer) const
4421 {
4422 packer.pack_array(4);
4423 packer.pack(inputs);
4424 packer.pack(iv);
4425 packer.pack(key);
4426 packer.pack(outputs);
4427 }
4428
4429 void msgpack_unpack(msgpack::object const& o)
4430 {
4431 std::string name = "AES128Encrypt";
4432 if (o.type == msgpack::type::MAP) {
4434 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4435 switch (tag) {
4436 case 0:
4437 Helpers::convert_or_throw(val, name, "inputs", inputs);
4438 break;
4439 case 1:
4440 Helpers::convert_or_throw(val, name, "iv", iv);
4441 break;
4442 case 2:
4443 Helpers::convert_or_throw(val, name, "key", key);
4444 break;
4445 case 3:
4446 Helpers::convert_or_throw(val, name, "outputs", outputs);
4447 break;
4448 default:
4449 std::cerr << val << std::endl;
4450 throw_or_abort("unknown tag for AES128Encrypt: " + std::to_string(tag));
4451 }
4452 });
4453 } else {
4454 Helpers::check_size(o.via.map.size, name, 4, 0);
4455 auto kvmap = Helpers::make_kvmap(o, name);
4456 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
4457 Helpers::conv_fld_from_kvmap(kvmap, name, "iv", iv, false);
4458 Helpers::conv_fld_from_kvmap(kvmap, name, "key", key, false);
4459 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
4460 }
4461 } else if (o.type == msgpack::type::ARRAY) {
4462 auto array = o.via.array;
4463 Helpers::check_size(array.size, name, 4, 0);
4464 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
4465 Helpers::conv_fld_from_array(array, name, "iv", iv, 1);
4466 Helpers::conv_fld_from_array(array, name, "key", key, 2);
4467 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
4468 } else {
4469 throw_or_abort("expected MAP or ARRAY for " + name);
4470 }
4471 }
4472 };
4473
4474 struct AND {
4477 uint32_t num_bits;
4479
4480 friend bool operator==(const AND&, const AND&);
4481
4482 void msgpack_pack(auto& packer) const
4483 {
4484 packer.pack_array(4);
4485 packer.pack(lhs);
4486 packer.pack(rhs);
4487 packer.pack(num_bits);
4488 packer.pack(output);
4489 }
4490
4491 void msgpack_unpack(msgpack::object const& o)
4492 {
4493 std::string name = "AND";
4494 if (o.type == msgpack::type::MAP) {
4496 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4497 switch (tag) {
4498 case 0:
4499 Helpers::convert_or_throw(val, name, "lhs", lhs);
4500 break;
4501 case 1:
4502 Helpers::convert_or_throw(val, name, "rhs", rhs);
4503 break;
4504 case 2:
4505 Helpers::convert_or_throw(val, name, "num_bits", num_bits);
4506 break;
4507 case 3:
4508 Helpers::convert_or_throw(val, name, "output", output);
4509 break;
4510 default:
4511 std::cerr << val << std::endl;
4512 throw_or_abort("unknown tag for AND: " + std::to_string(tag));
4513 }
4514 });
4515 } else {
4516 Helpers::check_size(o.via.map.size, name, 4, 0);
4517 auto kvmap = Helpers::make_kvmap(o, name);
4518 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
4519 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
4520 Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false);
4521 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
4522 }
4523 } else if (o.type == msgpack::type::ARRAY) {
4524 auto array = o.via.array;
4525 Helpers::check_size(array.size, name, 4, 0);
4526 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 0);
4527 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 1);
4528 Helpers::conv_fld_from_array(array, name, "num_bits", num_bits, 2);
4529 Helpers::conv_fld_from_array(array, name, "output", output, 3);
4530 } else {
4531 throw_or_abort("expected MAP or ARRAY for " + name);
4532 }
4533 }
4534 };
4535
4536 struct XOR {
4539 uint32_t num_bits;
4541
4542 friend bool operator==(const XOR&, const XOR&);
4543
4544 void msgpack_pack(auto& packer) const
4545 {
4546 packer.pack_array(4);
4547 packer.pack(lhs);
4548 packer.pack(rhs);
4549 packer.pack(num_bits);
4550 packer.pack(output);
4551 }
4552
4553 void msgpack_unpack(msgpack::object const& o)
4554 {
4555 std::string name = "XOR";
4556 if (o.type == msgpack::type::MAP) {
4558 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4559 switch (tag) {
4560 case 0:
4561 Helpers::convert_or_throw(val, name, "lhs", lhs);
4562 break;
4563 case 1:
4564 Helpers::convert_or_throw(val, name, "rhs", rhs);
4565 break;
4566 case 2:
4567 Helpers::convert_or_throw(val, name, "num_bits", num_bits);
4568 break;
4569 case 3:
4570 Helpers::convert_or_throw(val, name, "output", output);
4571 break;
4572 default:
4573 std::cerr << val << std::endl;
4574 throw_or_abort("unknown tag for XOR: " + std::to_string(tag));
4575 }
4576 });
4577 } else {
4578 Helpers::check_size(o.via.map.size, name, 4, 0);
4579 auto kvmap = Helpers::make_kvmap(o, name);
4580 Helpers::conv_fld_from_kvmap(kvmap, name, "lhs", lhs, false);
4581 Helpers::conv_fld_from_kvmap(kvmap, name, "rhs", rhs, false);
4582 Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false);
4583 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
4584 }
4585 } else if (o.type == msgpack::type::ARRAY) {
4586 auto array = o.via.array;
4587 Helpers::check_size(array.size, name, 4, 0);
4588 Helpers::conv_fld_from_array(array, name, "lhs", lhs, 0);
4589 Helpers::conv_fld_from_array(array, name, "rhs", rhs, 1);
4590 Helpers::conv_fld_from_array(array, name, "num_bits", num_bits, 2);
4591 Helpers::conv_fld_from_array(array, name, "output", output, 3);
4592 } else {
4593 throw_or_abort("expected MAP or ARRAY for " + name);
4594 }
4595 }
4596 };
4597
4598 struct RANGE {
4600 uint32_t num_bits;
4601
4602 friend bool operator==(const RANGE&, const RANGE&);
4603
4604 void msgpack_pack(auto& packer) const
4605 {
4606 packer.pack_array(2);
4607 packer.pack(input);
4608 packer.pack(num_bits);
4609 }
4610
4611 void msgpack_unpack(msgpack::object const& o)
4612 {
4613 std::string name = "RANGE";
4614 if (o.type == msgpack::type::MAP) {
4616 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4617 switch (tag) {
4618 case 0:
4619 Helpers::convert_or_throw(val, name, "input", input);
4620 break;
4621 case 1:
4622 Helpers::convert_or_throw(val, name, "num_bits", num_bits);
4623 break;
4624 default:
4625 std::cerr << val << std::endl;
4626 throw_or_abort("unknown tag for RANGE: " + std::to_string(tag));
4627 }
4628 });
4629 } else {
4630 Helpers::check_size(o.via.map.size, name, 2, 0);
4631 auto kvmap = Helpers::make_kvmap(o, name);
4632 Helpers::conv_fld_from_kvmap(kvmap, name, "input", input, false);
4633 Helpers::conv_fld_from_kvmap(kvmap, name, "num_bits", num_bits, false);
4634 }
4635 } else if (o.type == msgpack::type::ARRAY) {
4636 auto array = o.via.array;
4637 Helpers::check_size(array.size, name, 2, 0);
4638 Helpers::conv_fld_from_array(array, name, "input", input, 0);
4639 Helpers::conv_fld_from_array(array, name, "num_bits", num_bits, 1);
4640 } else {
4641 throw_or_abort("expected MAP or ARRAY for " + name);
4642 }
4643 }
4644 };
4645
4646 struct Blake2s {
4647 std::vector<Acir::FunctionInput> inputs;
4649
4650 friend bool operator==(const Blake2s&, const Blake2s&);
4651
4652 void msgpack_pack(auto& packer) const
4653 {
4654 packer.pack_array(2);
4655 packer.pack(inputs);
4656 packer.pack(outputs);
4657 }
4658
4659 void msgpack_unpack(msgpack::object const& o)
4660 {
4661 std::string name = "Blake2s";
4662 if (o.type == msgpack::type::MAP) {
4664 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4665 switch (tag) {
4666 case 0:
4667 Helpers::convert_or_throw(val, name, "inputs", inputs);
4668 break;
4669 case 1:
4670 Helpers::convert_or_throw(val, name, "outputs", outputs);
4671 break;
4672 default:
4673 std::cerr << val << std::endl;
4674 throw_or_abort("unknown tag for Blake2s: " + std::to_string(tag));
4675 }
4676 });
4677 } else {
4678 Helpers::check_size(o.via.map.size, name, 2, 0);
4679 auto kvmap = Helpers::make_kvmap(o, name);
4680 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
4681 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
4682 }
4683 } else if (o.type == msgpack::type::ARRAY) {
4684 auto array = o.via.array;
4685 Helpers::check_size(array.size, name, 2, 0);
4686 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
4687 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
4688 } else {
4689 throw_or_abort("expected MAP or ARRAY for " + name);
4690 }
4691 }
4692 };
4693
4694 struct Blake3 {
4695 std::vector<Acir::FunctionInput> inputs;
4697
4698 friend bool operator==(const Blake3&, const Blake3&);
4699
4700 void msgpack_pack(auto& packer) const
4701 {
4702 packer.pack_array(2);
4703 packer.pack(inputs);
4704 packer.pack(outputs);
4705 }
4706
4707 void msgpack_unpack(msgpack::object const& o)
4708 {
4709 std::string name = "Blake3";
4710 if (o.type == msgpack::type::MAP) {
4712 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4713 switch (tag) {
4714 case 0:
4715 Helpers::convert_or_throw(val, name, "inputs", inputs);
4716 break;
4717 case 1:
4718 Helpers::convert_or_throw(val, name, "outputs", outputs);
4719 break;
4720 default:
4721 std::cerr << val << std::endl;
4722 throw_or_abort("unknown tag for Blake3: " + std::to_string(tag));
4723 }
4724 });
4725 } else {
4726 Helpers::check_size(o.via.map.size, name, 2, 0);
4727 auto kvmap = Helpers::make_kvmap(o, name);
4728 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
4729 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
4730 }
4731 } else if (o.type == msgpack::type::ARRAY) {
4732 auto array = o.via.array;
4733 Helpers::check_size(array.size, name, 2, 0);
4734 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
4735 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
4736 } else {
4737 throw_or_abort("expected MAP or ARRAY for " + name);
4738 }
4739 }
4740 };
4741
4749
4750 friend bool operator==(const EcdsaSecp256k1&, const EcdsaSecp256k1&);
4751
4752 void msgpack_pack(auto& packer) const
4753 {
4754 packer.pack_array(6);
4755 packer.pack(public_key_x);
4756 packer.pack(public_key_y);
4757 packer.pack(signature);
4758 packer.pack(hashed_message);
4759 packer.pack(predicate);
4760 packer.pack(output);
4761 }
4762
4763 void msgpack_unpack(msgpack::object const& o)
4764 {
4765 std::string name = "EcdsaSecp256k1";
4766 if (o.type == msgpack::type::MAP) {
4768 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4769 switch (tag) {
4770 case 0:
4771 Helpers::convert_or_throw(val, name, "public_key_x", public_key_x);
4772 break;
4773 case 1:
4774 Helpers::convert_or_throw(val, name, "public_key_y", public_key_y);
4775 break;
4776 case 2:
4777 Helpers::convert_or_throw(val, name, "signature", signature);
4778 break;
4779 case 3:
4780 Helpers::convert_or_throw(val, name, "hashed_message", hashed_message);
4781 break;
4782 case 4:
4783 Helpers::convert_or_throw(val, name, "predicate", predicate);
4784 break;
4785 case 5:
4786 Helpers::convert_or_throw(val, name, "output", output);
4787 break;
4788 default:
4789 std::cerr << val << std::endl;
4790 throw_or_abort("unknown tag for EcdsaSecp256k1: " + std::to_string(tag));
4791 }
4792 });
4793 } else {
4794 Helpers::check_size(o.via.map.size, name, 6, 0);
4795 auto kvmap = Helpers::make_kvmap(o, name);
4796 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
4797 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
4798 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
4799 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_message", hashed_message, false);
4800 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
4801 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
4802 }
4803 } else if (o.type == msgpack::type::ARRAY) {
4804 auto array = o.via.array;
4805 Helpers::check_size(array.size, name, 6, 0);
4806 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 0);
4807 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 1);
4808 Helpers::conv_fld_from_array(array, name, "signature", signature, 2);
4809 Helpers::conv_fld_from_array(array, name, "hashed_message", hashed_message, 3);
4810 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 4);
4811 Helpers::conv_fld_from_array(array, name, "output", output, 5);
4812 } else {
4813 throw_or_abort("expected MAP or ARRAY for " + name);
4814 }
4815 }
4816 };
4817
4825
4826 friend bool operator==(const EcdsaSecp256r1&, const EcdsaSecp256r1&);
4827
4828 void msgpack_pack(auto& packer) const
4829 {
4830 packer.pack_array(6);
4831 packer.pack(public_key_x);
4832 packer.pack(public_key_y);
4833 packer.pack(signature);
4834 packer.pack(hashed_message);
4835 packer.pack(predicate);
4836 packer.pack(output);
4837 }
4838
4839 void msgpack_unpack(msgpack::object const& o)
4840 {
4841 std::string name = "EcdsaSecp256r1";
4842 if (o.type == msgpack::type::MAP) {
4844 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4845 switch (tag) {
4846 case 0:
4847 Helpers::convert_or_throw(val, name, "public_key_x", public_key_x);
4848 break;
4849 case 1:
4850 Helpers::convert_or_throw(val, name, "public_key_y", public_key_y);
4851 break;
4852 case 2:
4853 Helpers::convert_or_throw(val, name, "signature", signature);
4854 break;
4855 case 3:
4856 Helpers::convert_or_throw(val, name, "hashed_message", hashed_message);
4857 break;
4858 case 4:
4859 Helpers::convert_or_throw(val, name, "predicate", predicate);
4860 break;
4861 case 5:
4862 Helpers::convert_or_throw(val, name, "output", output);
4863 break;
4864 default:
4865 std::cerr << val << std::endl;
4866 throw_or_abort("unknown tag for EcdsaSecp256r1: " + std::to_string(tag));
4867 }
4868 });
4869 } else {
4870 Helpers::check_size(o.via.map.size, name, 6, 0);
4871 auto kvmap = Helpers::make_kvmap(o, name);
4872 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_x", public_key_x, false);
4873 Helpers::conv_fld_from_kvmap(kvmap, name, "public_key_y", public_key_y, false);
4874 Helpers::conv_fld_from_kvmap(kvmap, name, "signature", signature, false);
4875 Helpers::conv_fld_from_kvmap(kvmap, name, "hashed_message", hashed_message, false);
4876 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
4877 Helpers::conv_fld_from_kvmap(kvmap, name, "output", output, false);
4878 }
4879 } else if (o.type == msgpack::type::ARRAY) {
4880 auto array = o.via.array;
4881 Helpers::check_size(array.size, name, 6, 0);
4882 Helpers::conv_fld_from_array(array, name, "public_key_x", public_key_x, 0);
4883 Helpers::conv_fld_from_array(array, name, "public_key_y", public_key_y, 1);
4884 Helpers::conv_fld_from_array(array, name, "signature", signature, 2);
4885 Helpers::conv_fld_from_array(array, name, "hashed_message", hashed_message, 3);
4886 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 4);
4887 Helpers::conv_fld_from_array(array, name, "output", output, 5);
4888 } else {
4889 throw_or_abort("expected MAP or ARRAY for " + name);
4890 }
4891 }
4892 };
4893
4895 std::vector<Acir::FunctionInput> points;
4896 std::vector<Acir::FunctionInput> scalars;
4899
4900 friend bool operator==(const MultiScalarMul&, const MultiScalarMul&);
4901
4902 void msgpack_pack(auto& packer) const
4903 {
4904 packer.pack_array(4);
4905 packer.pack(points);
4906 packer.pack(scalars);
4907 packer.pack(predicate);
4908 packer.pack(outputs);
4909 }
4910
4911 void msgpack_unpack(msgpack::object const& o)
4912 {
4913 std::string name = "MultiScalarMul";
4914 if (o.type == msgpack::type::MAP) {
4916 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4917 switch (tag) {
4918 case 0:
4919 Helpers::convert_or_throw(val, name, "points", points);
4920 break;
4921 case 1:
4922 Helpers::convert_or_throw(val, name, "scalars", scalars);
4923 break;
4924 case 2:
4925 Helpers::convert_or_throw(val, name, "predicate", predicate);
4926 break;
4927 case 3:
4928 Helpers::convert_or_throw(val, name, "outputs", outputs);
4929 break;
4930 default:
4931 std::cerr << val << std::endl;
4932 throw_or_abort("unknown tag for MultiScalarMul: " + std::to_string(tag));
4933 }
4934 });
4935 } else {
4936 Helpers::check_size(o.via.map.size, name, 4, 0);
4937 auto kvmap = Helpers::make_kvmap(o, name);
4938 Helpers::conv_fld_from_kvmap(kvmap, name, "points", points, false);
4939 Helpers::conv_fld_from_kvmap(kvmap, name, "scalars", scalars, false);
4940 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
4941 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
4942 }
4943 } else if (o.type == msgpack::type::ARRAY) {
4944 auto array = o.via.array;
4945 Helpers::check_size(array.size, name, 4, 0);
4946 Helpers::conv_fld_from_array(array, name, "points", points, 0);
4947 Helpers::conv_fld_from_array(array, name, "scalars", scalars, 1);
4948 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 2);
4949 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
4950 } else {
4951 throw_or_abort("expected MAP or ARRAY for " + name);
4952 }
4953 }
4954 };
4955
4961
4962 friend bool operator==(const EmbeddedCurveAdd&, const EmbeddedCurveAdd&);
4963
4964 void msgpack_pack(auto& packer) const
4965 {
4966 packer.pack_array(4);
4967 packer.pack(input1);
4968 packer.pack(input2);
4969 packer.pack(predicate);
4970 packer.pack(outputs);
4971 }
4972
4973 void msgpack_unpack(msgpack::object const& o)
4974 {
4975 std::string name = "EmbeddedCurveAdd";
4976 if (o.type == msgpack::type::MAP) {
4978 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
4979 switch (tag) {
4980 case 0:
4981 Helpers::convert_or_throw(val, name, "input1", input1);
4982 break;
4983 case 1:
4984 Helpers::convert_or_throw(val, name, "input2", input2);
4985 break;
4986 case 2:
4987 Helpers::convert_or_throw(val, name, "predicate", predicate);
4988 break;
4989 case 3:
4990 Helpers::convert_or_throw(val, name, "outputs", outputs);
4991 break;
4992 default:
4993 std::cerr << val << std::endl;
4994 throw_or_abort("unknown tag for EmbeddedCurveAdd: " + std::to_string(tag));
4995 }
4996 });
4997 } else {
4998 Helpers::check_size(o.via.map.size, name, 4, 0);
4999 auto kvmap = Helpers::make_kvmap(o, name);
5000 Helpers::conv_fld_from_kvmap(kvmap, name, "input1", input1, false);
5001 Helpers::conv_fld_from_kvmap(kvmap, name, "input2", input2, false);
5002 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
5003 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
5004 }
5005 } else if (o.type == msgpack::type::ARRAY) {
5006 auto array = o.via.array;
5007 Helpers::check_size(array.size, name, 4, 0);
5008 Helpers::conv_fld_from_array(array, name, "input1", input1, 0);
5009 Helpers::conv_fld_from_array(array, name, "input2", input2, 1);
5010 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 2);
5011 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 3);
5012 } else {
5013 throw_or_abort("expected MAP or ARRAY for " + name);
5014 }
5015 }
5016 };
5017
5021
5022 friend bool operator==(const Keccakf1600&, const Keccakf1600&);
5023
5024 void msgpack_pack(auto& packer) const
5025 {
5026 packer.pack_array(2);
5027 packer.pack(inputs);
5028 packer.pack(outputs);
5029 }
5030
5031 void msgpack_unpack(msgpack::object const& o)
5032 {
5033 std::string name = "Keccakf1600";
5034 if (o.type == msgpack::type::MAP) {
5036 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
5037 switch (tag) {
5038 case 0:
5039 Helpers::convert_or_throw(val, name, "inputs", inputs);
5040 break;
5041 case 1:
5042 Helpers::convert_or_throw(val, name, "outputs", outputs);
5043 break;
5044 default:
5045 std::cerr << val << std::endl;
5046 throw_or_abort("unknown tag for Keccakf1600: " + std::to_string(tag));
5047 }
5048 });
5049 } else {
5050 Helpers::check_size(o.via.map.size, name, 2, 0);
5051 auto kvmap = Helpers::make_kvmap(o, name);
5052 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
5053 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
5054 }
5055 } else if (o.type == msgpack::type::ARRAY) {
5056 auto array = o.via.array;
5057 Helpers::check_size(array.size, name, 2, 0);
5058 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
5059 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
5060 } else {
5061 throw_or_abort("expected MAP or ARRAY for " + name);
5062 }
5063 }
5064 };
5065
5067 std::vector<Acir::FunctionInput> verification_key;
5068 std::vector<Acir::FunctionInput> proof;
5069 std::vector<Acir::FunctionInput> public_inputs;
5071 uint32_t proof_type;
5073
5074 friend bool operator==(const RecursiveAggregation&, const RecursiveAggregation&);
5075
5076 void msgpack_pack(auto& packer) const
5077 {
5078 packer.pack_array(6);
5079 packer.pack(verification_key);
5080 packer.pack(proof);
5081 packer.pack(public_inputs);
5082 packer.pack(key_hash);
5083 packer.pack(proof_type);
5084 packer.pack(predicate);
5085 }
5086
5087 void msgpack_unpack(msgpack::object const& o)
5088 {
5089 std::string name = "RecursiveAggregation";
5090 if (o.type == msgpack::type::MAP) {
5092 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
5093 switch (tag) {
5094 case 0:
5095 Helpers::convert_or_throw(val, name, "verification_key", verification_key);
5096 break;
5097 case 1:
5098 Helpers::convert_or_throw(val, name, "proof", proof);
5099 break;
5100 case 2:
5101 Helpers::convert_or_throw(val, name, "public_inputs", public_inputs);
5102 break;
5103 case 3:
5104 Helpers::convert_or_throw(val, name, "key_hash", key_hash);
5105 break;
5106 case 4:
5107 Helpers::convert_or_throw(val, name, "proof_type", proof_type);
5108 break;
5109 case 5:
5110 Helpers::convert_or_throw(val, name, "predicate", predicate);
5111 break;
5112 default:
5113 std::cerr << val << std::endl;
5114 throw_or_abort("unknown tag for RecursiveAggregation: " + std::to_string(tag));
5115 }
5116 });
5117 } else {
5118 Helpers::check_size(o.via.map.size, name, 6, 0);
5119 auto kvmap = Helpers::make_kvmap(o, name);
5120 Helpers::conv_fld_from_kvmap(kvmap, name, "verification_key", verification_key, false);
5121 Helpers::conv_fld_from_kvmap(kvmap, name, "proof", proof, false);
5122 Helpers::conv_fld_from_kvmap(kvmap, name, "public_inputs", public_inputs, false);
5123 Helpers::conv_fld_from_kvmap(kvmap, name, "key_hash", key_hash, false);
5124 Helpers::conv_fld_from_kvmap(kvmap, name, "proof_type", proof_type, false);
5125 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
5126 }
5127 } else if (o.type == msgpack::type::ARRAY) {
5128 auto array = o.via.array;
5129 Helpers::check_size(array.size, name, 6, 0);
5130 Helpers::conv_fld_from_array(array, name, "verification_key", verification_key, 0);
5131 Helpers::conv_fld_from_array(array, name, "proof", proof, 1);
5132 Helpers::conv_fld_from_array(array, name, "public_inputs", public_inputs, 2);
5133 Helpers::conv_fld_from_array(array, name, "key_hash", key_hash, 3);
5134 Helpers::conv_fld_from_array(array, name, "proof_type", proof_type, 4);
5135 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 5);
5136 } else {
5137 throw_or_abort("expected MAP or ARRAY for " + name);
5138 }
5139 }
5140 };
5141
5143 std::vector<Acir::FunctionInput> inputs;
5144 std::vector<Acir::Witness> outputs;
5145
5146 friend bool operator==(const Poseidon2Permutation&, const Poseidon2Permutation&);
5147
5148 void msgpack_pack(auto& packer) const
5149 {
5150 packer.pack_array(2);
5151 packer.pack(inputs);
5152 packer.pack(outputs);
5153 }
5154
5155 void msgpack_unpack(msgpack::object const& o)
5156 {
5157 std::string name = "Poseidon2Permutation";
5158 if (o.type == msgpack::type::MAP) {
5160 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
5161 switch (tag) {
5162 case 0:
5163 Helpers::convert_or_throw(val, name, "inputs", inputs);
5164 break;
5165 case 1:
5166 Helpers::convert_or_throw(val, name, "outputs", outputs);
5167 break;
5168 default:
5169 std::cerr << val << std::endl;
5170 throw_or_abort("unknown tag for Poseidon2Permutation: " + std::to_string(tag));
5171 }
5172 });
5173 } else {
5174 Helpers::check_size(o.via.map.size, name, 2, 0);
5175 auto kvmap = Helpers::make_kvmap(o, name);
5176 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
5177 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
5178 }
5179 } else if (o.type == msgpack::type::ARRAY) {
5180 auto array = o.via.array;
5181 Helpers::check_size(array.size, name, 2, 0);
5182 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
5183 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 1);
5184 } else {
5185 throw_or_abort("expected MAP or ARRAY for " + name);
5186 }
5187 }
5188 };
5189
5194
5195 friend bool operator==(const Sha256Compression&, const Sha256Compression&);
5196
5197 void msgpack_pack(auto& packer) const
5198 {
5199 packer.pack_array(3);
5200 packer.pack(inputs);
5201 packer.pack(hash_values);
5202 packer.pack(outputs);
5203 }
5204
5205 void msgpack_unpack(msgpack::object const& o)
5206 {
5207 std::string name = "Sha256Compression";
5208 if (o.type == msgpack::type::MAP) {
5210 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
5211 switch (tag) {
5212 case 0:
5213 Helpers::convert_or_throw(val, name, "inputs", inputs);
5214 break;
5215 case 1:
5216 Helpers::convert_or_throw(val, name, "hash_values", hash_values);
5217 break;
5218 case 2:
5219 Helpers::convert_or_throw(val, name, "outputs", outputs);
5220 break;
5221 default:
5222 std::cerr << val << std::endl;
5223 throw_or_abort("unknown tag for Sha256Compression: " + std::to_string(tag));
5224 }
5225 });
5226 } else {
5227 Helpers::check_size(o.via.map.size, name, 3, 0);
5228 auto kvmap = Helpers::make_kvmap(o, name);
5229 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
5230 Helpers::conv_fld_from_kvmap(kvmap, name, "hash_values", hash_values, false);
5231 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
5232 }
5233 } else if (o.type == msgpack::type::ARRAY) {
5234 auto array = o.via.array;
5235 Helpers::check_size(array.size, name, 3, 0);
5236 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 0);
5237 Helpers::conv_fld_from_array(array, name, "hash_values", hash_values, 1);
5238 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
5239 } else {
5240 throw_or_abort("expected MAP or ARRAY for " + name);
5241 }
5242 }
5243 };
5244
5245 std::variant<AES128Encrypt,
5246 AND,
5247 XOR,
5248 RANGE,
5249 Blake2s,
5250 Blake3,
5251 EcdsaSecp256k1,
5252 EcdsaSecp256r1,
5253 MultiScalarMul,
5254 EmbeddedCurveAdd,
5255 Keccakf1600,
5256 RecursiveAggregation,
5257 Poseidon2Permutation,
5258 Sha256Compression>
5260
5261 friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&);
5262
5263 void msgpack_pack(auto& packer) const
5264 {
5265 std::string tag;
5266 bool is_unit;
5267 switch (value.index()) {
5268
5269 case 0:
5270 tag = "AES128Encrypt";
5271 is_unit = false;
5272 break;
5273 case 1:
5274 tag = "AND";
5275 is_unit = false;
5276 break;
5277 case 2:
5278 tag = "XOR";
5279 is_unit = false;
5280 break;
5281 case 3:
5282 tag = "RANGE";
5283 is_unit = false;
5284 break;
5285 case 4:
5286 tag = "Blake2s";
5287 is_unit = false;
5288 break;
5289 case 5:
5290 tag = "Blake3";
5291 is_unit = false;
5292 break;
5293 case 6:
5294 tag = "EcdsaSecp256k1";
5295 is_unit = false;
5296 break;
5297 case 7:
5298 tag = "EcdsaSecp256r1";
5299 is_unit = false;
5300 break;
5301 case 8:
5302 tag = "MultiScalarMul";
5303 is_unit = false;
5304 break;
5305 case 9:
5306 tag = "EmbeddedCurveAdd";
5307 is_unit = false;
5308 break;
5309 case 10:
5310 tag = "Keccakf1600";
5311 is_unit = false;
5312 break;
5313 case 11:
5314 tag = "RecursiveAggregation";
5315 is_unit = false;
5316 break;
5317 case 12:
5318 tag = "Poseidon2Permutation";
5319 is_unit = false;
5320 break;
5321 case 13:
5322 tag = "Sha256Compression";
5323 is_unit = false;
5324 break;
5325 default:
5326 throw_or_abort("unknown enum 'BlackBoxFuncCall' variant index: " + std::to_string(value.index()));
5327 }
5328 if (is_unit) {
5329 packer.pack(tag);
5330 } else {
5331 std::visit(
5332 [&packer, tag](const auto& arg) {
5333 packer.pack_map(1);
5334 packer.pack(tag);
5335 packer.pack(arg);
5336 },
5337 value);
5338 }
5339 }
5340
5341 void msgpack_unpack(msgpack::object const& o)
5342 {
5343
5344 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
5345 std::cerr << o << std::endl;
5346 throw_or_abort("expected MAP or STR for enum 'BlackBoxFuncCall'; got type " + std::to_string(o.type));
5347 }
5348 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
5349 throw_or_abort("expected 1 entry for enum 'BlackBoxFuncCall'; got " + std::to_string(o.via.map.size));
5350 }
5352 // `Format::MsgpackTagged` — int-keyed variant.
5353 uint8_t tag;
5354 try {
5355 o.via.map.ptr[0].key.convert(tag);
5356 } catch (const msgpack::type_error&) {
5357 std::cerr << o << std::endl;
5358 throw_or_abort("expected u8 variant tag for enum 'BlackBoxFuncCall'");
5359 }
5360 switch (tag) {
5361 case 0: {
5362 AES128Encrypt v;
5363 try {
5364 o.via.map.ptr[0].val.convert(v);
5365 } catch (const msgpack::type_error&) {
5366 std::cerr << o << std::endl;
5367 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::AES128Encrypt'");
5368 }
5369 value = v;
5370 break;
5371 }
5372 case 1: {
5373 AND v;
5374 try {
5375 o.via.map.ptr[0].val.convert(v);
5376 } catch (const msgpack::type_error&) {
5377 std::cerr << o << std::endl;
5378 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::AND'");
5379 }
5380 value = v;
5381 break;
5382 }
5383 case 2: {
5384 XOR v;
5385 try {
5386 o.via.map.ptr[0].val.convert(v);
5387 } catch (const msgpack::type_error&) {
5388 std::cerr << o << std::endl;
5389 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::XOR'");
5390 }
5391 value = v;
5392 break;
5393 }
5394 case 3: {
5395 RANGE v;
5396 try {
5397 o.via.map.ptr[0].val.convert(v);
5398 } catch (const msgpack::type_error&) {
5399 std::cerr << o << std::endl;
5400 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::RANGE'");
5401 }
5402 value = v;
5403 break;
5404 }
5405 case 4: {
5406 Blake2s v;
5407 try {
5408 o.via.map.ptr[0].val.convert(v);
5409 } catch (const msgpack::type_error&) {
5410 std::cerr << o << std::endl;
5411 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Blake2s'");
5412 }
5413 value = v;
5414 break;
5415 }
5416 case 5: {
5417 Blake3 v;
5418 try {
5419 o.via.map.ptr[0].val.convert(v);
5420 } catch (const msgpack::type_error&) {
5421 std::cerr << o << std::endl;
5422 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Blake3'");
5423 }
5424 value = v;
5425 break;
5426 }
5427 case 6: {
5429 try {
5430 o.via.map.ptr[0].val.convert(v);
5431 } catch (const msgpack::type_error&) {
5432 std::cerr << o << std::endl;
5433 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EcdsaSecp256k1'");
5434 }
5435 value = v;
5436 break;
5437 }
5438 case 7: {
5440 try {
5441 o.via.map.ptr[0].val.convert(v);
5442 } catch (const msgpack::type_error&) {
5443 std::cerr << o << std::endl;
5444 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EcdsaSecp256r1'");
5445 }
5446 value = v;
5447 break;
5448 }
5449 case 8: {
5451 try {
5452 o.via.map.ptr[0].val.convert(v);
5453 } catch (const msgpack::type_error&) {
5454 std::cerr << o << std::endl;
5455 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::MultiScalarMul'");
5456 }
5457 value = v;
5458 break;
5459 }
5460 case 9: {
5462 try {
5463 o.via.map.ptr[0].val.convert(v);
5464 } catch (const msgpack::type_error&) {
5465 std::cerr << o << std::endl;
5466 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EmbeddedCurveAdd'");
5467 }
5468 value = v;
5469 break;
5470 }
5471 case 10: {
5472 Keccakf1600 v;
5473 try {
5474 o.via.map.ptr[0].val.convert(v);
5475 } catch (const msgpack::type_error&) {
5476 std::cerr << o << std::endl;
5477 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Keccakf1600'");
5478 }
5479 value = v;
5480 break;
5481 }
5482 case 11: {
5484 try {
5485 o.via.map.ptr[0].val.convert(v);
5486 } catch (const msgpack::type_error&) {
5487 std::cerr << o << std::endl;
5488 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::RecursiveAggregation'");
5489 }
5490 value = v;
5491 break;
5492 }
5493 case 12: {
5495 try {
5496 o.via.map.ptr[0].val.convert(v);
5497 } catch (const msgpack::type_error&) {
5498 std::cerr << o << std::endl;
5499 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Poseidon2Permutation'");
5500 }
5501 value = v;
5502 break;
5503 }
5504 case 13: {
5506 try {
5507 o.via.map.ptr[0].val.convert(v);
5508 } catch (const msgpack::type_error&) {
5509 std::cerr << o << std::endl;
5510 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Sha256Compression'");
5511 }
5512 value = v;
5513 break;
5514 }
5515 default:
5516 std::cerr << o << std::endl;
5517 throw_or_abort("unknown 'BlackBoxFuncCall' enum variant tag: " + std::to_string(tag));
5518 }
5519 } else {
5520 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
5521 // unit variant (bare STR) — both dispatch on the variant name.
5522 std::string tag;
5523 try {
5524 if (o.type == msgpack::type::object_type::MAP) {
5525 o.via.map.ptr[0].key.convert(tag);
5526 } else {
5527 o.convert(tag);
5528 }
5529 } catch (const msgpack::type_error&) {
5530 std::cerr << o << std::endl;
5531 throw_or_abort("error converting tag to string for enum 'BlackBoxFuncCall'");
5532 }
5533 if (tag == "AES128Encrypt") {
5534 AES128Encrypt v;
5535 try {
5536 o.via.map.ptr[0].val.convert(v);
5537 } catch (const msgpack::type_error&) {
5538 std::cerr << o << std::endl;
5539 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::AES128Encrypt'");
5540 }
5541
5542 value = v;
5543 } else if (tag == "AND") {
5544 AND v;
5545 try {
5546 o.via.map.ptr[0].val.convert(v);
5547 } catch (const msgpack::type_error&) {
5548 std::cerr << o << std::endl;
5549 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::AND'");
5550 }
5551
5552 value = v;
5553 } else if (tag == "XOR") {
5554 XOR v;
5555 try {
5556 o.via.map.ptr[0].val.convert(v);
5557 } catch (const msgpack::type_error&) {
5558 std::cerr << o << std::endl;
5559 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::XOR'");
5560 }
5561
5562 value = v;
5563 } else if (tag == "RANGE") {
5564 RANGE v;
5565 try {
5566 o.via.map.ptr[0].val.convert(v);
5567 } catch (const msgpack::type_error&) {
5568 std::cerr << o << std::endl;
5569 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::RANGE'");
5570 }
5571
5572 value = v;
5573 } else if (tag == "Blake2s") {
5574 Blake2s v;
5575 try {
5576 o.via.map.ptr[0].val.convert(v);
5577 } catch (const msgpack::type_error&) {
5578 std::cerr << o << std::endl;
5579 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Blake2s'");
5580 }
5581
5582 value = v;
5583 } else if (tag == "Blake3") {
5584 Blake3 v;
5585 try {
5586 o.via.map.ptr[0].val.convert(v);
5587 } catch (const msgpack::type_error&) {
5588 std::cerr << o << std::endl;
5589 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Blake3'");
5590 }
5591
5592 value = v;
5593 } else if (tag == "EcdsaSecp256k1") {
5595 try {
5596 o.via.map.ptr[0].val.convert(v);
5597 } catch (const msgpack::type_error&) {
5598 std::cerr << o << std::endl;
5599 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EcdsaSecp256k1'");
5600 }
5601
5602 value = v;
5603 } else if (tag == "EcdsaSecp256r1") {
5605 try {
5606 o.via.map.ptr[0].val.convert(v);
5607 } catch (const msgpack::type_error&) {
5608 std::cerr << o << std::endl;
5609 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EcdsaSecp256r1'");
5610 }
5611
5612 value = v;
5613 } else if (tag == "MultiScalarMul") {
5615 try {
5616 o.via.map.ptr[0].val.convert(v);
5617 } catch (const msgpack::type_error&) {
5618 std::cerr << o << std::endl;
5619 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::MultiScalarMul'");
5620 }
5621
5622 value = v;
5623 } else if (tag == "EmbeddedCurveAdd") {
5625 try {
5626 o.via.map.ptr[0].val.convert(v);
5627 } catch (const msgpack::type_error&) {
5628 std::cerr << o << std::endl;
5629 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::EmbeddedCurveAdd'");
5630 }
5631
5632 value = v;
5633 } else if (tag == "Keccakf1600") {
5634 Keccakf1600 v;
5635 try {
5636 o.via.map.ptr[0].val.convert(v);
5637 } catch (const msgpack::type_error&) {
5638 std::cerr << o << std::endl;
5639 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Keccakf1600'");
5640 }
5641
5642 value = v;
5643 } else if (tag == "RecursiveAggregation") {
5645 try {
5646 o.via.map.ptr[0].val.convert(v);
5647 } catch (const msgpack::type_error&) {
5648 std::cerr << o << std::endl;
5649 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::RecursiveAggregation'");
5650 }
5651
5652 value = v;
5653 } else if (tag == "Poseidon2Permutation") {
5655 try {
5656 o.via.map.ptr[0].val.convert(v);
5657 } catch (const msgpack::type_error&) {
5658 std::cerr << o << std::endl;
5659 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Poseidon2Permutation'");
5660 }
5661
5662 value = v;
5663 } else if (tag == "Sha256Compression") {
5665 try {
5666 o.via.map.ptr[0].val.convert(v);
5667 } catch (const msgpack::type_error&) {
5668 std::cerr << o << std::endl;
5669 throw_or_abort("error converting into enum variant 'BlackBoxFuncCall::Sha256Compression'");
5670 }
5671
5672 value = v;
5673 } else {
5674 std::cerr << o << std::endl;
5675 throw_or_abort("unknown 'BlackBoxFuncCall' enum variant: " + tag);
5676 }
5677 }
5678 }
5679};
5680
5681struct BlockId {
5682 uint32_t value;
5683
5684 friend bool operator==(const BlockId&, const BlockId&);
5685
5686 void msgpack_pack(auto& packer) const { packer.pack(value); }
5687
5688 void msgpack_unpack(msgpack::object const& o)
5689 {
5690 try {
5691 o.convert(value);
5692 } catch (const msgpack::type_error&) {
5693 std::cerr << o << std::endl;
5694 throw_or_abort("error converting into newtype 'BlockId'");
5695 }
5696 }
5697};
5698
5700
5701 struct Memory {
5702 friend bool operator==(const Memory&, const Memory&);
5703
5704 void msgpack_pack(auto& packer) const {}
5705 void msgpack_unpack(msgpack::object const& o) {}
5706 };
5707
5708 struct CallData {
5709 uint32_t value;
5710
5711 friend bool operator==(const CallData&, const CallData&);
5712
5713 void msgpack_pack(auto& packer) const { packer.pack(value); }
5714
5715 void msgpack_unpack(msgpack::object const& o)
5716 {
5717 try {
5718 o.convert(value);
5719 } catch (const msgpack::type_error&) {
5720 std::cerr << o << std::endl;
5721 throw_or_abort("error converting into newtype 'CallData'");
5722 }
5723 }
5724 };
5725
5726 struct ReturnData {
5727 friend bool operator==(const ReturnData&, const ReturnData&);
5728
5729 void msgpack_pack(auto& packer) const {}
5730 void msgpack_unpack(msgpack::object const& o) {}
5731 };
5732
5734
5735 friend bool operator==(const BlockType&, const BlockType&);
5736
5737 void msgpack_pack(auto& packer) const
5738 {
5739 std::string tag;
5740 bool is_unit;
5741 switch (value.index()) {
5742
5743 case 0:
5744 tag = "Memory";
5745 is_unit = true;
5746 break;
5747 case 1:
5748 tag = "CallData";
5749 is_unit = false;
5750 break;
5751 case 2:
5752 tag = "ReturnData";
5753 is_unit = true;
5754 break;
5755 default:
5756 throw_or_abort("unknown enum 'BlockType' variant index: " + std::to_string(value.index()));
5757 }
5758 if (is_unit) {
5759 packer.pack(tag);
5760 } else {
5761 std::visit(
5762 [&packer, tag](const auto& arg) {
5763 packer.pack_map(1);
5764 packer.pack(tag);
5765 packer.pack(arg);
5766 },
5767 value);
5768 }
5769 }
5770
5771 void msgpack_unpack(msgpack::object const& o)
5772 {
5773
5774 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
5775 std::cerr << o << std::endl;
5776 throw_or_abort("expected MAP or STR for enum 'BlockType'; got type " + std::to_string(o.type));
5777 }
5778 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
5779 throw_or_abort("expected 1 entry for enum 'BlockType'; got " + std::to_string(o.via.map.size));
5780 }
5782 // `Format::MsgpackTagged` — int-keyed variant.
5783 uint8_t tag;
5784 try {
5785 o.via.map.ptr[0].key.convert(tag);
5786 } catch (const msgpack::type_error&) {
5787 std::cerr << o << std::endl;
5788 throw_or_abort("expected u8 variant tag for enum 'BlockType'");
5789 }
5790 switch (tag) {
5791 case 0: {
5792 Memory v;
5793 value = v;
5794 break;
5795 }
5796 case 1: {
5797 CallData v;
5798 try {
5799 o.via.map.ptr[0].val.convert(v);
5800 } catch (const msgpack::type_error&) {
5801 std::cerr << o << std::endl;
5802 throw_or_abort("error converting into enum variant 'BlockType::CallData'");
5803 }
5804 value = v;
5805 break;
5806 }
5807 case 2: {
5808 ReturnData v;
5809 value = v;
5810 break;
5811 }
5812 default:
5813 std::cerr << o << std::endl;
5814 throw_or_abort("unknown 'BlockType' enum variant tag: " + std::to_string(tag));
5815 }
5816 } else {
5817 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
5818 // unit variant (bare STR) — both dispatch on the variant name.
5819 std::string tag;
5820 try {
5821 if (o.type == msgpack::type::object_type::MAP) {
5822 o.via.map.ptr[0].key.convert(tag);
5823 } else {
5824 o.convert(tag);
5825 }
5826 } catch (const msgpack::type_error&) {
5827 std::cerr << o << std::endl;
5828 throw_or_abort("error converting tag to string for enum 'BlockType'");
5829 }
5830 if (tag == "Memory") {
5831 Memory v;
5832 value = v;
5833 } else if (tag == "CallData") {
5834 CallData v;
5835 try {
5836 o.via.map.ptr[0].val.convert(v);
5837 } catch (const msgpack::type_error&) {
5838 std::cerr << o << std::endl;
5839 throw_or_abort("error converting into enum variant 'BlockType::CallData'");
5840 }
5841
5842 value = v;
5843 } else if (tag == "ReturnData") {
5844 ReturnData v;
5845 value = v;
5846 } else {
5847 std::cerr << o << std::endl;
5848 throw_or_abort("unknown 'BlockType' enum variant: " + tag);
5849 }
5850 }
5851 }
5852};
5853
5857 std::vector<uint8_t> q_c;
5858
5859 friend bool operator==(const Expression&, const Expression&);
5860
5861 void msgpack_pack(auto& packer) const
5862 {
5863 packer.pack_array(3);
5864 packer.pack(mul_terms);
5865 packer.pack(linear_combinations);
5866 packer.pack(q_c);
5867 }
5868
5869 void msgpack_unpack(msgpack::object const& o)
5870 {
5871 std::string name = "Expression";
5872 if (o.type == msgpack::type::MAP) {
5874 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
5875 switch (tag) {
5876 case 0:
5877 Helpers::convert_or_throw(val, name, "mul_terms", mul_terms);
5878 break;
5879 case 1:
5880 Helpers::convert_or_throw(val, name, "linear_combinations", linear_combinations);
5881 break;
5882 case 2:
5883 Helpers::convert_or_throw(val, name, "q_c", q_c);
5884 break;
5885 default:
5886 std::cerr << val << std::endl;
5887 throw_or_abort("unknown tag for Expression: " + std::to_string(tag));
5888 }
5889 });
5890 } else {
5891 Helpers::check_size(o.via.map.size, name, 3, 0);
5892 auto kvmap = Helpers::make_kvmap(o, name);
5893 Helpers::conv_fld_from_kvmap(kvmap, name, "mul_terms", mul_terms, false);
5894 Helpers::conv_fld_from_kvmap(kvmap, name, "linear_combinations", linear_combinations, false);
5895 Helpers::conv_fld_from_kvmap(kvmap, name, "q_c", q_c, false);
5896 }
5897 } else if (o.type == msgpack::type::ARRAY) {
5898 auto array = o.via.array;
5899 Helpers::check_size(array.size, name, 3, 0);
5900 Helpers::conv_fld_from_array(array, name, "mul_terms", mul_terms, 0);
5901 Helpers::conv_fld_from_array(array, name, "linear_combinations", linear_combinations, 1);
5902 Helpers::conv_fld_from_array(array, name, "q_c", q_c, 2);
5903 } else {
5904 throw_or_abort("expected MAP or ARRAY for " + name);
5905 }
5906 }
5907};
5908
5910
5911 struct Single {
5913
5914 friend bool operator==(const Single&, const Single&);
5915
5916 void msgpack_pack(auto& packer) const { packer.pack(value); }
5917
5918 void msgpack_unpack(msgpack::object const& o)
5919 {
5920 try {
5921 o.convert(value);
5922 } catch (const msgpack::type_error&) {
5923 std::cerr << o << std::endl;
5924 throw_or_abort("error converting into newtype 'Single'");
5925 }
5926 }
5927 };
5928
5929 struct Array {
5930 std::vector<Acir::Expression> value;
5931
5932 friend bool operator==(const Array&, const Array&);
5933
5934 void msgpack_pack(auto& packer) const { packer.pack(value); }
5935
5936 void msgpack_unpack(msgpack::object const& o)
5937 {
5938 try {
5939 o.convert(value);
5940 } catch (const msgpack::type_error&) {
5941 std::cerr << o << std::endl;
5942 throw_or_abort("error converting into newtype 'Array'");
5943 }
5944 }
5945 };
5946
5949
5950 friend bool operator==(const MemoryArray&, const MemoryArray&);
5951
5952 void msgpack_pack(auto& packer) const { packer.pack(value); }
5953
5954 void msgpack_unpack(msgpack::object const& o)
5955 {
5956 try {
5957 o.convert(value);
5958 } catch (const msgpack::type_error&) {
5959 std::cerr << o << std::endl;
5960 throw_or_abort("error converting into newtype 'MemoryArray'");
5961 }
5962 }
5963 };
5964
5966
5967 friend bool operator==(const BrilligInputs&, const BrilligInputs&);
5968
5969 void msgpack_pack(auto& packer) const
5970 {
5971 std::string tag;
5972 bool is_unit;
5973 switch (value.index()) {
5974
5975 case 0:
5976 tag = "Single";
5977 is_unit = false;
5978 break;
5979 case 1:
5980 tag = "Array";
5981 is_unit = false;
5982 break;
5983 case 2:
5984 tag = "MemoryArray";
5985 is_unit = false;
5986 break;
5987 default:
5988 throw_or_abort("unknown enum 'BrilligInputs' variant index: " + std::to_string(value.index()));
5989 }
5990 if (is_unit) {
5991 packer.pack(tag);
5992 } else {
5993 std::visit(
5994 [&packer, tag](const auto& arg) {
5995 packer.pack_map(1);
5996 packer.pack(tag);
5997 packer.pack(arg);
5998 },
5999 value);
6000 }
6001 }
6002
6003 void msgpack_unpack(msgpack::object const& o)
6004 {
6005
6006 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
6007 std::cerr << o << std::endl;
6008 throw_or_abort("expected MAP or STR for enum 'BrilligInputs'; got type " + std::to_string(o.type));
6009 }
6010 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
6011 throw_or_abort("expected 1 entry for enum 'BrilligInputs'; got " + std::to_string(o.via.map.size));
6012 }
6014 // `Format::MsgpackTagged` — int-keyed variant.
6015 uint8_t tag;
6016 try {
6017 o.via.map.ptr[0].key.convert(tag);
6018 } catch (const msgpack::type_error&) {
6019 std::cerr << o << std::endl;
6020 throw_or_abort("expected u8 variant tag for enum 'BrilligInputs'");
6021 }
6022 switch (tag) {
6023 case 0: {
6024 Single v;
6025 try {
6026 o.via.map.ptr[0].val.convert(v);
6027 } catch (const msgpack::type_error&) {
6028 std::cerr << o << std::endl;
6029 throw_or_abort("error converting into enum variant 'BrilligInputs::Single'");
6030 }
6031 value = v;
6032 break;
6033 }
6034 case 1: {
6035 Array v;
6036 try {
6037 o.via.map.ptr[0].val.convert(v);
6038 } catch (const msgpack::type_error&) {
6039 std::cerr << o << std::endl;
6040 throw_or_abort("error converting into enum variant 'BrilligInputs::Array'");
6041 }
6042 value = v;
6043 break;
6044 }
6045 case 2: {
6046 MemoryArray v;
6047 try {
6048 o.via.map.ptr[0].val.convert(v);
6049 } catch (const msgpack::type_error&) {
6050 std::cerr << o << std::endl;
6051 throw_or_abort("error converting into enum variant 'BrilligInputs::MemoryArray'");
6052 }
6053 value = v;
6054 break;
6055 }
6056 default:
6057 std::cerr << o << std::endl;
6058 throw_or_abort("unknown 'BrilligInputs' enum variant tag: " + std::to_string(tag));
6059 }
6060 } else {
6061 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
6062 // unit variant (bare STR) — both dispatch on the variant name.
6063 std::string tag;
6064 try {
6065 if (o.type == msgpack::type::object_type::MAP) {
6066 o.via.map.ptr[0].key.convert(tag);
6067 } else {
6068 o.convert(tag);
6069 }
6070 } catch (const msgpack::type_error&) {
6071 std::cerr << o << std::endl;
6072 throw_or_abort("error converting tag to string for enum 'BrilligInputs'");
6073 }
6074 if (tag == "Single") {
6075 Single v;
6076 try {
6077 o.via.map.ptr[0].val.convert(v);
6078 } catch (const msgpack::type_error&) {
6079 std::cerr << o << std::endl;
6080 throw_or_abort("error converting into enum variant 'BrilligInputs::Single'");
6081 }
6082
6083 value = v;
6084 } else if (tag == "Array") {
6085 Array v;
6086 try {
6087 o.via.map.ptr[0].val.convert(v);
6088 } catch (const msgpack::type_error&) {
6089 std::cerr << o << std::endl;
6090 throw_or_abort("error converting into enum variant 'BrilligInputs::Array'");
6091 }
6092
6093 value = v;
6094 } else if (tag == "MemoryArray") {
6095 MemoryArray v;
6096 try {
6097 o.via.map.ptr[0].val.convert(v);
6098 } catch (const msgpack::type_error&) {
6099 std::cerr << o << std::endl;
6100 throw_or_abort("error converting into enum variant 'BrilligInputs::MemoryArray'");
6101 }
6102
6103 value = v;
6104 } else {
6105 std::cerr << o << std::endl;
6106 throw_or_abort("unknown 'BrilligInputs' enum variant: " + tag);
6107 }
6108 }
6109 }
6110};
6111
6113
6114 struct Simple {
6116
6117 friend bool operator==(const Simple&, const Simple&);
6118
6119 void msgpack_pack(auto& packer) const { packer.pack(value); }
6120
6121 void msgpack_unpack(msgpack::object const& o)
6122 {
6123 try {
6124 o.convert(value);
6125 } catch (const msgpack::type_error&) {
6126 std::cerr << o << std::endl;
6127 throw_or_abort("error converting into newtype 'Simple'");
6128 }
6129 }
6130 };
6131
6132 struct Array {
6133 std::vector<Acir::Witness> value;
6134
6135 friend bool operator==(const Array&, const Array&);
6136
6137 void msgpack_pack(auto& packer) const { packer.pack(value); }
6138
6139 void msgpack_unpack(msgpack::object const& o)
6140 {
6141 try {
6142 o.convert(value);
6143 } catch (const msgpack::type_error&) {
6144 std::cerr << o << std::endl;
6145 throw_or_abort("error converting into newtype 'Array'");
6146 }
6147 }
6148 };
6149
6151
6152 friend bool operator==(const BrilligOutputs&, const BrilligOutputs&);
6153
6154 void msgpack_pack(auto& packer) const
6155 {
6156 std::string tag;
6157 bool is_unit;
6158 switch (value.index()) {
6159
6160 case 0:
6161 tag = "Simple";
6162 is_unit = false;
6163 break;
6164 case 1:
6165 tag = "Array";
6166 is_unit = false;
6167 break;
6168 default:
6169 throw_or_abort("unknown enum 'BrilligOutputs' variant index: " + std::to_string(value.index()));
6170 }
6171 if (is_unit) {
6172 packer.pack(tag);
6173 } else {
6174 std::visit(
6175 [&packer, tag](const auto& arg) {
6176 packer.pack_map(1);
6177 packer.pack(tag);
6178 packer.pack(arg);
6179 },
6180 value);
6181 }
6182 }
6183
6184 void msgpack_unpack(msgpack::object const& o)
6185 {
6186
6187 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
6188 std::cerr << o << std::endl;
6189 throw_or_abort("expected MAP or STR for enum 'BrilligOutputs'; got type " + std::to_string(o.type));
6190 }
6191 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
6192 throw_or_abort("expected 1 entry for enum 'BrilligOutputs'; got " + std::to_string(o.via.map.size));
6193 }
6195 // `Format::MsgpackTagged` — int-keyed variant.
6196 uint8_t tag;
6197 try {
6198 o.via.map.ptr[0].key.convert(tag);
6199 } catch (const msgpack::type_error&) {
6200 std::cerr << o << std::endl;
6201 throw_or_abort("expected u8 variant tag for enum 'BrilligOutputs'");
6202 }
6203 switch (tag) {
6204 case 0: {
6205 Simple v;
6206 try {
6207 o.via.map.ptr[0].val.convert(v);
6208 } catch (const msgpack::type_error&) {
6209 std::cerr << o << std::endl;
6210 throw_or_abort("error converting into enum variant 'BrilligOutputs::Simple'");
6211 }
6212 value = v;
6213 break;
6214 }
6215 case 1: {
6216 Array v;
6217 try {
6218 o.via.map.ptr[0].val.convert(v);
6219 } catch (const msgpack::type_error&) {
6220 std::cerr << o << std::endl;
6221 throw_or_abort("error converting into enum variant 'BrilligOutputs::Array'");
6222 }
6223 value = v;
6224 break;
6225 }
6226 default:
6227 std::cerr << o << std::endl;
6228 throw_or_abort("unknown 'BrilligOutputs' enum variant tag: " + std::to_string(tag));
6229 }
6230 } else {
6231 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
6232 // unit variant (bare STR) — both dispatch on the variant name.
6233 std::string tag;
6234 try {
6235 if (o.type == msgpack::type::object_type::MAP) {
6236 o.via.map.ptr[0].key.convert(tag);
6237 } else {
6238 o.convert(tag);
6239 }
6240 } catch (const msgpack::type_error&) {
6241 std::cerr << o << std::endl;
6242 throw_or_abort("error converting tag to string for enum 'BrilligOutputs'");
6243 }
6244 if (tag == "Simple") {
6245 Simple v;
6246 try {
6247 o.via.map.ptr[0].val.convert(v);
6248 } catch (const msgpack::type_error&) {
6249 std::cerr << o << std::endl;
6250 throw_or_abort("error converting into enum variant 'BrilligOutputs::Simple'");
6251 }
6252
6253 value = v;
6254 } else if (tag == "Array") {
6255 Array v;
6256 try {
6257 o.via.map.ptr[0].val.convert(v);
6258 } catch (const msgpack::type_error&) {
6259 std::cerr << o << std::endl;
6260 throw_or_abort("error converting into enum variant 'BrilligOutputs::Array'");
6261 }
6262
6263 value = v;
6264 } else {
6265 std::cerr << o << std::endl;
6266 throw_or_abort("unknown 'BrilligOutputs' enum variant: " + tag);
6267 }
6268 }
6269 }
6270};
6271
6272struct MemOp {
6273 bool read;
6276
6277 friend bool operator==(const MemOp&, const MemOp&);
6278
6279 void msgpack_pack(auto& packer) const
6280 {
6281 packer.pack_array(3);
6282 packer.pack(read);
6283 packer.pack(index);
6284 packer.pack(value);
6285 }
6286
6287 void msgpack_unpack(msgpack::object const& o)
6288 {
6289 std::string name = "MemOp";
6290 if (o.type == msgpack::type::MAP) {
6292 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
6293 switch (tag) {
6294 case 0:
6295 Helpers::convert_or_throw(val, name, "read", read);
6296 break;
6297 case 1:
6298 Helpers::convert_or_throw(val, name, "index", index);
6299 break;
6300 case 2:
6301 Helpers::convert_or_throw(val, name, "value", value);
6302 break;
6303 default:
6304 std::cerr << val << std::endl;
6305 throw_or_abort("unknown tag for MemOp: " + std::to_string(tag));
6306 }
6307 });
6308 } else {
6309 Helpers::check_size(o.via.map.size, name, 3, 0);
6310 auto kvmap = Helpers::make_kvmap(o, name);
6311 Helpers::conv_fld_from_kvmap(kvmap, name, "read", read, false);
6312 Helpers::conv_fld_from_kvmap(kvmap, name, "index", index, false);
6313 Helpers::conv_fld_from_kvmap(kvmap, name, "value", value, false);
6314 }
6315 } else if (o.type == msgpack::type::ARRAY) {
6316 auto array = o.via.array;
6317 Helpers::check_size(array.size, name, 3, 0);
6318 Helpers::conv_fld_from_array(array, name, "read", read, 0);
6319 Helpers::conv_fld_from_array(array, name, "index", index, 1);
6320 Helpers::conv_fld_from_array(array, name, "value", value, 2);
6321 } else {
6322 throw_or_abort("expected MAP or ARRAY for " + name);
6323 }
6324 }
6325};
6326
6327struct Opcode {
6328
6329 struct AssertZero {
6331
6332 friend bool operator==(const AssertZero&, const AssertZero&);
6333
6334 void msgpack_pack(auto& packer) const { packer.pack(value); }
6335
6336 void msgpack_unpack(msgpack::object const& o)
6337 {
6338 try {
6339 o.convert(value);
6340 } catch (const msgpack::type_error&) {
6341 std::cerr << o << std::endl;
6342 throw_or_abort("error converting into newtype 'AssertZero'");
6343 }
6344 }
6345 };
6346
6349
6350 friend bool operator==(const BlackBoxFuncCall&, const BlackBoxFuncCall&);
6351
6352 void msgpack_pack(auto& packer) const { packer.pack(value); }
6353
6354 void msgpack_unpack(msgpack::object const& o)
6355 {
6356 try {
6357 o.convert(value);
6358 } catch (const msgpack::type_error&) {
6359 std::cerr << o << std::endl;
6360 throw_or_abort("error converting into newtype 'BlackBoxFuncCall'");
6361 }
6362 }
6363 };
6364
6365 struct MemoryOp {
6368
6369 friend bool operator==(const MemoryOp&, const MemoryOp&);
6370
6371 void msgpack_pack(auto& packer) const
6372 {
6373 packer.pack_array(2);
6374 packer.pack(block_id);
6375 packer.pack(op);
6376 }
6377
6378 void msgpack_unpack(msgpack::object const& o)
6379 {
6380 std::string name = "MemoryOp";
6381 if (o.type == msgpack::type::MAP) {
6383 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
6384 switch (tag) {
6385 case 0:
6386 Helpers::convert_or_throw(val, name, "block_id", block_id);
6387 break;
6388 case 1:
6389 Helpers::convert_or_throw(val, name, "op", op);
6390 break;
6391 default:
6392 std::cerr << val << std::endl;
6393 throw_or_abort("unknown tag for MemoryOp: " + std::to_string(tag));
6394 }
6395 });
6396 } else {
6397 Helpers::check_size(o.via.map.size, name, 2, 0);
6398 auto kvmap = Helpers::make_kvmap(o, name);
6399 Helpers::conv_fld_from_kvmap(kvmap, name, "block_id", block_id, false);
6400 Helpers::conv_fld_from_kvmap(kvmap, name, "op", op, false);
6401 }
6402 } else if (o.type == msgpack::type::ARRAY) {
6403 auto array = o.via.array;
6404 Helpers::check_size(array.size, name, 2, 0);
6405 Helpers::conv_fld_from_array(array, name, "block_id", block_id, 0);
6406 Helpers::conv_fld_from_array(array, name, "op", op, 1);
6407 } else {
6408 throw_or_abort("expected MAP or ARRAY for " + name);
6409 }
6410 }
6411 };
6412
6413 struct MemoryInit {
6415 std::vector<Acir::Witness> init;
6417
6418 friend bool operator==(const MemoryInit&, const MemoryInit&);
6419
6420 void msgpack_pack(auto& packer) const
6421 {
6422 packer.pack_array(3);
6423 packer.pack(block_id);
6424 packer.pack(init);
6425 packer.pack(block_type);
6426 }
6427
6428 void msgpack_unpack(msgpack::object const& o)
6429 {
6430 std::string name = "MemoryInit";
6431 if (o.type == msgpack::type::MAP) {
6433 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
6434 switch (tag) {
6435 case 0:
6436 Helpers::convert_or_throw(val, name, "block_id", block_id);
6437 break;
6438 case 1:
6439 Helpers::convert_or_throw(val, name, "init", init);
6440 break;
6441 case 2:
6442 Helpers::convert_or_throw(val, name, "block_type", block_type);
6443 break;
6444 default:
6445 std::cerr << val << std::endl;
6446 throw_or_abort("unknown tag for MemoryInit: " + std::to_string(tag));
6447 }
6448 });
6449 } else {
6450 Helpers::check_size(o.via.map.size, name, 3, 0);
6451 auto kvmap = Helpers::make_kvmap(o, name);
6452 Helpers::conv_fld_from_kvmap(kvmap, name, "block_id", block_id, false);
6453 Helpers::conv_fld_from_kvmap(kvmap, name, "init", init, false);
6454 Helpers::conv_fld_from_kvmap(kvmap, name, "block_type", block_type, false);
6455 }
6456 } else if (o.type == msgpack::type::ARRAY) {
6457 auto array = o.via.array;
6458 Helpers::check_size(array.size, name, 3, 0);
6459 Helpers::conv_fld_from_array(array, name, "block_id", block_id, 0);
6460 Helpers::conv_fld_from_array(array, name, "init", init, 1);
6461 Helpers::conv_fld_from_array(array, name, "block_type", block_type, 2);
6462 } else {
6463 throw_or_abort("expected MAP or ARRAY for " + name);
6464 }
6465 }
6466 };
6467
6469 uint32_t id;
6470 std::vector<Acir::BrilligInputs> inputs;
6471 std::vector<Acir::BrilligOutputs> outputs;
6473
6474 friend bool operator==(const BrilligCall&, const BrilligCall&);
6475
6476 void msgpack_pack(auto& packer) const
6477 {
6478 packer.pack_array(4);
6479 packer.pack(id);
6480 packer.pack(inputs);
6481 packer.pack(outputs);
6482 packer.pack(predicate);
6483 }
6484
6485 void msgpack_unpack(msgpack::object const& o)
6486 {
6487 std::string name = "BrilligCall";
6488 if (o.type == msgpack::type::MAP) {
6490 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
6491 switch (tag) {
6492 case 0:
6493 Helpers::convert_or_throw(val, name, "id", id);
6494 break;
6495 case 1:
6496 Helpers::convert_or_throw(val, name, "inputs", inputs);
6497 break;
6498 case 2:
6499 Helpers::convert_or_throw(val, name, "outputs", outputs);
6500 break;
6501 case 3:
6502 Helpers::convert_or_throw(val, name, "predicate", predicate);
6503 break;
6504 default:
6505 std::cerr << val << std::endl;
6506 throw_or_abort("unknown tag for BrilligCall: " + std::to_string(tag));
6507 }
6508 });
6509 } else {
6510 Helpers::check_size(o.via.map.size, name, 4, 0);
6511 auto kvmap = Helpers::make_kvmap(o, name);
6512 Helpers::conv_fld_from_kvmap(kvmap, name, "id", id, false);
6513 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
6514 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
6515 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
6516 }
6517 } else if (o.type == msgpack::type::ARRAY) {
6518 auto array = o.via.array;
6519 Helpers::check_size(array.size, name, 4, 0);
6520 Helpers::conv_fld_from_array(array, name, "id", id, 0);
6521 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 1);
6522 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
6523 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 3);
6524 } else {
6525 throw_or_abort("expected MAP or ARRAY for " + name);
6526 }
6527 }
6528 };
6529
6530 struct Call {
6531 uint32_t id;
6532 std::vector<Acir::Witness> inputs;
6533 std::vector<Acir::Witness> outputs;
6535
6536 friend bool operator==(const Call&, const Call&);
6537
6538 void msgpack_pack(auto& packer) const
6539 {
6540 packer.pack_array(4);
6541 packer.pack(id);
6542 packer.pack(inputs);
6543 packer.pack(outputs);
6544 packer.pack(predicate);
6545 }
6546
6547 void msgpack_unpack(msgpack::object const& o)
6548 {
6549 std::string name = "Call";
6550 if (o.type == msgpack::type::MAP) {
6552 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
6553 switch (tag) {
6554 case 0:
6555 Helpers::convert_or_throw(val, name, "id", id);
6556 break;
6557 case 1:
6558 Helpers::convert_or_throw(val, name, "inputs", inputs);
6559 break;
6560 case 2:
6561 Helpers::convert_or_throw(val, name, "outputs", outputs);
6562 break;
6563 case 3:
6564 Helpers::convert_or_throw(val, name, "predicate", predicate);
6565 break;
6566 default:
6567 std::cerr << val << std::endl;
6568 throw_or_abort("unknown tag for Call: " + std::to_string(tag));
6569 }
6570 });
6571 } else {
6572 Helpers::check_size(o.via.map.size, name, 4, 0);
6573 auto kvmap = Helpers::make_kvmap(o, name);
6574 Helpers::conv_fld_from_kvmap(kvmap, name, "id", id, false);
6575 Helpers::conv_fld_from_kvmap(kvmap, name, "inputs", inputs, false);
6576 Helpers::conv_fld_from_kvmap(kvmap, name, "outputs", outputs, false);
6577 Helpers::conv_fld_from_kvmap(kvmap, name, "predicate", predicate, false);
6578 }
6579 } else if (o.type == msgpack::type::ARRAY) {
6580 auto array = o.via.array;
6581 Helpers::check_size(array.size, name, 4, 0);
6582 Helpers::conv_fld_from_array(array, name, "id", id, 0);
6583 Helpers::conv_fld_from_array(array, name, "inputs", inputs, 1);
6584 Helpers::conv_fld_from_array(array, name, "outputs", outputs, 2);
6585 Helpers::conv_fld_from_array(array, name, "predicate", predicate, 3);
6586 } else {
6587 throw_or_abort("expected MAP or ARRAY for " + name);
6588 }
6589 }
6590 };
6591
6593
6594 friend bool operator==(const Opcode&, const Opcode&);
6595
6596 void msgpack_pack(auto& packer) const
6597 {
6598 std::string tag;
6599 bool is_unit;
6600 switch (value.index()) {
6601
6602 case 0:
6603 tag = "AssertZero";
6604 is_unit = false;
6605 break;
6606 case 1:
6607 tag = "BlackBoxFuncCall";
6608 is_unit = false;
6609 break;
6610 case 2:
6611 tag = "MemoryOp";
6612 is_unit = false;
6613 break;
6614 case 3:
6615 tag = "MemoryInit";
6616 is_unit = false;
6617 break;
6618 case 4:
6619 tag = "BrilligCall";
6620 is_unit = false;
6621 break;
6622 case 5:
6623 tag = "Call";
6624 is_unit = false;
6625 break;
6626 default:
6627 throw_or_abort("unknown enum 'Opcode' variant index: " + std::to_string(value.index()));
6628 }
6629 if (is_unit) {
6630 packer.pack(tag);
6631 } else {
6632 std::visit(
6633 [&packer, tag](const auto& arg) {
6634 packer.pack_map(1);
6635 packer.pack(tag);
6636 packer.pack(arg);
6637 },
6638 value);
6639 }
6640 }
6641
6642 void msgpack_unpack(msgpack::object const& o)
6643 {
6644
6645 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
6646 std::cerr << o << std::endl;
6647 throw_or_abort("expected MAP or STR for enum 'Opcode'; got type " + std::to_string(o.type));
6648 }
6649 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
6650 throw_or_abort("expected 1 entry for enum 'Opcode'; got " + std::to_string(o.via.map.size));
6651 }
6653 // `Format::MsgpackTagged` — int-keyed variant.
6654 uint8_t tag;
6655 try {
6656 o.via.map.ptr[0].key.convert(tag);
6657 } catch (const msgpack::type_error&) {
6658 std::cerr << o << std::endl;
6659 throw_or_abort("expected u8 variant tag for enum 'Opcode'");
6660 }
6661 switch (tag) {
6662 case 0: {
6663 AssertZero v;
6664 try {
6665 o.via.map.ptr[0].val.convert(v);
6666 } catch (const msgpack::type_error&) {
6667 std::cerr << o << std::endl;
6668 throw_or_abort("error converting into enum variant 'Opcode::AssertZero'");
6669 }
6670 value = v;
6671 break;
6672 }
6673 case 1: {
6675 try {
6676 o.via.map.ptr[0].val.convert(v);
6677 } catch (const msgpack::type_error&) {
6678 std::cerr << o << std::endl;
6679 throw_or_abort("error converting into enum variant 'Opcode::BlackBoxFuncCall'");
6680 }
6681 value = v;
6682 break;
6683 }
6684 case 2: {
6685 MemoryOp v;
6686 try {
6687 o.via.map.ptr[0].val.convert(v);
6688 } catch (const msgpack::type_error&) {
6689 std::cerr << o << std::endl;
6690 throw_or_abort("error converting into enum variant 'Opcode::MemoryOp'");
6691 }
6692 value = v;
6693 break;
6694 }
6695 case 3: {
6696 MemoryInit v;
6697 try {
6698 o.via.map.ptr[0].val.convert(v);
6699 } catch (const msgpack::type_error&) {
6700 std::cerr << o << std::endl;
6701 throw_or_abort("error converting into enum variant 'Opcode::MemoryInit'");
6702 }
6703 value = v;
6704 break;
6705 }
6706 case 4: {
6707 BrilligCall v;
6708 try {
6709 o.via.map.ptr[0].val.convert(v);
6710 } catch (const msgpack::type_error&) {
6711 std::cerr << o << std::endl;
6712 throw_or_abort("error converting into enum variant 'Opcode::BrilligCall'");
6713 }
6714 value = v;
6715 break;
6716 }
6717 case 5: {
6718 Call v;
6719 try {
6720 o.via.map.ptr[0].val.convert(v);
6721 } catch (const msgpack::type_error&) {
6722 std::cerr << o << std::endl;
6723 throw_or_abort("error converting into enum variant 'Opcode::Call'");
6724 }
6725 value = v;
6726 break;
6727 }
6728 default:
6729 std::cerr << o << std::endl;
6730 throw_or_abort("unknown 'Opcode' enum variant tag: " + std::to_string(tag));
6731 }
6732 } else {
6733 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
6734 // unit variant (bare STR) — both dispatch on the variant name.
6735 std::string tag;
6736 try {
6737 if (o.type == msgpack::type::object_type::MAP) {
6738 o.via.map.ptr[0].key.convert(tag);
6739 } else {
6740 o.convert(tag);
6741 }
6742 } catch (const msgpack::type_error&) {
6743 std::cerr << o << std::endl;
6744 throw_or_abort("error converting tag to string for enum 'Opcode'");
6745 }
6746 if (tag == "AssertZero") {
6747 AssertZero v;
6748 try {
6749 o.via.map.ptr[0].val.convert(v);
6750 } catch (const msgpack::type_error&) {
6751 std::cerr << o << std::endl;
6752 throw_or_abort("error converting into enum variant 'Opcode::AssertZero'");
6753 }
6754
6755 value = v;
6756 } else if (tag == "BlackBoxFuncCall") {
6758 try {
6759 o.via.map.ptr[0].val.convert(v);
6760 } catch (const msgpack::type_error&) {
6761 std::cerr << o << std::endl;
6762 throw_or_abort("error converting into enum variant 'Opcode::BlackBoxFuncCall'");
6763 }
6764
6765 value = v;
6766 } else if (tag == "MemoryOp") {
6767 MemoryOp v;
6768 try {
6769 o.via.map.ptr[0].val.convert(v);
6770 } catch (const msgpack::type_error&) {
6771 std::cerr << o << std::endl;
6772 throw_or_abort("error converting into enum variant 'Opcode::MemoryOp'");
6773 }
6774
6775 value = v;
6776 } else if (tag == "MemoryInit") {
6777 MemoryInit v;
6778 try {
6779 o.via.map.ptr[0].val.convert(v);
6780 } catch (const msgpack::type_error&) {
6781 std::cerr << o << std::endl;
6782 throw_or_abort("error converting into enum variant 'Opcode::MemoryInit'");
6783 }
6784
6785 value = v;
6786 } else if (tag == "BrilligCall") {
6787 BrilligCall v;
6788 try {
6789 o.via.map.ptr[0].val.convert(v);
6790 } catch (const msgpack::type_error&) {
6791 std::cerr << o << std::endl;
6792 throw_or_abort("error converting into enum variant 'Opcode::BrilligCall'");
6793 }
6794
6795 value = v;
6796 } else if (tag == "Call") {
6797 Call v;
6798 try {
6799 o.via.map.ptr[0].val.convert(v);
6800 } catch (const msgpack::type_error&) {
6801 std::cerr << o << std::endl;
6802 throw_or_abort("error converting into enum variant 'Opcode::Call'");
6803 }
6804
6805 value = v;
6806 } else {
6807 std::cerr << o << std::endl;
6808 throw_or_abort("unknown 'Opcode' enum variant: " + tag);
6809 }
6810 }
6811 }
6812};
6813
6815
6816 struct Expression {
6818
6819 friend bool operator==(const Expression&, const Expression&);
6820
6821 void msgpack_pack(auto& packer) const { packer.pack(value); }
6822
6823 void msgpack_unpack(msgpack::object const& o)
6824 {
6825 try {
6826 o.convert(value);
6827 } catch (const msgpack::type_error&) {
6828 std::cerr << o << std::endl;
6829 throw_or_abort("error converting into newtype 'Expression'");
6830 }
6831 }
6832 };
6833
6834 struct Memory {
6836
6837 friend bool operator==(const Memory&, const Memory&);
6838
6839 void msgpack_pack(auto& packer) const { packer.pack(value); }
6840
6841 void msgpack_unpack(msgpack::object const& o)
6842 {
6843 try {
6844 o.convert(value);
6845 } catch (const msgpack::type_error&) {
6846 std::cerr << o << std::endl;
6847 throw_or_abort("error converting into newtype 'Memory'");
6848 }
6849 }
6850 };
6851
6853
6854 friend bool operator==(const ExpressionOrMemory&, const ExpressionOrMemory&);
6855
6856 void msgpack_pack(auto& packer) const
6857 {
6858 std::string tag;
6859 bool is_unit;
6860 switch (value.index()) {
6861
6862 case 0:
6863 tag = "Expression";
6864 is_unit = false;
6865 break;
6866 case 1:
6867 tag = "Memory";
6868 is_unit = false;
6869 break;
6870 default:
6871 throw_or_abort("unknown enum 'ExpressionOrMemory' variant index: " + std::to_string(value.index()));
6872 }
6873 if (is_unit) {
6874 packer.pack(tag);
6875 } else {
6876 std::visit(
6877 [&packer, tag](const auto& arg) {
6878 packer.pack_map(1);
6879 packer.pack(tag);
6880 packer.pack(arg);
6881 },
6882 value);
6883 }
6884 }
6885
6886 void msgpack_unpack(msgpack::object const& o)
6887 {
6888
6889 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
6890 std::cerr << o << std::endl;
6891 throw_or_abort("expected MAP or STR for enum 'ExpressionOrMemory'; got type " + std::to_string(o.type));
6892 }
6893 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
6894 throw_or_abort("expected 1 entry for enum 'ExpressionOrMemory'; got " + std::to_string(o.via.map.size));
6895 }
6897 // `Format::MsgpackTagged` — int-keyed variant.
6898 uint8_t tag;
6899 try {
6900 o.via.map.ptr[0].key.convert(tag);
6901 } catch (const msgpack::type_error&) {
6902 std::cerr << o << std::endl;
6903 throw_or_abort("expected u8 variant tag for enum 'ExpressionOrMemory'");
6904 }
6905 switch (tag) {
6906 case 0: {
6907 Expression v;
6908 try {
6909 o.via.map.ptr[0].val.convert(v);
6910 } catch (const msgpack::type_error&) {
6911 std::cerr << o << std::endl;
6912 throw_or_abort("error converting into enum variant 'ExpressionOrMemory::Expression'");
6913 }
6914 value = v;
6915 break;
6916 }
6917 case 1: {
6918 Memory v;
6919 try {
6920 o.via.map.ptr[0].val.convert(v);
6921 } catch (const msgpack::type_error&) {
6922 std::cerr << o << std::endl;
6923 throw_or_abort("error converting into enum variant 'ExpressionOrMemory::Memory'");
6924 }
6925 value = v;
6926 break;
6927 }
6928 default:
6929 std::cerr << o << std::endl;
6930 throw_or_abort("unknown 'ExpressionOrMemory' enum variant tag: " + std::to_string(tag));
6931 }
6932 } else {
6933 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
6934 // unit variant (bare STR) — both dispatch on the variant name.
6935 std::string tag;
6936 try {
6937 if (o.type == msgpack::type::object_type::MAP) {
6938 o.via.map.ptr[0].key.convert(tag);
6939 } else {
6940 o.convert(tag);
6941 }
6942 } catch (const msgpack::type_error&) {
6943 std::cerr << o << std::endl;
6944 throw_or_abort("error converting tag to string for enum 'ExpressionOrMemory'");
6945 }
6946 if (tag == "Expression") {
6947 Expression v;
6948 try {
6949 o.via.map.ptr[0].val.convert(v);
6950 } catch (const msgpack::type_error&) {
6951 std::cerr << o << std::endl;
6952 throw_or_abort("error converting into enum variant 'ExpressionOrMemory::Expression'");
6953 }
6954
6955 value = v;
6956 } else if (tag == "Memory") {
6957 Memory v;
6958 try {
6959 o.via.map.ptr[0].val.convert(v);
6960 } catch (const msgpack::type_error&) {
6961 std::cerr << o << std::endl;
6962 throw_or_abort("error converting into enum variant 'ExpressionOrMemory::Memory'");
6963 }
6964
6965 value = v;
6966 } else {
6967 std::cerr << o << std::endl;
6968 throw_or_abort("unknown 'ExpressionOrMemory' enum variant: " + tag);
6969 }
6970 }
6971 }
6972};
6973
6976 std::vector<Acir::ExpressionOrMemory> payload;
6977
6978 friend bool operator==(const AssertionPayload&, const AssertionPayload&);
6979
6980 void msgpack_pack(auto& packer) const
6981 {
6982 packer.pack_array(2);
6983 packer.pack(error_selector);
6984 packer.pack(payload);
6985 }
6986
6987 void msgpack_unpack(msgpack::object const& o)
6988 {
6989 std::string name = "AssertionPayload";
6990 if (o.type == msgpack::type::MAP) {
6992 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
6993 switch (tag) {
6994 case 0:
6995 Helpers::convert_or_throw(val, name, "error_selector", error_selector);
6996 break;
6997 case 1:
6998 Helpers::convert_or_throw(val, name, "payload", payload);
6999 break;
7000 default:
7001 std::cerr << val << std::endl;
7002 throw_or_abort("unknown tag for AssertionPayload: " + std::to_string(tag));
7003 }
7004 });
7005 } else {
7006 Helpers::check_size(o.via.map.size, name, 2, 0);
7007 auto kvmap = Helpers::make_kvmap(o, name);
7008 Helpers::conv_fld_from_kvmap(kvmap, name, "error_selector", error_selector, false);
7009 Helpers::conv_fld_from_kvmap(kvmap, name, "payload", payload, false);
7010 }
7011 } else if (o.type == msgpack::type::ARRAY) {
7012 auto array = o.via.array;
7013 Helpers::check_size(array.size, name, 2, 0);
7014 Helpers::conv_fld_from_array(array, name, "error_selector", error_selector, 0);
7015 Helpers::conv_fld_from_array(array, name, "payload", payload, 1);
7016 } else {
7017 throw_or_abort("expected MAP or ARRAY for " + name);
7018 }
7019 }
7020};
7021
7023
7024 struct Acir {
7025 uint64_t value;
7026
7027 friend bool operator==(const Acir&, const Acir&);
7028
7029 void msgpack_pack(auto& packer) const { packer.pack(value); }
7030
7031 void msgpack_unpack(msgpack::object const& o)
7032 {
7033 try {
7034 o.convert(value);
7035 } catch (const msgpack::type_error&) {
7036 std::cerr << o << std::endl;
7037 throw_or_abort("error converting into newtype 'Acir'");
7038 }
7039 }
7040 };
7041
7042 struct Brillig {
7043 uint64_t acir_index;
7045
7046 friend bool operator==(const Brillig&, const Brillig&);
7047
7048 void msgpack_pack(auto& packer) const
7049 {
7050 packer.pack_array(2);
7051 packer.pack(acir_index);
7052 packer.pack(brillig_index);
7053 }
7054
7055 void msgpack_unpack(msgpack::object const& o)
7056 {
7057 std::string name = "Brillig";
7058 if (o.type == msgpack::type::MAP) {
7060 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
7061 switch (tag) {
7062 case 0:
7063 Helpers::convert_or_throw(val, name, "acir_index", acir_index);
7064 break;
7065 case 1:
7066 Helpers::convert_or_throw(val, name, "brillig_index", brillig_index);
7067 break;
7068 default:
7069 std::cerr << val << std::endl;
7070 throw_or_abort("unknown tag for Brillig: " + std::to_string(tag));
7071 }
7072 });
7073 } else {
7074 Helpers::check_size(o.via.map.size, name, 2, 0);
7075 auto kvmap = Helpers::make_kvmap(o, name);
7076 Helpers::conv_fld_from_kvmap(kvmap, name, "acir_index", acir_index, false);
7077 Helpers::conv_fld_from_kvmap(kvmap, name, "brillig_index", brillig_index, false);
7078 }
7079 } else if (o.type == msgpack::type::ARRAY) {
7080 auto array = o.via.array;
7081 Helpers::check_size(array.size, name, 2, 0);
7082 Helpers::conv_fld_from_array(array, name, "acir_index", acir_index, 0);
7083 Helpers::conv_fld_from_array(array, name, "brillig_index", brillig_index, 1);
7084 } else {
7085 throw_or_abort("expected MAP or ARRAY for " + name);
7086 }
7087 }
7088 };
7089
7091
7092 friend bool operator==(const OpcodeLocation&, const OpcodeLocation&);
7093
7094 void msgpack_pack(auto& packer) const
7095 {
7096 std::string tag;
7097 bool is_unit;
7098 switch (value.index()) {
7099
7100 case 0:
7101 tag = "Acir";
7102 is_unit = false;
7103 break;
7104 case 1:
7105 tag = "Brillig";
7106 is_unit = false;
7107 break;
7108 default:
7109 throw_or_abort("unknown enum 'OpcodeLocation' variant index: " + std::to_string(value.index()));
7110 }
7111 if (is_unit) {
7112 packer.pack(tag);
7113 } else {
7114 std::visit(
7115 [&packer, tag](const auto& arg) {
7116 packer.pack_map(1);
7117 packer.pack(tag);
7118 packer.pack(arg);
7119 },
7120 value);
7121 }
7122 }
7123
7124 void msgpack_unpack(msgpack::object const& o)
7125 {
7126
7127 if (o.type != msgpack::type::object_type::MAP && o.type != msgpack::type::object_type::STR) {
7128 std::cerr << o << std::endl;
7129 throw_or_abort("expected MAP or STR for enum 'OpcodeLocation'; got type " + std::to_string(o.type));
7130 }
7131 if (o.type == msgpack::type::object_type::MAP && o.via.map.size != 1) {
7132 throw_or_abort("expected 1 entry for enum 'OpcodeLocation'; got " + std::to_string(o.via.map.size));
7133 }
7135 // `Format::MsgpackTagged` — int-keyed variant.
7136 uint8_t tag;
7137 try {
7138 o.via.map.ptr[0].key.convert(tag);
7139 } catch (const msgpack::type_error&) {
7140 std::cerr << o << std::endl;
7141 throw_or_abort("expected u8 variant tag for enum 'OpcodeLocation'");
7142 }
7143 switch (tag) {
7144 case 0: {
7145 Acir v;
7146 try {
7147 o.via.map.ptr[0].val.convert(v);
7148 } catch (const msgpack::type_error&) {
7149 std::cerr << o << std::endl;
7150 throw_or_abort("error converting into enum variant 'OpcodeLocation::Acir'");
7151 }
7152 value = v;
7153 break;
7154 }
7155 case 1: {
7156 Brillig v;
7157 try {
7158 o.via.map.ptr[0].val.convert(v);
7159 } catch (const msgpack::type_error&) {
7160 std::cerr << o << std::endl;
7161 throw_or_abort("error converting into enum variant 'OpcodeLocation::Brillig'");
7162 }
7163 value = v;
7164 break;
7165 }
7166 default:
7167 std::cerr << o << std::endl;
7168 throw_or_abort("unknown 'OpcodeLocation' enum variant tag: " + std::to_string(tag));
7169 }
7170 } else {
7171 // `Format::Msgpack` (MAP, string-keyed) or `Format::MsgpackCompact`
7172 // unit variant (bare STR) — both dispatch on the variant name.
7173 std::string tag;
7174 try {
7175 if (o.type == msgpack::type::object_type::MAP) {
7176 o.via.map.ptr[0].key.convert(tag);
7177 } else {
7178 o.convert(tag);
7179 }
7180 } catch (const msgpack::type_error&) {
7181 std::cerr << o << std::endl;
7182 throw_or_abort("error converting tag to string for enum 'OpcodeLocation'");
7183 }
7184 if (tag == "Acir") {
7185 Acir v;
7186 try {
7187 o.via.map.ptr[0].val.convert(v);
7188 } catch (const msgpack::type_error&) {
7189 std::cerr << o << std::endl;
7190 throw_or_abort("error converting into enum variant 'OpcodeLocation::Acir'");
7191 }
7192
7193 value = v;
7194 } else if (tag == "Brillig") {
7195 Brillig v;
7196 try {
7197 o.via.map.ptr[0].val.convert(v);
7198 } catch (const msgpack::type_error&) {
7199 std::cerr << o << std::endl;
7200 throw_or_abort("error converting into enum variant 'OpcodeLocation::Brillig'");
7201 }
7202
7203 value = v;
7204 } else {
7205 std::cerr << o << std::endl;
7206 throw_or_abort("unknown 'OpcodeLocation' enum variant: " + tag);
7207 }
7208 }
7209 }
7210};
7211
7213 std::vector<Acir::Witness> value;
7214
7215 friend bool operator==(const PublicInputs&, const PublicInputs&);
7216
7217 void msgpack_pack(auto& packer) const { packer.pack(value); }
7218
7219 void msgpack_unpack(msgpack::object const& o)
7220 {
7221 try {
7222 o.convert(value);
7223 } catch (const msgpack::type_error&) {
7224 std::cerr << o << std::endl;
7225 throw_or_abort("error converting into newtype 'PublicInputs'");
7226 }
7227 }
7228};
7229
7230struct Circuit {
7231 std::string function_name;
7232 std::vector<Acir::Opcode> opcodes;
7233 std::vector<Acir::Witness> private_parameters;
7237
7238 friend bool operator==(const Circuit&, const Circuit&);
7239
7240 void msgpack_pack(auto& packer) const
7241 {
7242 packer.pack_array(6);
7243 packer.pack(function_name);
7244 packer.pack(opcodes);
7245 packer.pack(private_parameters);
7246 packer.pack(public_parameters);
7247 packer.pack(return_values);
7248 packer.pack(assert_messages);
7249 }
7250
7251 void msgpack_unpack(msgpack::object const& o)
7252 {
7253 std::string name = "Circuit";
7254 if (o.type == msgpack::type::MAP) {
7256 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
7257 switch (tag) {
7258 case 0:
7259 Helpers::convert_or_throw(val, name, "function_name", function_name);
7260 break;
7261 case 1:
7262 Helpers::convert_or_throw(val, name, "opcodes", opcodes);
7263 break;
7264 case 2:
7265 Helpers::convert_or_throw(val, name, "private_parameters", private_parameters);
7266 break;
7267 case 3:
7268 Helpers::convert_or_throw(val, name, "public_parameters", public_parameters);
7269 break;
7270 case 4:
7271 Helpers::convert_or_throw(val, name, "return_values", return_values);
7272 break;
7273 case 5:
7274 Helpers::convert_or_throw(val, name, "assert_messages", assert_messages);
7275 break;
7276 default:
7277 // `#[tagged(allow_unknown_tags)]` on the Rust side:
7278 // silently skip any tag we don't recognize.
7279 break;
7280 }
7281 });
7282 } else {
7283 auto kvmap = Helpers::make_kvmap(o, name);
7284 Helpers::conv_fld_from_kvmap(kvmap, name, "function_name", function_name, false);
7285 Helpers::conv_fld_from_kvmap(kvmap, name, "opcodes", opcodes, false);
7286 Helpers::conv_fld_from_kvmap(kvmap, name, "private_parameters", private_parameters, false);
7287 Helpers::conv_fld_from_kvmap(kvmap, name, "public_parameters", public_parameters, false);
7288 Helpers::conv_fld_from_kvmap(kvmap, name, "return_values", return_values, false);
7289 Helpers::conv_fld_from_kvmap(kvmap, name, "assert_messages", assert_messages, false);
7290 }
7291 } else if (o.type == msgpack::type::ARRAY) {
7292 auto array = o.via.array;
7293 Helpers::conv_fld_from_array(array, name, "function_name", function_name, 0);
7294 Helpers::conv_fld_from_array(array, name, "opcodes", opcodes, 1);
7295 Helpers::conv_fld_from_array(array, name, "private_parameters", private_parameters, 2);
7296 Helpers::conv_fld_from_array(array, name, "public_parameters", public_parameters, 3);
7297 Helpers::conv_fld_from_array(array, name, "return_values", return_values, 4);
7298 Helpers::conv_fld_from_array(array, name, "assert_messages", assert_messages, 5);
7299 } else {
7300 throw_or_abort("expected MAP or ARRAY for " + name);
7301 }
7302 }
7303};
7304
7306 std::string function_name;
7307 std::vector<Acir::BrilligOpcode> bytecode;
7308
7309 friend bool operator==(const BrilligBytecode&, const BrilligBytecode&);
7310
7311 void msgpack_pack(auto& packer) const
7312 {
7313 packer.pack_array(2);
7314 packer.pack(function_name);
7315 packer.pack(bytecode);
7316 }
7317
7318 void msgpack_unpack(msgpack::object const& o)
7319 {
7320 std::string name = "BrilligBytecode";
7321 if (o.type == msgpack::type::MAP) {
7323 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
7324 switch (tag) {
7325 case 0:
7326 Helpers::convert_or_throw(val, name, "function_name", function_name);
7327 break;
7328 case 1:
7329 Helpers::convert_or_throw(val, name, "bytecode", bytecode);
7330 break;
7331 default:
7332 // `#[tagged(allow_unknown_tags)]` on the Rust side:
7333 // silently skip any tag we don't recognize.
7334 break;
7335 }
7336 });
7337 } else {
7338 auto kvmap = Helpers::make_kvmap(o, name);
7339 Helpers::conv_fld_from_kvmap(kvmap, name, "function_name", function_name, false);
7340 Helpers::conv_fld_from_kvmap(kvmap, name, "bytecode", bytecode, false);
7341 }
7342 } else if (o.type == msgpack::type::ARRAY) {
7343 auto array = o.via.array;
7344 Helpers::conv_fld_from_array(array, name, "function_name", function_name, 0);
7345 Helpers::conv_fld_from_array(array, name, "bytecode", bytecode, 1);
7346 } else {
7347 throw_or_abort("expected MAP or ARRAY for " + name);
7348 }
7349 }
7350};
7351
7352struct Program {
7353 std::vector<Acir::Circuit> functions;
7354 std::vector<Acir::BrilligBytecode> unconstrained_functions;
7355
7356 friend bool operator==(const Program&, const Program&);
7357
7358 void msgpack_pack(auto& packer) const
7359 {
7360 packer.pack_array(2);
7361 packer.pack(functions);
7362 packer.pack(unconstrained_functions);
7363 }
7364
7365 void msgpack_unpack(msgpack::object const& o)
7366 {
7367 std::string name = "Program";
7368 if (o.type == msgpack::type::MAP) {
7370 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
7371 switch (tag) {
7372 case 0:
7373 Helpers::convert_or_throw(val, name, "functions", functions);
7374 break;
7375 case 1:
7376 Helpers::convert_or_throw(val, name, "unconstrained_functions", unconstrained_functions);
7377 break;
7378 default:
7379 // `#[tagged(allow_unknown_tags)]` on the Rust side:
7380 // silently skip any tag we don't recognize.
7381 break;
7382 }
7383 });
7384 } else {
7385 auto kvmap = Helpers::make_kvmap(o, name);
7386 Helpers::conv_fld_from_kvmap(kvmap, name, "functions", functions, false);
7387 Helpers::conv_fld_from_kvmap(kvmap, name, "unconstrained_functions", unconstrained_functions, false);
7388 }
7389 } else if (o.type == msgpack::type::ARRAY) {
7390 auto array = o.via.array;
7391 Helpers::conv_fld_from_array(array, name, "functions", functions, 0);
7392 Helpers::conv_fld_from_array(array, name, "unconstrained_functions", unconstrained_functions, 1);
7393 } else {
7394 throw_or_abort("expected MAP or ARRAY for " + name);
7395 }
7396 }
7397};
7398
7400 std::vector<Acir::Circuit> functions;
7402
7403 friend bool operator==(const ProgramWithoutBrillig&, const ProgramWithoutBrillig&);
7404
7405 void msgpack_pack(auto& packer) const
7406 {
7407 packer.pack_array(2);
7408 packer.pack(functions);
7409 packer.pack(unconstrained_functions);
7410 }
7411
7412 void msgpack_unpack(msgpack::object const& o)
7413 {
7414 std::string name = "ProgramWithoutBrillig";
7415 if (o.type == msgpack::type::MAP) {
7417 Helpers::int_map_dispatch(o, name, [&](uint8_t tag, msgpack::object const& val) {
7418 switch (tag) {
7419 case 0:
7420 Helpers::convert_or_throw(val, name, "functions", functions);
7421 break;
7422 case 1:
7423 // Field is `std::monostate` — wire entry intentionally discarded.
7424 break;
7425 default:
7426 std::cerr << val << std::endl;
7427 throw_or_abort("unknown tag for ProgramWithoutBrillig: " + std::to_string(tag));
7428 }
7429 });
7430 } else {
7431 Helpers::check_size(o.via.map.size, name, 2, 0);
7432 auto kvmap = Helpers::make_kvmap(o, name);
7433 Helpers::conv_fld_from_kvmap(kvmap, name, "functions", functions, false);
7434 }
7435 } else if (o.type == msgpack::type::ARRAY) {
7436 auto array = o.via.array;
7437 Helpers::check_size(array.size, name, 2, 0);
7438 Helpers::conv_fld_from_array(array, name, "functions", functions, 0);
7439 } else {
7440 throw_or_abort("expected MAP or ARRAY for " + name);
7441 }
7442 }
7443};
7444
7445} // end of namespace Acir
7446
7447namespace Acir {
7448
7449inline bool operator==(const AssertionPayload& lhs, const AssertionPayload& rhs)
7450{
7451 if (!(lhs.error_selector == rhs.error_selector)) {
7452 return false;
7453 }
7454 if (!(lhs.payload == rhs.payload)) {
7455 return false;
7456 }
7457 return true;
7458}
7459
7460} // end of namespace Acir
7461
7462template <>
7463template <typename Serializer>
7465{
7466 serializer.increase_container_depth();
7467 serde::Serializable<decltype(obj.error_selector)>::serialize(obj.error_selector, serializer);
7468 serde::Serializable<decltype(obj.payload)>::serialize(obj.payload, serializer);
7469 serializer.decrease_container_depth();
7470}
7471
7472template <>
7473template <typename Deserializer>
7475{
7476 deserializer.increase_container_depth();
7478 obj.error_selector = serde::Deserializable<decltype(obj.error_selector)>::deserialize(deserializer);
7479 obj.payload = serde::Deserializable<decltype(obj.payload)>::deserialize(deserializer);
7480 deserializer.decrease_container_depth();
7481 return obj;
7482}
7483
7484namespace Acir {
7485
7486inline bool operator==(const BinaryFieldOp& lhs, const BinaryFieldOp& rhs)
7487{
7488 if (!(lhs.value == rhs.value)) {
7489 return false;
7490 }
7491 return true;
7492}
7493
7494} // end of namespace Acir
7495
7496template <>
7497template <typename Serializer>
7499{
7500 serializer.increase_container_depth();
7501 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7502 serializer.decrease_container_depth();
7503}
7504
7505template <>
7506template <typename Deserializer>
7508{
7509 deserializer.increase_container_depth();
7511 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7512 deserializer.decrease_container_depth();
7513 return obj;
7514}
7515
7516namespace Acir {
7517
7518inline bool operator==(const BinaryFieldOp::Add& lhs, const BinaryFieldOp::Add& rhs)
7519{
7520 return true;
7521}
7522
7523} // end of namespace Acir
7524
7525template <>
7526template <typename Serializer>
7530
7531template <>
7532template <typename Deserializer>
7538
7539namespace Acir {
7540
7541inline bool operator==(const BinaryFieldOp::Sub& lhs, const BinaryFieldOp::Sub& rhs)
7542{
7543 return true;
7544}
7545
7546} // end of namespace Acir
7547
7548template <>
7549template <typename Serializer>
7553
7554template <>
7555template <typename Deserializer>
7561
7562namespace Acir {
7563
7564inline bool operator==(const BinaryFieldOp::Mul& lhs, const BinaryFieldOp::Mul& rhs)
7565{
7566 return true;
7567}
7568
7569} // end of namespace Acir
7570
7571template <>
7572template <typename Serializer>
7576
7577template <>
7578template <typename Deserializer>
7584
7585namespace Acir {
7586
7587inline bool operator==(const BinaryFieldOp::Div& lhs, const BinaryFieldOp::Div& rhs)
7588{
7589 return true;
7590}
7591
7592} // end of namespace Acir
7593
7594template <>
7595template <typename Serializer>
7599
7600template <>
7601template <typename Deserializer>
7607
7608namespace Acir {
7609
7611{
7612 return true;
7613}
7614
7615} // end of namespace Acir
7616
7617template <>
7618template <typename Serializer>
7622
7623template <>
7624template <typename Deserializer>
7631
7632namespace Acir {
7633
7634inline bool operator==(const BinaryFieldOp::Equals& lhs, const BinaryFieldOp::Equals& rhs)
7635{
7636 return true;
7637}
7638
7639} // end of namespace Acir
7640
7641template <>
7642template <typename Serializer>
7646
7647template <>
7648template <typename Deserializer>
7654
7655namespace Acir {
7656
7658{
7659 return true;
7660}
7661
7662} // end of namespace Acir
7663
7664template <>
7665template <typename Serializer>
7669
7670template <>
7671template <typename Deserializer>
7678
7679namespace Acir {
7680
7682{
7683 return true;
7684}
7685
7686} // end of namespace Acir
7687
7688template <>
7689template <typename Serializer>
7693
7694template <>
7695template <typename Deserializer>
7702
7703namespace Acir {
7704
7705inline bool operator==(const BinaryIntOp& lhs, const BinaryIntOp& rhs)
7706{
7707 if (!(lhs.value == rhs.value)) {
7708 return false;
7709 }
7710 return true;
7711}
7712
7713} // end of namespace Acir
7714
7715template <>
7716template <typename Serializer>
7718{
7719 serializer.increase_container_depth();
7720 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
7721 serializer.decrease_container_depth();
7722}
7723
7724template <>
7725template <typename Deserializer>
7727{
7728 deserializer.increase_container_depth();
7730 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
7731 deserializer.decrease_container_depth();
7732 return obj;
7733}
7734
7735namespace Acir {
7736
7737inline bool operator==(const BinaryIntOp::Add& lhs, const BinaryIntOp::Add& rhs)
7738{
7739 return true;
7740}
7741
7742} // end of namespace Acir
7743
7744template <>
7745template <typename Serializer>
7748
7749template <>
7750template <typename Deserializer>
7756
7757namespace Acir {
7758
7759inline bool operator==(const BinaryIntOp::Sub& lhs, const BinaryIntOp::Sub& rhs)
7760{
7761 return true;
7762}
7763
7764} // end of namespace Acir
7765
7766template <>
7767template <typename Serializer>
7770
7771template <>
7772template <typename Deserializer>
7778
7779namespace Acir {
7780
7781inline bool operator==(const BinaryIntOp::Mul& lhs, const BinaryIntOp::Mul& rhs)
7782{
7783 return true;
7784}
7785
7786} // end of namespace Acir
7787
7788template <>
7789template <typename Serializer>
7792
7793template <>
7794template <typename Deserializer>
7800
7801namespace Acir {
7802
7803inline bool operator==(const BinaryIntOp::Div& lhs, const BinaryIntOp::Div& rhs)
7804{
7805 return true;
7806}
7807
7808} // end of namespace Acir
7809
7810template <>
7811template <typename Serializer>
7814
7815template <>
7816template <typename Deserializer>
7822
7823namespace Acir {
7824
7825inline bool operator==(const BinaryIntOp::Equals& lhs, const BinaryIntOp::Equals& rhs)
7826{
7827 return true;
7828}
7829
7830} // end of namespace Acir
7831
7832template <>
7833template <typename Serializer>
7837
7838template <>
7839template <typename Deserializer>
7845
7846namespace Acir {
7847
7848inline bool operator==(const BinaryIntOp::LessThan& lhs, const BinaryIntOp::LessThan& rhs)
7849{
7850 return true;
7851}
7852
7853} // end of namespace Acir
7854
7855template <>
7856template <typename Serializer>
7860
7861template <>
7862template <typename Deserializer>
7868
7869namespace Acir {
7870
7872{
7873 return true;
7874}
7875
7876} // end of namespace Acir
7877
7878template <>
7879template <typename Serializer>
7883
7884template <>
7885template <typename Deserializer>
7892
7893namespace Acir {
7894
7895inline bool operator==(const BinaryIntOp::And& lhs, const BinaryIntOp::And& rhs)
7896{
7897 return true;
7898}
7899
7900} // end of namespace Acir
7901
7902template <>
7903template <typename Serializer>
7906
7907template <>
7908template <typename Deserializer>
7914
7915namespace Acir {
7916
7917inline bool operator==(const BinaryIntOp::Or& lhs, const BinaryIntOp::Or& rhs)
7918{
7919 return true;
7920}
7921
7922} // end of namespace Acir
7923
7924template <>
7925template <typename Serializer>
7928
7929template <>
7930template <typename Deserializer>
7932{
7934 return obj;
7935}
7936
7937namespace Acir {
7938
7939inline bool operator==(const BinaryIntOp::Xor& lhs, const BinaryIntOp::Xor& rhs)
7940{
7941 return true;
7942}
7943
7944} // end of namespace Acir
7945
7946template <>
7947template <typename Serializer>
7950
7951template <>
7952template <typename Deserializer>
7958
7959namespace Acir {
7960
7961inline bool operator==(const BinaryIntOp::Shl& lhs, const BinaryIntOp::Shl& rhs)
7962{
7963 return true;
7964}
7965
7966} // end of namespace Acir
7967
7968template <>
7969template <typename Serializer>
7972
7973template <>
7974template <typename Deserializer>
7980
7981namespace Acir {
7982
7983inline bool operator==(const BinaryIntOp::Shr& lhs, const BinaryIntOp::Shr& rhs)
7984{
7985 return true;
7986}
7987
7988} // end of namespace Acir
7989
7990template <>
7991template <typename Serializer>
7994
7995template <>
7996template <typename Deserializer>
8002
8003namespace Acir {
8004
8005inline bool operator==(const BitSize& lhs, const BitSize& rhs)
8006{
8007 if (!(lhs.value == rhs.value)) {
8008 return false;
8009 }
8010 return true;
8011}
8012
8013} // end of namespace Acir
8014
8015template <>
8016template <typename Serializer>
8017void serde::Serializable<Acir::BitSize>::serialize(const Acir::BitSize& obj, Serializer& serializer)
8018{
8019 serializer.increase_container_depth();
8020 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8021 serializer.decrease_container_depth();
8022}
8023
8024template <>
8025template <typename Deserializer>
8027{
8028 deserializer.increase_container_depth();
8029 Acir::BitSize obj;
8030 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8031 deserializer.decrease_container_depth();
8032 return obj;
8033}
8034
8035namespace Acir {
8036
8037inline bool operator==(const BitSize::Field& lhs, const BitSize::Field& rhs)
8038{
8039 return true;
8040}
8041
8042} // end of namespace Acir
8043
8044template <>
8045template <typename Serializer>
8048
8049template <>
8050template <typename Deserializer>
8052{
8054 return obj;
8055}
8056
8057namespace Acir {
8058
8059inline bool operator==(const BitSize::Integer& lhs, const BitSize::Integer& rhs)
8060{
8061 if (!(lhs.value == rhs.value)) {
8062 return false;
8063 }
8064 return true;
8065}
8066
8067} // end of namespace Acir
8068
8069template <>
8070template <typename Serializer>
8072{
8073 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8074}
8075
8076template <>
8077template <typename Deserializer>
8079{
8081 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8082 return obj;
8083}
8084
8085namespace Acir {
8086
8087inline bool operator==(const BlackBoxFuncCall& lhs, const BlackBoxFuncCall& rhs)
8088{
8089 if (!(lhs.value == rhs.value)) {
8090 return false;
8091 }
8092 return true;
8093}
8094
8095} // end of namespace Acir
8096
8097template <>
8098template <typename Serializer>
8100{
8101 serializer.increase_container_depth();
8102 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8103 serializer.decrease_container_depth();
8104}
8105
8106template <>
8107template <typename Deserializer>
8109{
8110 deserializer.increase_container_depth();
8112 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8113 deserializer.decrease_container_depth();
8114 return obj;
8115}
8116
8117namespace Acir {
8118
8120{
8121 if (!(lhs.inputs == rhs.inputs)) {
8122 return false;
8123 }
8124 if (!(lhs.iv == rhs.iv)) {
8125 return false;
8126 }
8127 if (!(lhs.key == rhs.key)) {
8128 return false;
8129 }
8130 if (!(lhs.outputs == rhs.outputs)) {
8131 return false;
8132 }
8133 return true;
8134}
8135
8136} // end of namespace Acir
8137
8138template <>
8139template <typename Serializer>
8141 const Acir::BlackBoxFuncCall::AES128Encrypt& obj, Serializer& serializer)
8142{
8143 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8144 serde::Serializable<decltype(obj.iv)>::serialize(obj.iv, serializer);
8145 serde::Serializable<decltype(obj.key)>::serialize(obj.key, serializer);
8146 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8147}
8148
8149template <>
8150template <typename Deserializer>
8152 Deserializer& deserializer)
8153{
8155 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8156 obj.iv = serde::Deserializable<decltype(obj.iv)>::deserialize(deserializer);
8157 obj.key = serde::Deserializable<decltype(obj.key)>::deserialize(deserializer);
8158 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8159 return obj;
8160}
8161
8162namespace Acir {
8163
8164inline bool operator==(const BlackBoxFuncCall::AND& lhs, const BlackBoxFuncCall::AND& rhs)
8165{
8166 if (!(lhs.lhs == rhs.lhs)) {
8167 return false;
8168 }
8169 if (!(lhs.rhs == rhs.rhs)) {
8170 return false;
8171 }
8172 if (!(lhs.num_bits == rhs.num_bits)) {
8173 return false;
8174 }
8175 if (!(lhs.output == rhs.output)) {
8176 return false;
8177 }
8178 return true;
8179}
8180
8181} // end of namespace Acir
8182
8183template <>
8184template <typename Serializer>
8186 Serializer& serializer)
8187{
8188 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
8189 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
8190 serde::Serializable<decltype(obj.num_bits)>::serialize(obj.num_bits, serializer);
8191 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8192}
8193
8194template <>
8195template <typename Deserializer>
8197{
8199 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
8200 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
8201 obj.num_bits = serde::Deserializable<decltype(obj.num_bits)>::deserialize(deserializer);
8202 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8203 return obj;
8204}
8205
8206namespace Acir {
8207
8208inline bool operator==(const BlackBoxFuncCall::XOR& lhs, const BlackBoxFuncCall::XOR& rhs)
8209{
8210 if (!(lhs.lhs == rhs.lhs)) {
8211 return false;
8212 }
8213 if (!(lhs.rhs == rhs.rhs)) {
8214 return false;
8215 }
8216 if (!(lhs.num_bits == rhs.num_bits)) {
8217 return false;
8218 }
8219 if (!(lhs.output == rhs.output)) {
8220 return false;
8221 }
8222 return true;
8223}
8224
8225} // end of namespace Acir
8226
8227template <>
8228template <typename Serializer>
8230 Serializer& serializer)
8231{
8232 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
8233 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
8234 serde::Serializable<decltype(obj.num_bits)>::serialize(obj.num_bits, serializer);
8235 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8236}
8237
8238template <>
8239template <typename Deserializer>
8241{
8243 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
8244 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
8245 obj.num_bits = serde::Deserializable<decltype(obj.num_bits)>::deserialize(deserializer);
8246 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8247 return obj;
8248}
8249
8250namespace Acir {
8251
8253{
8254 if (!(lhs.input == rhs.input)) {
8255 return false;
8256 }
8257 if (!(lhs.num_bits == rhs.num_bits)) {
8258 return false;
8259 }
8260 return true;
8261}
8262
8263} // end of namespace Acir
8264
8265template <>
8266template <typename Serializer>
8268 Serializer& serializer)
8269{
8270 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
8271 serde::Serializable<decltype(obj.num_bits)>::serialize(obj.num_bits, serializer);
8272}
8273
8274template <>
8275template <typename Deserializer>
8277 Deserializer& deserializer)
8278{
8280 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
8281 obj.num_bits = serde::Deserializable<decltype(obj.num_bits)>::deserialize(deserializer);
8282 return obj;
8283}
8284
8285namespace Acir {
8286
8288{
8289 if (!(lhs.inputs == rhs.inputs)) {
8290 return false;
8291 }
8292 if (!(lhs.outputs == rhs.outputs)) {
8293 return false;
8294 }
8295 return true;
8296}
8297
8298} // end of namespace Acir
8299
8300template <>
8301template <typename Serializer>
8303 Serializer& serializer)
8304{
8305 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8306 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8307}
8308
8309template <>
8310template <typename Deserializer>
8312 Deserializer& deserializer)
8313{
8315 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8316 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8317 return obj;
8318}
8319
8320namespace Acir {
8321
8323{
8324 if (!(lhs.inputs == rhs.inputs)) {
8325 return false;
8326 }
8327 if (!(lhs.outputs == rhs.outputs)) {
8328 return false;
8329 }
8330 return true;
8331}
8332
8333} // end of namespace Acir
8334
8335template <>
8336template <typename Serializer>
8338 Serializer& serializer)
8339{
8340 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8341 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8342}
8343
8344template <>
8345template <typename Deserializer>
8347 Deserializer& deserializer)
8348{
8350 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8351 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8352 return obj;
8353}
8354
8355namespace Acir {
8356
8358{
8359 if (!(lhs.public_key_x == rhs.public_key_x)) {
8360 return false;
8361 }
8362 if (!(lhs.public_key_y == rhs.public_key_y)) {
8363 return false;
8364 }
8365 if (!(lhs.signature == rhs.signature)) {
8366 return false;
8367 }
8368 if (!(lhs.hashed_message == rhs.hashed_message)) {
8369 return false;
8370 }
8371 if (!(lhs.predicate == rhs.predicate)) {
8372 return false;
8373 }
8374 if (!(lhs.output == rhs.output)) {
8375 return false;
8376 }
8377 return true;
8378}
8379
8380} // end of namespace Acir
8381
8382template <>
8383template <typename Serializer>
8385 const Acir::BlackBoxFuncCall::EcdsaSecp256k1& obj, Serializer& serializer)
8386{
8387 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
8388 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
8389 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
8390 serde::Serializable<decltype(obj.hashed_message)>::serialize(obj.hashed_message, serializer);
8391 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8392 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8393}
8394
8395template <>
8396template <typename Deserializer>
8398 Deserializer& deserializer)
8399{
8401 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
8402 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
8403 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
8404 obj.hashed_message = serde::Deserializable<decltype(obj.hashed_message)>::deserialize(deserializer);
8405 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8406 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8407 return obj;
8408}
8409
8410namespace Acir {
8411
8413{
8414 if (!(lhs.public_key_x == rhs.public_key_x)) {
8415 return false;
8416 }
8417 if (!(lhs.public_key_y == rhs.public_key_y)) {
8418 return false;
8419 }
8420 if (!(lhs.signature == rhs.signature)) {
8421 return false;
8422 }
8423 if (!(lhs.hashed_message == rhs.hashed_message)) {
8424 return false;
8425 }
8426 if (!(lhs.predicate == rhs.predicate)) {
8427 return false;
8428 }
8429 if (!(lhs.output == rhs.output)) {
8430 return false;
8431 }
8432 return true;
8433}
8434
8435} // end of namespace Acir
8436
8437template <>
8438template <typename Serializer>
8440 const Acir::BlackBoxFuncCall::EcdsaSecp256r1& obj, Serializer& serializer)
8441{
8442 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
8443 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
8444 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
8445 serde::Serializable<decltype(obj.hashed_message)>::serialize(obj.hashed_message, serializer);
8446 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8447 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8448}
8449
8450template <>
8451template <typename Deserializer>
8453 Deserializer& deserializer)
8454{
8456 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
8457 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
8458 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
8459 obj.hashed_message = serde::Deserializable<decltype(obj.hashed_message)>::deserialize(deserializer);
8460 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8461 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8462 return obj;
8463}
8464
8465namespace Acir {
8466
8468{
8469 if (!(lhs.points == rhs.points)) {
8470 return false;
8471 }
8472 if (!(lhs.scalars == rhs.scalars)) {
8473 return false;
8474 }
8475 if (!(lhs.predicate == rhs.predicate)) {
8476 return false;
8477 }
8478 if (!(lhs.outputs == rhs.outputs)) {
8479 return false;
8480 }
8481 return true;
8482}
8483
8484} // end of namespace Acir
8485
8486template <>
8487template <typename Serializer>
8489 const Acir::BlackBoxFuncCall::MultiScalarMul& obj, Serializer& serializer)
8490{
8491 serde::Serializable<decltype(obj.points)>::serialize(obj.points, serializer);
8492 serde::Serializable<decltype(obj.scalars)>::serialize(obj.scalars, serializer);
8493 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8494 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8495}
8496
8497template <>
8498template <typename Deserializer>
8500 Deserializer& deserializer)
8501{
8503 obj.points = serde::Deserializable<decltype(obj.points)>::deserialize(deserializer);
8504 obj.scalars = serde::Deserializable<decltype(obj.scalars)>::deserialize(deserializer);
8505 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8506 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8507 return obj;
8508}
8509
8510namespace Acir {
8511
8513{
8514 if (!(lhs.input1 == rhs.input1)) {
8515 return false;
8516 }
8517 if (!(lhs.input2 == rhs.input2)) {
8518 return false;
8519 }
8520 if (!(lhs.predicate == rhs.predicate)) {
8521 return false;
8522 }
8523 if (!(lhs.outputs == rhs.outputs)) {
8524 return false;
8525 }
8526 return true;
8527}
8528
8529} // end of namespace Acir
8530
8531template <>
8532template <typename Serializer>
8534 const Acir::BlackBoxFuncCall::EmbeddedCurveAdd& obj, Serializer& serializer)
8535{
8536 serde::Serializable<decltype(obj.input1)>::serialize(obj.input1, serializer);
8537 serde::Serializable<decltype(obj.input2)>::serialize(obj.input2, serializer);
8538 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8539 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8540}
8541
8542template <>
8543template <typename Deserializer>
8545 Deserializer& deserializer)
8546{
8548 obj.input1 = serde::Deserializable<decltype(obj.input1)>::deserialize(deserializer);
8549 obj.input2 = serde::Deserializable<decltype(obj.input2)>::deserialize(deserializer);
8550 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8551 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8552 return obj;
8553}
8554
8555namespace Acir {
8556
8558{
8559 if (!(lhs.inputs == rhs.inputs)) {
8560 return false;
8561 }
8562 if (!(lhs.outputs == rhs.outputs)) {
8563 return false;
8564 }
8565 return true;
8566}
8567
8568} // end of namespace Acir
8569
8570template <>
8571template <typename Serializer>
8573 Serializer& serializer)
8574{
8575 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8576 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8577}
8578
8579template <>
8580template <typename Deserializer>
8582 Deserializer& deserializer)
8583{
8585 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8586 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8587 return obj;
8588}
8589
8590namespace Acir {
8591
8594{
8595 if (!(lhs.verification_key == rhs.verification_key)) {
8596 return false;
8597 }
8598 if (!(lhs.proof == rhs.proof)) {
8599 return false;
8600 }
8601 if (!(lhs.public_inputs == rhs.public_inputs)) {
8602 return false;
8603 }
8604 if (!(lhs.key_hash == rhs.key_hash)) {
8605 return false;
8606 }
8607 if (!(lhs.proof_type == rhs.proof_type)) {
8608 return false;
8609 }
8610 if (!(lhs.predicate == rhs.predicate)) {
8611 return false;
8612 }
8613 return true;
8614}
8615
8616} // end of namespace Acir
8617
8618template <>
8619template <typename Serializer>
8621 const Acir::BlackBoxFuncCall::RecursiveAggregation& obj, Serializer& serializer)
8622{
8623 serde::Serializable<decltype(obj.verification_key)>::serialize(obj.verification_key, serializer);
8624 serde::Serializable<decltype(obj.proof)>::serialize(obj.proof, serializer);
8625 serde::Serializable<decltype(obj.public_inputs)>::serialize(obj.public_inputs, serializer);
8626 serde::Serializable<decltype(obj.key_hash)>::serialize(obj.key_hash, serializer);
8627 serde::Serializable<decltype(obj.proof_type)>::serialize(obj.proof_type, serializer);
8628 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
8629}
8630
8631template <>
8632template <typename Deserializer>
8634 Acir::BlackBoxFuncCall::RecursiveAggregation>::deserialize(Deserializer& deserializer)
8635{
8637 obj.verification_key = serde::Deserializable<decltype(obj.verification_key)>::deserialize(deserializer);
8638 obj.proof = serde::Deserializable<decltype(obj.proof)>::deserialize(deserializer);
8639 obj.public_inputs = serde::Deserializable<decltype(obj.public_inputs)>::deserialize(deserializer);
8640 obj.key_hash = serde::Deserializable<decltype(obj.key_hash)>::deserialize(deserializer);
8641 obj.proof_type = serde::Deserializable<decltype(obj.proof_type)>::deserialize(deserializer);
8642 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
8643 return obj;
8644}
8645
8646namespace Acir {
8647
8650{
8651 if (!(lhs.inputs == rhs.inputs)) {
8652 return false;
8653 }
8654 if (!(lhs.outputs == rhs.outputs)) {
8655 return false;
8656 }
8657 return true;
8658}
8659
8660} // end of namespace Acir
8661
8662template <>
8663template <typename Serializer>
8665 const Acir::BlackBoxFuncCall::Poseidon2Permutation& obj, Serializer& serializer)
8666{
8667 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8668 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8669}
8670
8671template <>
8672template <typename Deserializer>
8674 Acir::BlackBoxFuncCall::Poseidon2Permutation>::deserialize(Deserializer& deserializer)
8675{
8677 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8678 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8679 return obj;
8680}
8681
8682namespace Acir {
8683
8685{
8686 if (!(lhs.inputs == rhs.inputs)) {
8687 return false;
8688 }
8689 if (!(lhs.hash_values == rhs.hash_values)) {
8690 return false;
8691 }
8692 if (!(lhs.outputs == rhs.outputs)) {
8693 return false;
8694 }
8695 return true;
8696}
8697
8698} // end of namespace Acir
8699
8700template <>
8701template <typename Serializer>
8703 const Acir::BlackBoxFuncCall::Sha256Compression& obj, Serializer& serializer)
8704{
8705 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8706 serde::Serializable<decltype(obj.hash_values)>::serialize(obj.hash_values, serializer);
8707 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8708}
8709
8710template <>
8711template <typename Deserializer>
8713 Deserializer& deserializer)
8714{
8716 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8717 obj.hash_values = serde::Deserializable<decltype(obj.hash_values)>::deserialize(deserializer);
8718 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8719 return obj;
8720}
8721
8722namespace Acir {
8723
8724inline bool operator==(const BlackBoxOp& lhs, const BlackBoxOp& rhs)
8725{
8726 if (!(lhs.value == rhs.value)) {
8727 return false;
8728 }
8729 return true;
8730}
8731
8732} // end of namespace Acir
8733
8734template <>
8735template <typename Serializer>
8737{
8738 serializer.increase_container_depth();
8739 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
8740 serializer.decrease_container_depth();
8741}
8742
8743template <>
8744template <typename Deserializer>
8746{
8747 deserializer.increase_container_depth();
8748 Acir::BlackBoxOp obj;
8749 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
8750 deserializer.decrease_container_depth();
8751 return obj;
8752}
8753
8754namespace Acir {
8755
8757{
8758 if (!(lhs.inputs == rhs.inputs)) {
8759 return false;
8760 }
8761 if (!(lhs.iv == rhs.iv)) {
8762 return false;
8763 }
8764 if (!(lhs.key == rhs.key)) {
8765 return false;
8766 }
8767 if (!(lhs.outputs == rhs.outputs)) {
8768 return false;
8769 }
8770 return true;
8771}
8772
8773} // end of namespace Acir
8774
8775template <>
8776template <typename Serializer>
8778 Serializer& serializer)
8779{
8780 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
8781 serde::Serializable<decltype(obj.iv)>::serialize(obj.iv, serializer);
8782 serde::Serializable<decltype(obj.key)>::serialize(obj.key, serializer);
8783 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
8784}
8785
8786template <>
8787template <typename Deserializer>
8789 Deserializer& deserializer)
8790{
8792 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
8793 obj.iv = serde::Deserializable<decltype(obj.iv)>::deserialize(deserializer);
8794 obj.key = serde::Deserializable<decltype(obj.key)>::deserialize(deserializer);
8795 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
8796 return obj;
8797}
8798
8799namespace Acir {
8800
8801inline bool operator==(const BlackBoxOp::Blake2s& lhs, const BlackBoxOp::Blake2s& rhs)
8802{
8803 if (!(lhs.message == rhs.message)) {
8804 return false;
8805 }
8806 if (!(lhs.output == rhs.output)) {
8807 return false;
8808 }
8809 return true;
8810}
8811
8812} // end of namespace Acir
8813
8814template <>
8815template <typename Serializer>
8817 Serializer& serializer)
8818{
8819 serde::Serializable<decltype(obj.message)>::serialize(obj.message, serializer);
8820 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8821}
8822
8823template <>
8824template <typename Deserializer>
8826{
8828 obj.message = serde::Deserializable<decltype(obj.message)>::deserialize(deserializer);
8829 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8830 return obj;
8831}
8832
8833namespace Acir {
8834
8835inline bool operator==(const BlackBoxOp::Blake3& lhs, const BlackBoxOp::Blake3& rhs)
8836{
8837 if (!(lhs.message == rhs.message)) {
8838 return false;
8839 }
8840 if (!(lhs.output == rhs.output)) {
8841 return false;
8842 }
8843 return true;
8844}
8845
8846} // end of namespace Acir
8847
8848template <>
8849template <typename Serializer>
8851 Serializer& serializer)
8852{
8853 serde::Serializable<decltype(obj.message)>::serialize(obj.message, serializer);
8854 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8855}
8856
8857template <>
8858template <typename Deserializer>
8860{
8862 obj.message = serde::Deserializable<decltype(obj.message)>::deserialize(deserializer);
8863 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8864 return obj;
8865}
8866
8867namespace Acir {
8868
8870{
8871 if (!(lhs.input == rhs.input)) {
8872 return false;
8873 }
8874 if (!(lhs.output == rhs.output)) {
8875 return false;
8876 }
8877 return true;
8878}
8879
8880} // end of namespace Acir
8881
8882template <>
8883template <typename Serializer>
8885 Serializer& serializer)
8886{
8887 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
8888 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
8889}
8890
8891template <>
8892template <typename Deserializer>
8894 Deserializer& deserializer)
8895{
8897 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
8898 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
8899 return obj;
8900}
8901
8902namespace Acir {
8903
8905{
8906 if (!(lhs.hashed_msg == rhs.hashed_msg)) {
8907 return false;
8908 }
8909 if (!(lhs.public_key_x == rhs.public_key_x)) {
8910 return false;
8911 }
8912 if (!(lhs.public_key_y == rhs.public_key_y)) {
8913 return false;
8914 }
8915 if (!(lhs.signature == rhs.signature)) {
8916 return false;
8917 }
8918 if (!(lhs.result == rhs.result)) {
8919 return false;
8920 }
8921 return true;
8922}
8923
8924} // end of namespace Acir
8925
8926template <>
8927template <typename Serializer>
8929 Serializer& serializer)
8930{
8931 serde::Serializable<decltype(obj.hashed_msg)>::serialize(obj.hashed_msg, serializer);
8932 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
8933 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
8934 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
8935 serde::Serializable<decltype(obj.result)>::serialize(obj.result, serializer);
8936}
8937
8938template <>
8939template <typename Deserializer>
8941 Deserializer& deserializer)
8942{
8944 obj.hashed_msg = serde::Deserializable<decltype(obj.hashed_msg)>::deserialize(deserializer);
8945 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
8946 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
8947 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
8948 obj.result = serde::Deserializable<decltype(obj.result)>::deserialize(deserializer);
8949 return obj;
8950}
8951
8952namespace Acir {
8953
8955{
8956 if (!(lhs.hashed_msg == rhs.hashed_msg)) {
8957 return false;
8958 }
8959 if (!(lhs.public_key_x == rhs.public_key_x)) {
8960 return false;
8961 }
8962 if (!(lhs.public_key_y == rhs.public_key_y)) {
8963 return false;
8964 }
8965 if (!(lhs.signature == rhs.signature)) {
8966 return false;
8967 }
8968 if (!(lhs.result == rhs.result)) {
8969 return false;
8970 }
8971 return true;
8972}
8973
8974} // end of namespace Acir
8975
8976template <>
8977template <typename Serializer>
8979 Serializer& serializer)
8980{
8981 serde::Serializable<decltype(obj.hashed_msg)>::serialize(obj.hashed_msg, serializer);
8982 serde::Serializable<decltype(obj.public_key_x)>::serialize(obj.public_key_x, serializer);
8983 serde::Serializable<decltype(obj.public_key_y)>::serialize(obj.public_key_y, serializer);
8984 serde::Serializable<decltype(obj.signature)>::serialize(obj.signature, serializer);
8985 serde::Serializable<decltype(obj.result)>::serialize(obj.result, serializer);
8986}
8987
8988template <>
8989template <typename Deserializer>
8991 Deserializer& deserializer)
8992{
8994 obj.hashed_msg = serde::Deserializable<decltype(obj.hashed_msg)>::deserialize(deserializer);
8995 obj.public_key_x = serde::Deserializable<decltype(obj.public_key_x)>::deserialize(deserializer);
8996 obj.public_key_y = serde::Deserializable<decltype(obj.public_key_y)>::deserialize(deserializer);
8997 obj.signature = serde::Deserializable<decltype(obj.signature)>::deserialize(deserializer);
8998 obj.result = serde::Deserializable<decltype(obj.result)>::deserialize(deserializer);
8999 return obj;
9000}
9001
9002namespace Acir {
9003
9005{
9006 if (!(lhs.points == rhs.points)) {
9007 return false;
9008 }
9009 if (!(lhs.scalars == rhs.scalars)) {
9010 return false;
9011 }
9012 if (!(lhs.outputs == rhs.outputs)) {
9013 return false;
9014 }
9015 return true;
9016}
9017
9018} // end of namespace Acir
9019
9020template <>
9021template <typename Serializer>
9023 Serializer& serializer)
9024{
9025 serde::Serializable<decltype(obj.points)>::serialize(obj.points, serializer);
9026 serde::Serializable<decltype(obj.scalars)>::serialize(obj.scalars, serializer);
9027 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
9028}
9029
9030template <>
9031template <typename Deserializer>
9033 Deserializer& deserializer)
9034{
9036 obj.points = serde::Deserializable<decltype(obj.points)>::deserialize(deserializer);
9037 obj.scalars = serde::Deserializable<decltype(obj.scalars)>::deserialize(deserializer);
9038 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
9039 return obj;
9040}
9041
9042namespace Acir {
9043
9045{
9046 if (!(lhs.input1_x == rhs.input1_x)) {
9047 return false;
9048 }
9049 if (!(lhs.input1_y == rhs.input1_y)) {
9050 return false;
9051 }
9052 if (!(lhs.input2_x == rhs.input2_x)) {
9053 return false;
9054 }
9055 if (!(lhs.input2_y == rhs.input2_y)) {
9056 return false;
9057 }
9058 if (!(lhs.result == rhs.result)) {
9059 return false;
9060 }
9061 return true;
9062}
9063
9064} // end of namespace Acir
9065
9066template <>
9067template <typename Serializer>
9069 Serializer& serializer)
9070{
9071 serde::Serializable<decltype(obj.input1_x)>::serialize(obj.input1_x, serializer);
9072 serde::Serializable<decltype(obj.input1_y)>::serialize(obj.input1_y, serializer);
9073 serde::Serializable<decltype(obj.input2_x)>::serialize(obj.input2_x, serializer);
9074 serde::Serializable<decltype(obj.input2_y)>::serialize(obj.input2_y, serializer);
9075 serde::Serializable<decltype(obj.result)>::serialize(obj.result, serializer);
9076}
9077
9078template <>
9079template <typename Deserializer>
9081 Deserializer& deserializer)
9082{
9084 obj.input1_x = serde::Deserializable<decltype(obj.input1_x)>::deserialize(deserializer);
9085 obj.input1_y = serde::Deserializable<decltype(obj.input1_y)>::deserialize(deserializer);
9086 obj.input2_x = serde::Deserializable<decltype(obj.input2_x)>::deserialize(deserializer);
9087 obj.input2_y = serde::Deserializable<decltype(obj.input2_y)>::deserialize(deserializer);
9088 obj.result = serde::Deserializable<decltype(obj.result)>::deserialize(deserializer);
9089 return obj;
9090}
9091
9092namespace Acir {
9093
9095{
9096 if (!(lhs.message == rhs.message)) {
9097 return false;
9098 }
9099 if (!(lhs.output == rhs.output)) {
9100 return false;
9101 }
9102 return true;
9103}
9104
9105} // end of namespace Acir
9106
9107template <>
9108template <typename Serializer>
9110 const Acir::BlackBoxOp::Poseidon2Permutation& obj, Serializer& serializer)
9111{
9112 serde::Serializable<decltype(obj.message)>::serialize(obj.message, serializer);
9113 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
9114}
9115
9116template <>
9117template <typename Deserializer>
9119 Deserializer& deserializer)
9120{
9122 obj.message = serde::Deserializable<decltype(obj.message)>::deserialize(deserializer);
9123 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
9124 return obj;
9125}
9126
9127namespace Acir {
9128
9130{
9131 if (!(lhs.input == rhs.input)) {
9132 return false;
9133 }
9134 if (!(lhs.hash_values == rhs.hash_values)) {
9135 return false;
9136 }
9137 if (!(lhs.output == rhs.output)) {
9138 return false;
9139 }
9140 return true;
9141}
9142
9143} // end of namespace Acir
9144
9145template <>
9146template <typename Serializer>
9148 Serializer& serializer)
9149{
9150 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
9151 serde::Serializable<decltype(obj.hash_values)>::serialize(obj.hash_values, serializer);
9152 serde::Serializable<decltype(obj.output)>::serialize(obj.output, serializer);
9153}
9154
9155template <>
9156template <typename Deserializer>
9158 Deserializer& deserializer)
9159{
9161 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
9162 obj.hash_values = serde::Deserializable<decltype(obj.hash_values)>::deserialize(deserializer);
9163 obj.output = serde::Deserializable<decltype(obj.output)>::deserialize(deserializer);
9164 return obj;
9165}
9166
9167namespace Acir {
9168
9169inline bool operator==(const BlackBoxOp::ToRadix& lhs, const BlackBoxOp::ToRadix& rhs)
9170{
9171 if (!(lhs.input == rhs.input)) {
9172 return false;
9173 }
9174 if (!(lhs.radix == rhs.radix)) {
9175 return false;
9176 }
9177 if (!(lhs.output_pointer == rhs.output_pointer)) {
9178 return false;
9179 }
9180 if (!(lhs.num_limbs == rhs.num_limbs)) {
9181 return false;
9182 }
9183 if (!(lhs.output_bits == rhs.output_bits)) {
9184 return false;
9185 }
9186 return true;
9187}
9188
9189} // end of namespace Acir
9190
9191template <>
9192template <typename Serializer>
9194 Serializer& serializer)
9195{
9196 serde::Serializable<decltype(obj.input)>::serialize(obj.input, serializer);
9197 serde::Serializable<decltype(obj.radix)>::serialize(obj.radix, serializer);
9198 serde::Serializable<decltype(obj.output_pointer)>::serialize(obj.output_pointer, serializer);
9199 serde::Serializable<decltype(obj.num_limbs)>::serialize(obj.num_limbs, serializer);
9200 serde::Serializable<decltype(obj.output_bits)>::serialize(obj.output_bits, serializer);
9201}
9202
9203template <>
9204template <typename Deserializer>
9206{
9208 obj.input = serde::Deserializable<decltype(obj.input)>::deserialize(deserializer);
9209 obj.radix = serde::Deserializable<decltype(obj.radix)>::deserialize(deserializer);
9210 obj.output_pointer = serde::Deserializable<decltype(obj.output_pointer)>::deserialize(deserializer);
9211 obj.num_limbs = serde::Deserializable<decltype(obj.num_limbs)>::deserialize(deserializer);
9212 obj.output_bits = serde::Deserializable<decltype(obj.output_bits)>::deserialize(deserializer);
9213 return obj;
9214}
9215
9216namespace Acir {
9217
9218inline bool operator==(const BlockId& lhs, const BlockId& rhs)
9219{
9220 if (!(lhs.value == rhs.value)) {
9221 return false;
9222 }
9223 return true;
9224}
9225
9226} // end of namespace Acir
9227
9228template <>
9229template <typename Serializer>
9230void serde::Serializable<Acir::BlockId>::serialize(const Acir::BlockId& obj, Serializer& serializer)
9231{
9232 serializer.increase_container_depth();
9233 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9234 serializer.decrease_container_depth();
9235}
9236
9237template <>
9238template <typename Deserializer>
9240{
9241 deserializer.increase_container_depth();
9242 Acir::BlockId obj;
9243 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9244 deserializer.decrease_container_depth();
9245 return obj;
9246}
9247
9248namespace Acir {
9249
9250inline bool operator==(const BlockType& lhs, const BlockType& rhs)
9251{
9252 if (!(lhs.value == rhs.value)) {
9253 return false;
9254 }
9255 return true;
9256}
9257
9258} // end of namespace Acir
9259
9260template <>
9261template <typename Serializer>
9263{
9264 serializer.increase_container_depth();
9265 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9266 serializer.decrease_container_depth();
9267}
9268
9269template <>
9270template <typename Deserializer>
9272{
9273 deserializer.increase_container_depth();
9274 Acir::BlockType obj;
9275 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9276 deserializer.decrease_container_depth();
9277 return obj;
9278}
9279
9280namespace Acir {
9281
9282inline bool operator==(const BlockType::Memory& lhs, const BlockType::Memory& rhs)
9283{
9284 return true;
9285}
9286
9287} // end of namespace Acir
9288
9289template <>
9290template <typename Serializer>
9293
9294template <>
9295template <typename Deserializer>
9301
9302namespace Acir {
9303
9304inline bool operator==(const BlockType::CallData& lhs, const BlockType::CallData& rhs)
9305{
9306 if (!(lhs.value == rhs.value)) {
9307 return false;
9308 }
9309 return true;
9310}
9311
9312} // end of namespace Acir
9313
9314template <>
9315template <typename Serializer>
9317 Serializer& serializer)
9318{
9319 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9320}
9321
9322template <>
9323template <typename Deserializer>
9325{
9327 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9328 return obj;
9329}
9330
9331namespace Acir {
9332
9333inline bool operator==(const BlockType::ReturnData& lhs, const BlockType::ReturnData& rhs)
9334{
9335 return true;
9336}
9337
9338} // end of namespace Acir
9339
9340template <>
9341template <typename Serializer>
9345
9346template <>
9347template <typename Deserializer>
9353
9354namespace Acir {
9355
9356inline bool operator==(const BrilligBytecode& lhs, const BrilligBytecode& rhs)
9357{
9358 if (!(lhs.function_name == rhs.function_name)) {
9359 return false;
9360 }
9361 if (!(lhs.bytecode == rhs.bytecode)) {
9362 return false;
9363 }
9364 return true;
9365}
9366
9367} // end of namespace Acir
9368
9369template <>
9370template <typename Serializer>
9372{
9373 serializer.increase_container_depth();
9374 serde::Serializable<decltype(obj.function_name)>::serialize(obj.function_name, serializer);
9375 serde::Serializable<decltype(obj.bytecode)>::serialize(obj.bytecode, serializer);
9376 serializer.decrease_container_depth();
9377}
9378
9379template <>
9380template <typename Deserializer>
9382{
9383 deserializer.increase_container_depth();
9385 obj.function_name = serde::Deserializable<decltype(obj.function_name)>::deserialize(deserializer);
9386 obj.bytecode = serde::Deserializable<decltype(obj.bytecode)>::deserialize(deserializer);
9387 deserializer.decrease_container_depth();
9388 return obj;
9389}
9390
9391namespace Acir {
9392
9393inline bool operator==(const BrilligInputs& lhs, const BrilligInputs& rhs)
9394{
9395 if (!(lhs.value == rhs.value)) {
9396 return false;
9397 }
9398 return true;
9399}
9400
9401} // end of namespace Acir
9402
9403template <>
9404template <typename Serializer>
9406{
9407 serializer.increase_container_depth();
9408 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9409 serializer.decrease_container_depth();
9410}
9411
9412template <>
9413template <typename Deserializer>
9415{
9416 deserializer.increase_container_depth();
9418 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9419 deserializer.decrease_container_depth();
9420 return obj;
9421}
9422
9423namespace Acir {
9424
9425inline bool operator==(const BrilligInputs::Single& lhs, const BrilligInputs::Single& rhs)
9426{
9427 if (!(lhs.value == rhs.value)) {
9428 return false;
9429 }
9430 return true;
9431}
9432
9433} // end of namespace Acir
9434
9435template <>
9436template <typename Serializer>
9438 Serializer& serializer)
9439{
9440 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9441}
9442
9443template <>
9444template <typename Deserializer>
9446{
9448 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9449 return obj;
9450}
9451
9452namespace Acir {
9453
9454inline bool operator==(const BrilligInputs::Array& lhs, const BrilligInputs::Array& rhs)
9455{
9456 if (!(lhs.value == rhs.value)) {
9457 return false;
9458 }
9459 return true;
9460}
9461
9462} // end of namespace Acir
9463
9464template <>
9465template <typename Serializer>
9467 Serializer& serializer)
9468{
9469 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9470}
9471
9472template <>
9473template <typename Deserializer>
9475{
9477 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9478 return obj;
9479}
9480
9481namespace Acir {
9482
9484{
9485 if (!(lhs.value == rhs.value)) {
9486 return false;
9487 }
9488 return true;
9489}
9490
9491} // end of namespace Acir
9492
9493template <>
9494template <typename Serializer>
9496 Serializer& serializer)
9497{
9498 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9499}
9500
9501template <>
9502template <typename Deserializer>
9504 Deserializer& deserializer)
9505{
9507 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9508 return obj;
9509}
9510
9511namespace Acir {
9512
9513inline bool operator==(const BrilligOpcode& lhs, const BrilligOpcode& rhs)
9514{
9515 if (!(lhs.value == rhs.value)) {
9516 return false;
9517 }
9518 return true;
9519}
9520
9521} // end of namespace Acir
9522
9523template <>
9524template <typename Serializer>
9526{
9527 serializer.increase_container_depth();
9528 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9529 serializer.decrease_container_depth();
9530}
9531
9532template <>
9533template <typename Deserializer>
9535{
9536 deserializer.increase_container_depth();
9538 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9539 deserializer.decrease_container_depth();
9540 return obj;
9541}
9542
9543namespace Acir {
9544
9546{
9547 if (!(lhs.destination == rhs.destination)) {
9548 return false;
9549 }
9550 if (!(lhs.op == rhs.op)) {
9551 return false;
9552 }
9553 if (!(lhs.lhs == rhs.lhs)) {
9554 return false;
9555 }
9556 if (!(lhs.rhs == rhs.rhs)) {
9557 return false;
9558 }
9559 return true;
9560}
9561
9562} // end of namespace Acir
9563
9564template <>
9565template <typename Serializer>
9567 Serializer& serializer)
9568{
9569 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
9570 serde::Serializable<decltype(obj.op)>::serialize(obj.op, serializer);
9571 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
9572 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
9573}
9574
9575template <>
9576template <typename Deserializer>
9578 Deserializer& deserializer)
9579{
9581 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
9582 obj.op = serde::Deserializable<decltype(obj.op)>::deserialize(deserializer);
9583 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
9584 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
9585 return obj;
9586}
9587
9588namespace Acir {
9589
9591{
9592 if (!(lhs.destination == rhs.destination)) {
9593 return false;
9594 }
9595 if (!(lhs.op == rhs.op)) {
9596 return false;
9597 }
9598 if (!(lhs.bit_size == rhs.bit_size)) {
9599 return false;
9600 }
9601 if (!(lhs.lhs == rhs.lhs)) {
9602 return false;
9603 }
9604 if (!(lhs.rhs == rhs.rhs)) {
9605 return false;
9606 }
9607 return true;
9608}
9609
9610} // end of namespace Acir
9611
9612template <>
9613template <typename Serializer>
9615 Serializer& serializer)
9616{
9617 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
9618 serde::Serializable<decltype(obj.op)>::serialize(obj.op, serializer);
9619 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
9620 serde::Serializable<decltype(obj.lhs)>::serialize(obj.lhs, serializer);
9621 serde::Serializable<decltype(obj.rhs)>::serialize(obj.rhs, serializer);
9622}
9623
9624template <>
9625template <typename Deserializer>
9627 Deserializer& deserializer)
9628{
9630 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
9631 obj.op = serde::Deserializable<decltype(obj.op)>::deserialize(deserializer);
9632 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
9633 obj.lhs = serde::Deserializable<decltype(obj.lhs)>::deserialize(deserializer);
9634 obj.rhs = serde::Deserializable<decltype(obj.rhs)>::deserialize(deserializer);
9635 return obj;
9636}
9637
9638namespace Acir {
9639
9640inline bool operator==(const BrilligOpcode::Not& lhs, const BrilligOpcode::Not& rhs)
9641{
9642 if (!(lhs.destination == rhs.destination)) {
9643 return false;
9644 }
9645 if (!(lhs.source == rhs.source)) {
9646 return false;
9647 }
9648 if (!(lhs.bit_size == rhs.bit_size)) {
9649 return false;
9650 }
9651 return true;
9652}
9653
9654} // end of namespace Acir
9655
9656template <>
9657template <typename Serializer>
9659 Serializer& serializer)
9660{
9661 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
9662 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
9663 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
9664}
9665
9666template <>
9667template <typename Deserializer>
9669{
9671 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
9672 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
9673 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
9674 return obj;
9675}
9676
9677namespace Acir {
9678
9679inline bool operator==(const BrilligOpcode::Cast& lhs, const BrilligOpcode::Cast& rhs)
9680{
9681 if (!(lhs.destination == rhs.destination)) {
9682 return false;
9683 }
9684 if (!(lhs.source == rhs.source)) {
9685 return false;
9686 }
9687 if (!(lhs.bit_size == rhs.bit_size)) {
9688 return false;
9689 }
9690 return true;
9691}
9692
9693} // end of namespace Acir
9694
9695template <>
9696template <typename Serializer>
9698 Serializer& serializer)
9699{
9700 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
9701 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
9702 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
9703}
9704
9705template <>
9706template <typename Deserializer>
9708{
9710 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
9711 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
9712 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
9713 return obj;
9714}
9715
9716namespace Acir {
9717
9718inline bool operator==(const BrilligOpcode::JumpIf& lhs, const BrilligOpcode::JumpIf& rhs)
9719{
9720 if (!(lhs.condition == rhs.condition)) {
9721 return false;
9722 }
9723 if (!(lhs.location == rhs.location)) {
9724 return false;
9725 }
9726 return true;
9727}
9728
9729} // end of namespace Acir
9730
9731template <>
9732template <typename Serializer>
9734 Serializer& serializer)
9735{
9736 serde::Serializable<decltype(obj.condition)>::serialize(obj.condition, serializer);
9737 serde::Serializable<decltype(obj.location)>::serialize(obj.location, serializer);
9738}
9739
9740template <>
9741template <typename Deserializer>
9743{
9745 obj.condition = serde::Deserializable<decltype(obj.condition)>::deserialize(deserializer);
9746 obj.location = serde::Deserializable<decltype(obj.location)>::deserialize(deserializer);
9747 return obj;
9748}
9749
9750namespace Acir {
9751
9752inline bool operator==(const BrilligOpcode::Jump& lhs, const BrilligOpcode::Jump& rhs)
9753{
9754 if (!(lhs.location == rhs.location)) {
9755 return false;
9756 }
9757 return true;
9758}
9759
9760} // end of namespace Acir
9761
9762template <>
9763template <typename Serializer>
9765 Serializer& serializer)
9766{
9767 serde::Serializable<decltype(obj.location)>::serialize(obj.location, serializer);
9768}
9769
9770template <>
9771template <typename Deserializer>
9773{
9775 obj.location = serde::Deserializable<decltype(obj.location)>::deserialize(deserializer);
9776 return obj;
9777}
9778
9779namespace Acir {
9780
9782{
9783 if (!(lhs.destination_address == rhs.destination_address)) {
9784 return false;
9785 }
9786 if (!(lhs.size_address == rhs.size_address)) {
9787 return false;
9788 }
9789 if (!(lhs.offset_address == rhs.offset_address)) {
9790 return false;
9791 }
9792 return true;
9793}
9794
9795} // end of namespace Acir
9796
9797template <>
9798template <typename Serializer>
9800 Serializer& serializer)
9801{
9802 serde::Serializable<decltype(obj.destination_address)>::serialize(obj.destination_address, serializer);
9803 serde::Serializable<decltype(obj.size_address)>::serialize(obj.size_address, serializer);
9804 serde::Serializable<decltype(obj.offset_address)>::serialize(obj.offset_address, serializer);
9805}
9806
9807template <>
9808template <typename Deserializer>
9810 Deserializer& deserializer)
9811{
9813 obj.destination_address = serde::Deserializable<decltype(obj.destination_address)>::deserialize(deserializer);
9814 obj.size_address = serde::Deserializable<decltype(obj.size_address)>::deserialize(deserializer);
9815 obj.offset_address = serde::Deserializable<decltype(obj.offset_address)>::deserialize(deserializer);
9816 return obj;
9817}
9818
9819namespace Acir {
9820
9821inline bool operator==(const BrilligOpcode::Call& lhs, const BrilligOpcode::Call& rhs)
9822{
9823 if (!(lhs.location == rhs.location)) {
9824 return false;
9825 }
9826 return true;
9827}
9828
9829} // end of namespace Acir
9830
9831template <>
9832template <typename Serializer>
9834 Serializer& serializer)
9835{
9836 serde::Serializable<decltype(obj.location)>::serialize(obj.location, serializer);
9837}
9838
9839template <>
9840template <typename Deserializer>
9842{
9844 obj.location = serde::Deserializable<decltype(obj.location)>::deserialize(deserializer);
9845 return obj;
9846}
9847
9848namespace Acir {
9849
9850inline bool operator==(const BrilligOpcode::Const& lhs, const BrilligOpcode::Const& rhs)
9851{
9852 if (!(lhs.destination == rhs.destination)) {
9853 return false;
9854 }
9855 if (!(lhs.bit_size == rhs.bit_size)) {
9856 return false;
9857 }
9858 if (!(lhs.value == rhs.value)) {
9859 return false;
9860 }
9861 return true;
9862}
9863
9864} // end of namespace Acir
9865
9866template <>
9867template <typename Serializer>
9869 Serializer& serializer)
9870{
9871 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
9872 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
9873 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9874}
9875
9876template <>
9877template <typename Deserializer>
9879{
9881 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
9882 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
9883 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9884 return obj;
9885}
9886
9887namespace Acir {
9888
9890{
9891 if (!(lhs.destination_pointer == rhs.destination_pointer)) {
9892 return false;
9893 }
9894 if (!(lhs.bit_size == rhs.bit_size)) {
9895 return false;
9896 }
9897 if (!(lhs.value == rhs.value)) {
9898 return false;
9899 }
9900 return true;
9901}
9902
9903} // end of namespace Acir
9904
9905template <>
9906template <typename Serializer>
9908 Serializer& serializer)
9909{
9910 serde::Serializable<decltype(obj.destination_pointer)>::serialize(obj.destination_pointer, serializer);
9911 serde::Serializable<decltype(obj.bit_size)>::serialize(obj.bit_size, serializer);
9912 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
9913}
9914
9915template <>
9916template <typename Deserializer>
9918 Deserializer& deserializer)
9919{
9921 obj.destination_pointer = serde::Deserializable<decltype(obj.destination_pointer)>::deserialize(deserializer);
9922 obj.bit_size = serde::Deserializable<decltype(obj.bit_size)>::deserialize(deserializer);
9923 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
9924 return obj;
9925}
9926
9927namespace Acir {
9928
9929inline bool operator==(const BrilligOpcode::Return& lhs, const BrilligOpcode::Return& rhs)
9930{
9931 return true;
9932}
9933
9934} // end of namespace Acir
9935
9936template <>
9937template <typename Serializer>
9941
9942template <>
9943template <typename Deserializer>
9949
9950namespace Acir {
9951
9953{
9954 if (!(lhs.function == rhs.function)) {
9955 return false;
9956 }
9957 if (!(lhs.destinations == rhs.destinations)) {
9958 return false;
9959 }
9960 if (!(lhs.destination_value_types == rhs.destination_value_types)) {
9961 return false;
9962 }
9963 if (!(lhs.inputs == rhs.inputs)) {
9964 return false;
9965 }
9966 if (!(lhs.input_value_types == rhs.input_value_types)) {
9967 return false;
9968 }
9969 return true;
9970}
9971
9972} // end of namespace Acir
9973
9974template <>
9975template <typename Serializer>
9977 Serializer& serializer)
9978{
9979 serde::Serializable<decltype(obj.function)>::serialize(obj.function, serializer);
9980 serde::Serializable<decltype(obj.destinations)>::serialize(obj.destinations, serializer);
9981 serde::Serializable<decltype(obj.destination_value_types)>::serialize(obj.destination_value_types, serializer);
9982 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
9983 serde::Serializable<decltype(obj.input_value_types)>::serialize(obj.input_value_types, serializer);
9984}
9985
9986template <>
9987template <typename Deserializer>
9989 Deserializer& deserializer)
9990{
9992 obj.function = serde::Deserializable<decltype(obj.function)>::deserialize(deserializer);
9993 obj.destinations = serde::Deserializable<decltype(obj.destinations)>::deserialize(deserializer);
9995 serde::Deserializable<decltype(obj.destination_value_types)>::deserialize(deserializer);
9996 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
9997 obj.input_value_types = serde::Deserializable<decltype(obj.input_value_types)>::deserialize(deserializer);
9998 return obj;
9999}
10000
10001namespace Acir {
10002
10003inline bool operator==(const BrilligOpcode::Mov& lhs, const BrilligOpcode::Mov& rhs)
10004{
10005 if (!(lhs.destination == rhs.destination)) {
10006 return false;
10007 }
10008 if (!(lhs.source == rhs.source)) {
10009 return false;
10010 }
10011 return true;
10012}
10013
10014} // end of namespace Acir
10015
10016template <>
10017template <typename Serializer>
10019 Serializer& serializer)
10020{
10021 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
10022 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
10023}
10024
10025template <>
10026template <typename Deserializer>
10028{
10030 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
10031 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
10032 return obj;
10033}
10034
10035namespace Acir {
10036
10038{
10039 if (!(lhs.destination == rhs.destination)) {
10040 return false;
10041 }
10042 if (!(lhs.source_a == rhs.source_a)) {
10043 return false;
10044 }
10045 if (!(lhs.source_b == rhs.source_b)) {
10046 return false;
10047 }
10048 if (!(lhs.condition == rhs.condition)) {
10049 return false;
10050 }
10051 return true;
10052}
10053
10054} // end of namespace Acir
10055
10056template <>
10057template <typename Serializer>
10059 Serializer& serializer)
10060{
10061 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
10062 serde::Serializable<decltype(obj.source_a)>::serialize(obj.source_a, serializer);
10063 serde::Serializable<decltype(obj.source_b)>::serialize(obj.source_b, serializer);
10064 serde::Serializable<decltype(obj.condition)>::serialize(obj.condition, serializer);
10065}
10066
10067template <>
10068template <typename Deserializer>
10070 Deserializer& deserializer)
10071{
10073 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
10074 obj.source_a = serde::Deserializable<decltype(obj.source_a)>::deserialize(deserializer);
10075 obj.source_b = serde::Deserializable<decltype(obj.source_b)>::deserialize(deserializer);
10076 obj.condition = serde::Deserializable<decltype(obj.condition)>::deserialize(deserializer);
10077 return obj;
10078}
10079
10080namespace Acir {
10081
10082inline bool operator==(const BrilligOpcode::Load& lhs, const BrilligOpcode::Load& rhs)
10083{
10084 if (!(lhs.destination == rhs.destination)) {
10085 return false;
10086 }
10087 if (!(lhs.source_pointer == rhs.source_pointer)) {
10088 return false;
10089 }
10090 return true;
10091}
10092
10093} // end of namespace Acir
10094
10095template <>
10096template <typename Serializer>
10098 Serializer& serializer)
10099{
10100 serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
10101 serde::Serializable<decltype(obj.source_pointer)>::serialize(obj.source_pointer, serializer);
10102}
10103
10104template <>
10105template <typename Deserializer>
10107{
10109 obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
10110 obj.source_pointer = serde::Deserializable<decltype(obj.source_pointer)>::deserialize(deserializer);
10111 return obj;
10112}
10113
10114namespace Acir {
10115
10116inline bool operator==(const BrilligOpcode::Store& lhs, const BrilligOpcode::Store& rhs)
10117{
10118 if (!(lhs.destination_pointer == rhs.destination_pointer)) {
10119 return false;
10120 }
10121 if (!(lhs.source == rhs.source)) {
10122 return false;
10123 }
10124 return true;
10125}
10126
10127} // end of namespace Acir
10128
10129template <>
10130template <typename Serializer>
10132 Serializer& serializer)
10133{
10134 serde::Serializable<decltype(obj.destination_pointer)>::serialize(obj.destination_pointer, serializer);
10135 serde::Serializable<decltype(obj.source)>::serialize(obj.source, serializer);
10136}
10137
10138template <>
10139template <typename Deserializer>
10141{
10143 obj.destination_pointer = serde::Deserializable<decltype(obj.destination_pointer)>::deserialize(deserializer);
10144 obj.source = serde::Deserializable<decltype(obj.source)>::deserialize(deserializer);
10145 return obj;
10146}
10147
10148namespace Acir {
10149
10151{
10152 if (!(lhs.value == rhs.value)) {
10153 return false;
10154 }
10155 return true;
10156}
10157
10158} // end of namespace Acir
10159
10160template <>
10161template <typename Serializer>
10163 Serializer& serializer)
10164{
10165 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10166}
10167
10168template <>
10169template <typename Deserializer>
10171 Deserializer& deserializer)
10172{
10174 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10175 return obj;
10176}
10177
10178namespace Acir {
10179
10180inline bool operator==(const BrilligOpcode::Trap& lhs, const BrilligOpcode::Trap& rhs)
10181{
10182 if (!(lhs.revert_data == rhs.revert_data)) {
10183 return false;
10184 }
10185 return true;
10186}
10187
10188} // end of namespace Acir
10189
10190template <>
10191template <typename Serializer>
10193 Serializer& serializer)
10194{
10195 serde::Serializable<decltype(obj.revert_data)>::serialize(obj.revert_data, serializer);
10196}
10197
10198template <>
10199template <typename Deserializer>
10201{
10203 obj.revert_data = serde::Deserializable<decltype(obj.revert_data)>::deserialize(deserializer);
10204 return obj;
10205}
10206
10207namespace Acir {
10208
10209inline bool operator==(const BrilligOpcode::Stop& lhs, const BrilligOpcode::Stop& rhs)
10210{
10211 if (!(lhs.return_data == rhs.return_data)) {
10212 return false;
10213 }
10214 return true;
10215}
10216
10217} // end of namespace Acir
10218
10219template <>
10220template <typename Serializer>
10222 Serializer& serializer)
10223{
10224 serde::Serializable<decltype(obj.return_data)>::serialize(obj.return_data, serializer);
10225}
10226
10227template <>
10228template <typename Deserializer>
10230{
10232 obj.return_data = serde::Deserializable<decltype(obj.return_data)>::deserialize(deserializer);
10233 return obj;
10234}
10235
10236namespace Acir {
10237
10238inline bool operator==(const BrilligOutputs& lhs, const BrilligOutputs& rhs)
10239{
10240 if (!(lhs.value == rhs.value)) {
10241 return false;
10242 }
10243 return true;
10244}
10245
10246} // end of namespace Acir
10247
10248template <>
10249template <typename Serializer>
10251{
10252 serializer.increase_container_depth();
10253 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10254 serializer.decrease_container_depth();
10255}
10256
10257template <>
10258template <typename Deserializer>
10260{
10261 deserializer.increase_container_depth();
10263 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10264 deserializer.decrease_container_depth();
10265 return obj;
10266}
10267
10268namespace Acir {
10269
10271{
10272 if (!(lhs.value == rhs.value)) {
10273 return false;
10274 }
10275 return true;
10276}
10277
10278} // end of namespace Acir
10279
10280template <>
10281template <typename Serializer>
10283 Serializer& serializer)
10284{
10285 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10286}
10287
10288template <>
10289template <typename Deserializer>
10291 Deserializer& deserializer)
10292{
10294 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10295 return obj;
10296}
10297
10298namespace Acir {
10299
10300inline bool operator==(const BrilligOutputs::Array& lhs, const BrilligOutputs::Array& rhs)
10301{
10302 if (!(lhs.value == rhs.value)) {
10303 return false;
10304 }
10305 return true;
10306}
10307
10308} // end of namespace Acir
10309
10310template <>
10311template <typename Serializer>
10313 Serializer& serializer)
10314{
10315 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10316}
10317
10318template <>
10319template <typename Deserializer>
10321{
10323 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10324 return obj;
10325}
10326
10327namespace Acir {
10328
10329inline bool operator==(const Circuit& lhs, const Circuit& rhs)
10330{
10331 if (!(lhs.function_name == rhs.function_name)) {
10332 return false;
10333 }
10334 if (!(lhs.opcodes == rhs.opcodes)) {
10335 return false;
10336 }
10337 if (!(lhs.private_parameters == rhs.private_parameters)) {
10338 return false;
10339 }
10340 if (!(lhs.public_parameters == rhs.public_parameters)) {
10341 return false;
10342 }
10343 if (!(lhs.return_values == rhs.return_values)) {
10344 return false;
10345 }
10346 if (!(lhs.assert_messages == rhs.assert_messages)) {
10347 return false;
10348 }
10349 return true;
10350}
10351
10352} // end of namespace Acir
10353
10354template <>
10355template <typename Serializer>
10356void serde::Serializable<Acir::Circuit>::serialize(const Acir::Circuit& obj, Serializer& serializer)
10357{
10358 serializer.increase_container_depth();
10359 serde::Serializable<decltype(obj.function_name)>::serialize(obj.function_name, serializer);
10360 serde::Serializable<decltype(obj.opcodes)>::serialize(obj.opcodes, serializer);
10361 serde::Serializable<decltype(obj.private_parameters)>::serialize(obj.private_parameters, serializer);
10362 serde::Serializable<decltype(obj.public_parameters)>::serialize(obj.public_parameters, serializer);
10363 serde::Serializable<decltype(obj.return_values)>::serialize(obj.return_values, serializer);
10364 serde::Serializable<decltype(obj.assert_messages)>::serialize(obj.assert_messages, serializer);
10365 serializer.decrease_container_depth();
10366}
10367
10368template <>
10369template <typename Deserializer>
10371{
10372 deserializer.increase_container_depth();
10373 Acir::Circuit obj;
10374 obj.function_name = serde::Deserializable<decltype(obj.function_name)>::deserialize(deserializer);
10375 obj.opcodes = serde::Deserializable<decltype(obj.opcodes)>::deserialize(deserializer);
10376 obj.private_parameters = serde::Deserializable<decltype(obj.private_parameters)>::deserialize(deserializer);
10377 obj.public_parameters = serde::Deserializable<decltype(obj.public_parameters)>::deserialize(deserializer);
10378 obj.return_values = serde::Deserializable<decltype(obj.return_values)>::deserialize(deserializer);
10379 obj.assert_messages = serde::Deserializable<decltype(obj.assert_messages)>::deserialize(deserializer);
10380 deserializer.decrease_container_depth();
10381 return obj;
10382}
10383
10384namespace Acir {
10385
10386inline bool operator==(const Expression& lhs, const Expression& rhs)
10387{
10388 if (!(lhs.mul_terms == rhs.mul_terms)) {
10389 return false;
10390 }
10391 if (!(lhs.linear_combinations == rhs.linear_combinations)) {
10392 return false;
10393 }
10394 if (!(lhs.q_c == rhs.q_c)) {
10395 return false;
10396 }
10397 return true;
10398}
10399
10400} // end of namespace Acir
10401
10402template <>
10403template <typename Serializer>
10405{
10406 serializer.increase_container_depth();
10407 serde::Serializable<decltype(obj.mul_terms)>::serialize(obj.mul_terms, serializer);
10408 serde::Serializable<decltype(obj.linear_combinations)>::serialize(obj.linear_combinations, serializer);
10409 serde::Serializable<decltype(obj.q_c)>::serialize(obj.q_c, serializer);
10410 serializer.decrease_container_depth();
10411}
10412
10413template <>
10414template <typename Deserializer>
10416{
10417 deserializer.increase_container_depth();
10418 Acir::Expression obj;
10419 obj.mul_terms = serde::Deserializable<decltype(obj.mul_terms)>::deserialize(deserializer);
10420 obj.linear_combinations = serde::Deserializable<decltype(obj.linear_combinations)>::deserialize(deserializer);
10421 obj.q_c = serde::Deserializable<decltype(obj.q_c)>::deserialize(deserializer);
10422 deserializer.decrease_container_depth();
10423 return obj;
10424}
10425
10426namespace Acir {
10427
10428inline bool operator==(const ExpressionOrMemory& lhs, const ExpressionOrMemory& rhs)
10429{
10430 if (!(lhs.value == rhs.value)) {
10431 return false;
10432 }
10433 return true;
10434}
10435
10436} // end of namespace Acir
10437
10438template <>
10439template <typename Serializer>
10441 Serializer& serializer)
10442{
10443 serializer.increase_container_depth();
10444 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10445 serializer.decrease_container_depth();
10446}
10447
10448template <>
10449template <typename Deserializer>
10451{
10452 deserializer.increase_container_depth();
10454 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10455 deserializer.decrease_container_depth();
10456 return obj;
10457}
10458
10459namespace Acir {
10460
10462{
10463 if (!(lhs.value == rhs.value)) {
10464 return false;
10465 }
10466 return true;
10467}
10468
10469} // end of namespace Acir
10470
10471template <>
10472template <typename Serializer>
10474 const Acir::ExpressionOrMemory::Expression& obj, Serializer& serializer)
10475{
10476 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10477}
10478
10479template <>
10480template <typename Deserializer>
10482 Deserializer& deserializer)
10483{
10485 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10486 return obj;
10487}
10488
10489namespace Acir {
10490
10492{
10493 if (!(lhs.value == rhs.value)) {
10494 return false;
10495 }
10496 return true;
10497}
10498
10499} // end of namespace Acir
10500
10501template <>
10502template <typename Serializer>
10504 Serializer& serializer)
10505{
10506 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10507}
10508
10509template <>
10510template <typename Deserializer>
10512 Deserializer& deserializer)
10513{
10515 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10516 return obj;
10517}
10518
10519namespace Acir {
10520
10521inline bool operator==(const FunctionInput& lhs, const FunctionInput& rhs)
10522{
10523 if (!(lhs.value == rhs.value)) {
10524 return false;
10525 }
10526 return true;
10527}
10528
10529} // end of namespace Acir
10530
10531template <>
10532template <typename Serializer>
10534{
10535 serializer.increase_container_depth();
10536 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10537 serializer.decrease_container_depth();
10538}
10539
10540template <>
10541template <typename Deserializer>
10543{
10544 deserializer.increase_container_depth();
10546 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10547 deserializer.decrease_container_depth();
10548 return obj;
10549}
10550
10551namespace Acir {
10552
10554{
10555 if (!(lhs.value == rhs.value)) {
10556 return false;
10557 }
10558 return true;
10559}
10560
10561} // end of namespace Acir
10562
10563template <>
10564template <typename Serializer>
10566 Serializer& serializer)
10567{
10568 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10569}
10570
10571template <>
10572template <typename Deserializer>
10574 Deserializer& deserializer)
10575{
10577 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10578 return obj;
10579}
10580
10581namespace Acir {
10582
10584{
10585 if (!(lhs.value == rhs.value)) {
10586 return false;
10587 }
10588 return true;
10589}
10590
10591} // end of namespace Acir
10592
10593template <>
10594template <typename Serializer>
10596 Serializer& serializer)
10597{
10598 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10599}
10600
10601template <>
10602template <typename Deserializer>
10604 Deserializer& deserializer)
10605{
10607 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10608 return obj;
10609}
10610
10611namespace Acir {
10612
10613inline bool operator==(const HeapArray& lhs, const HeapArray& rhs)
10614{
10615 if (!(lhs.pointer == rhs.pointer)) {
10616 return false;
10617 }
10618 if (!(lhs.size == rhs.size)) {
10619 return false;
10620 }
10621 return true;
10622}
10623
10624} // end of namespace Acir
10625
10626template <>
10627template <typename Serializer>
10629{
10630 serializer.increase_container_depth();
10631 serde::Serializable<decltype(obj.pointer)>::serialize(obj.pointer, serializer);
10632 serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
10633 serializer.decrease_container_depth();
10634}
10635
10636template <>
10637template <typename Deserializer>
10639{
10640 deserializer.increase_container_depth();
10641 Acir::HeapArray obj;
10642 obj.pointer = serde::Deserializable<decltype(obj.pointer)>::deserialize(deserializer);
10643 obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
10644 deserializer.decrease_container_depth();
10645 return obj;
10646}
10647
10648namespace Acir {
10649
10650inline bool operator==(const HeapValueType& lhs, const HeapValueType& rhs)
10651{
10652 if (!(lhs.value == rhs.value)) {
10653 return false;
10654 }
10655 return true;
10656}
10657
10658} // end of namespace Acir
10659
10660template <>
10661template <typename Serializer>
10663{
10664 serializer.increase_container_depth();
10665 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10666 serializer.decrease_container_depth();
10667}
10668
10669template <>
10670template <typename Deserializer>
10672{
10673 deserializer.increase_container_depth();
10675 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10676 deserializer.decrease_container_depth();
10677 return obj;
10678}
10679
10680namespace Acir {
10681
10682inline bool operator==(const HeapValueType::Simple& lhs, const HeapValueType::Simple& rhs)
10683{
10684 if (!(lhs.value == rhs.value)) {
10685 return false;
10686 }
10687 return true;
10688}
10689
10690} // end of namespace Acir
10691
10692template <>
10693template <typename Serializer>
10695 Serializer& serializer)
10696{
10697 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10698}
10699
10700template <>
10701template <typename Deserializer>
10703{
10705 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10706 return obj;
10707}
10708
10709namespace Acir {
10710
10711inline bool operator==(const HeapValueType::Array& lhs, const HeapValueType::Array& rhs)
10712{
10713 if (!(lhs.value_types == rhs.value_types)) {
10714 return false;
10715 }
10716 if (!(lhs.size == rhs.size)) {
10717 return false;
10718 }
10719 return true;
10720}
10721
10722} // end of namespace Acir
10723
10724template <>
10725template <typename Serializer>
10727 Serializer& serializer)
10728{
10729 serde::Serializable<decltype(obj.value_types)>::serialize(obj.value_types, serializer);
10730 serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
10731}
10732
10733template <>
10734template <typename Deserializer>
10736{
10738 obj.value_types = serde::Deserializable<decltype(obj.value_types)>::deserialize(deserializer);
10739 obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
10740 return obj;
10741}
10742
10743namespace Acir {
10744
10745inline bool operator==(const HeapValueType::Vector& lhs, const HeapValueType::Vector& rhs)
10746{
10747 if (!(lhs.value_types == rhs.value_types)) {
10748 return false;
10749 }
10750 return true;
10751}
10752
10753} // end of namespace Acir
10754
10755template <>
10756template <typename Serializer>
10758 Serializer& serializer)
10759{
10760 serde::Serializable<decltype(obj.value_types)>::serialize(obj.value_types, serializer);
10761}
10762
10763template <>
10764template <typename Deserializer>
10766{
10768 obj.value_types = serde::Deserializable<decltype(obj.value_types)>::deserialize(deserializer);
10769 return obj;
10770}
10771
10772namespace Acir {
10773
10774inline bool operator==(const HeapVector& lhs, const HeapVector& rhs)
10775{
10776 if (!(lhs.pointer == rhs.pointer)) {
10777 return false;
10778 }
10779 if (!(lhs.size == rhs.size)) {
10780 return false;
10781 }
10782 return true;
10783}
10784
10785} // end of namespace Acir
10786
10787template <>
10788template <typename Serializer>
10790{
10791 serializer.increase_container_depth();
10792 serde::Serializable<decltype(obj.pointer)>::serialize(obj.pointer, serializer);
10793 serde::Serializable<decltype(obj.size)>::serialize(obj.size, serializer);
10794 serializer.decrease_container_depth();
10795}
10796
10797template <>
10798template <typename Deserializer>
10800{
10801 deserializer.increase_container_depth();
10802 Acir::HeapVector obj;
10803 obj.pointer = serde::Deserializable<decltype(obj.pointer)>::deserialize(deserializer);
10804 obj.size = serde::Deserializable<decltype(obj.size)>::deserialize(deserializer);
10805 deserializer.decrease_container_depth();
10806 return obj;
10807}
10808
10809namespace Acir {
10810
10811inline bool operator==(const IntegerBitSize& lhs, const IntegerBitSize& rhs)
10812{
10813 if (!(lhs.value == rhs.value)) {
10814 return false;
10815 }
10816 return true;
10817}
10818
10819} // end of namespace Acir
10820
10821template <>
10822template <typename Serializer>
10824{
10825 serializer.increase_container_depth();
10826 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
10827 serializer.decrease_container_depth();
10828}
10829
10830template <>
10831template <typename Deserializer>
10833{
10834 deserializer.increase_container_depth();
10836 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
10837 deserializer.decrease_container_depth();
10838 return obj;
10839}
10840
10841namespace Acir {
10842
10843inline bool operator==(const IntegerBitSize::U1& lhs, const IntegerBitSize::U1& rhs)
10844{
10845 return true;
10846}
10847
10848} // end of namespace Acir
10849
10850template <>
10851template <typename Serializer>
10853 Serializer& serializer)
10854{}
10855
10856template <>
10857template <typename Deserializer>
10863
10864namespace Acir {
10865
10866inline bool operator==(const IntegerBitSize::U8& lhs, const IntegerBitSize::U8& rhs)
10867{
10868 return true;
10869}
10870
10871} // end of namespace Acir
10872
10873template <>
10874template <typename Serializer>
10876 Serializer& serializer)
10877{}
10878
10879template <>
10880template <typename Deserializer>
10886
10887namespace Acir {
10888
10889inline bool operator==(const IntegerBitSize::U16& lhs, const IntegerBitSize::U16& rhs)
10890{
10891 return true;
10892}
10893
10894} // end of namespace Acir
10895
10896template <>
10897template <typename Serializer>
10899 Serializer& serializer)
10900{}
10901
10902template <>
10903template <typename Deserializer>
10909
10910namespace Acir {
10911
10912inline bool operator==(const IntegerBitSize::U32& lhs, const IntegerBitSize::U32& rhs)
10913{
10914 return true;
10915}
10916
10917} // end of namespace Acir
10918
10919template <>
10920template <typename Serializer>
10922 Serializer& serializer)
10923{}
10924
10925template <>
10926template <typename Deserializer>
10932
10933namespace Acir {
10934
10935inline bool operator==(const IntegerBitSize::U64& lhs, const IntegerBitSize::U64& rhs)
10936{
10937 return true;
10938}
10939
10940} // end of namespace Acir
10941
10942template <>
10943template <typename Serializer>
10945 Serializer& serializer)
10946{}
10947
10948template <>
10949template <typename Deserializer>
10955
10956namespace Acir {
10957
10958inline bool operator==(const IntegerBitSize::U128& lhs, const IntegerBitSize::U128& rhs)
10959{
10960 return true;
10961}
10962
10963} // end of namespace Acir
10964
10965template <>
10966template <typename Serializer>
10970
10971template <>
10972template <typename Deserializer>
10978
10979namespace Acir {
10980
10981inline bool operator==(const MemOp& lhs, const MemOp& rhs)
10982{
10983 if (!(lhs.read == rhs.read)) {
10984 return false;
10985 }
10986 if (!(lhs.index == rhs.index)) {
10987 return false;
10988 }
10989 if (!(lhs.value == rhs.value)) {
10990 return false;
10991 }
10992 return true;
10993}
10994
10995} // end of namespace Acir
10996
10997template <>
10998template <typename Serializer>
10999void serde::Serializable<Acir::MemOp>::serialize(const Acir::MemOp& obj, Serializer& serializer)
11000{
11001 serializer.increase_container_depth();
11002 serde::Serializable<decltype(obj.read)>::serialize(obj.read, serializer);
11003 serde::Serializable<decltype(obj.index)>::serialize(obj.index, serializer);
11004 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11005 serializer.decrease_container_depth();
11006}
11007
11008template <>
11009template <typename Deserializer>
11011{
11012 deserializer.increase_container_depth();
11013 Acir::MemOp obj;
11014 obj.read = serde::Deserializable<decltype(obj.read)>::deserialize(deserializer);
11015 obj.index = serde::Deserializable<decltype(obj.index)>::deserialize(deserializer);
11016 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11017 deserializer.decrease_container_depth();
11018 return obj;
11019}
11020
11021namespace Acir {
11022
11023inline bool operator==(const MemoryAddress& lhs, const MemoryAddress& rhs)
11024{
11025 if (!(lhs.value == rhs.value)) {
11026 return false;
11027 }
11028 return true;
11029}
11030
11031} // end of namespace Acir
11032
11033template <>
11034template <typename Serializer>
11036{
11037 serializer.increase_container_depth();
11038 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11039 serializer.decrease_container_depth();
11040}
11041
11042template <>
11043template <typename Deserializer>
11045{
11046 deserializer.increase_container_depth();
11048 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11049 deserializer.decrease_container_depth();
11050 return obj;
11051}
11052
11053namespace Acir {
11054
11055inline bool operator==(const MemoryAddress::Direct& lhs, const MemoryAddress::Direct& rhs)
11056{
11057 if (!(lhs.value == rhs.value)) {
11058 return false;
11059 }
11060 return true;
11061}
11062
11063} // end of namespace Acir
11064
11065template <>
11066template <typename Serializer>
11068 Serializer& serializer)
11069{
11070 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11071}
11072
11073template <>
11074template <typename Deserializer>
11076{
11078 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11079 return obj;
11080}
11081
11082namespace Acir {
11083
11085{
11086 if (!(lhs.value == rhs.value)) {
11087 return false;
11088 }
11089 return true;
11090}
11091
11092} // end of namespace Acir
11093
11094template <>
11095template <typename Serializer>
11097 Serializer& serializer)
11098{
11099 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11100}
11101
11102template <>
11103template <typename Deserializer>
11105 Deserializer& deserializer)
11106{
11108 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11109 return obj;
11110}
11111
11112namespace Acir {
11113
11114inline bool operator==(const Opcode& lhs, const Opcode& rhs)
11115{
11116 if (!(lhs.value == rhs.value)) {
11117 return false;
11118 }
11119 return true;
11120}
11121
11122} // end of namespace Acir
11123
11124template <>
11125template <typename Serializer>
11126void serde::Serializable<Acir::Opcode>::serialize(const Acir::Opcode& obj, Serializer& serializer)
11127{
11128 serializer.increase_container_depth();
11129 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11130 serializer.decrease_container_depth();
11131}
11132
11133template <>
11134template <typename Deserializer>
11136{
11137 deserializer.increase_container_depth();
11138 Acir::Opcode obj;
11139 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11140 deserializer.decrease_container_depth();
11141 return obj;
11142}
11143
11144namespace Acir {
11145
11146inline bool operator==(const Opcode::AssertZero& lhs, const Opcode::AssertZero& rhs)
11147{
11148 if (!(lhs.value == rhs.value)) {
11149 return false;
11150 }
11151 return true;
11152}
11153
11154} // end of namespace Acir
11155
11156template <>
11157template <typename Serializer>
11159 Serializer& serializer)
11160{
11161 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11162}
11163
11164template <>
11165template <typename Deserializer>
11167{
11169 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11170 return obj;
11171}
11172
11173namespace Acir {
11174
11176{
11177 if (!(lhs.value == rhs.value)) {
11178 return false;
11179 }
11180 return true;
11181}
11182
11183} // end of namespace Acir
11184
11185template <>
11186template <typename Serializer>
11188 Serializer& serializer)
11189{
11190 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11191}
11192
11193template <>
11194template <typename Deserializer>
11196 Deserializer& deserializer)
11197{
11199 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11200 return obj;
11201}
11202
11203namespace Acir {
11204
11205inline bool operator==(const Opcode::MemoryOp& lhs, const Opcode::MemoryOp& rhs)
11206{
11207 if (!(lhs.block_id == rhs.block_id)) {
11208 return false;
11209 }
11210 if (!(lhs.op == rhs.op)) {
11211 return false;
11212 }
11213 return true;
11214}
11215
11216} // end of namespace Acir
11217
11218template <>
11219template <typename Serializer>
11221{
11222 serde::Serializable<decltype(obj.block_id)>::serialize(obj.block_id, serializer);
11223 serde::Serializable<decltype(obj.op)>::serialize(obj.op, serializer);
11224}
11225
11226template <>
11227template <typename Deserializer>
11229{
11231 obj.block_id = serde::Deserializable<decltype(obj.block_id)>::deserialize(deserializer);
11232 obj.op = serde::Deserializable<decltype(obj.op)>::deserialize(deserializer);
11233 return obj;
11234}
11235
11236namespace Acir {
11237
11238inline bool operator==(const Opcode::MemoryInit& lhs, const Opcode::MemoryInit& rhs)
11239{
11240 if (!(lhs.block_id == rhs.block_id)) {
11241 return false;
11242 }
11243 if (!(lhs.init == rhs.init)) {
11244 return false;
11245 }
11246 if (!(lhs.block_type == rhs.block_type)) {
11247 return false;
11248 }
11249 return true;
11250}
11251
11252} // end of namespace Acir
11253
11254template <>
11255template <typename Serializer>
11257 Serializer& serializer)
11258{
11259 serde::Serializable<decltype(obj.block_id)>::serialize(obj.block_id, serializer);
11260 serde::Serializable<decltype(obj.init)>::serialize(obj.init, serializer);
11261 serde::Serializable<decltype(obj.block_type)>::serialize(obj.block_type, serializer);
11262}
11263
11264template <>
11265template <typename Deserializer>
11267{
11269 obj.block_id = serde::Deserializable<decltype(obj.block_id)>::deserialize(deserializer);
11270 obj.init = serde::Deserializable<decltype(obj.init)>::deserialize(deserializer);
11271 obj.block_type = serde::Deserializable<decltype(obj.block_type)>::deserialize(deserializer);
11272 return obj;
11273}
11274
11275namespace Acir {
11276
11277inline bool operator==(const Opcode::BrilligCall& lhs, const Opcode::BrilligCall& rhs)
11278{
11279 if (!(lhs.id == rhs.id)) {
11280 return false;
11281 }
11282 if (!(lhs.inputs == rhs.inputs)) {
11283 return false;
11284 }
11285 if (!(lhs.outputs == rhs.outputs)) {
11286 return false;
11287 }
11288 if (!(lhs.predicate == rhs.predicate)) {
11289 return false;
11290 }
11291 return true;
11292}
11293
11294} // end of namespace Acir
11295
11296template <>
11297template <typename Serializer>
11299 Serializer& serializer)
11300{
11301 serde::Serializable<decltype(obj.id)>::serialize(obj.id, serializer);
11302 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
11303 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
11304 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
11305}
11306
11307template <>
11308template <typename Deserializer>
11310{
11312 obj.id = serde::Deserializable<decltype(obj.id)>::deserialize(deserializer);
11313 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
11314 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
11315 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
11316 return obj;
11317}
11318
11319namespace Acir {
11320
11321inline bool operator==(const Opcode::Call& lhs, const Opcode::Call& rhs)
11322{
11323 if (!(lhs.id == rhs.id)) {
11324 return false;
11325 }
11326 if (!(lhs.inputs == rhs.inputs)) {
11327 return false;
11328 }
11329 if (!(lhs.outputs == rhs.outputs)) {
11330 return false;
11331 }
11332 if (!(lhs.predicate == rhs.predicate)) {
11333 return false;
11334 }
11335 return true;
11336}
11337
11338} // end of namespace Acir
11339
11340template <>
11341template <typename Serializer>
11343{
11344 serde::Serializable<decltype(obj.id)>::serialize(obj.id, serializer);
11345 serde::Serializable<decltype(obj.inputs)>::serialize(obj.inputs, serializer);
11346 serde::Serializable<decltype(obj.outputs)>::serialize(obj.outputs, serializer);
11347 serde::Serializable<decltype(obj.predicate)>::serialize(obj.predicate, serializer);
11348}
11349
11350template <>
11351template <typename Deserializer>
11353{
11355 obj.id = serde::Deserializable<decltype(obj.id)>::deserialize(deserializer);
11356 obj.inputs = serde::Deserializable<decltype(obj.inputs)>::deserialize(deserializer);
11357 obj.outputs = serde::Deserializable<decltype(obj.outputs)>::deserialize(deserializer);
11358 obj.predicate = serde::Deserializable<decltype(obj.predicate)>::deserialize(deserializer);
11359 return obj;
11360}
11361
11362namespace Acir {
11363
11364inline bool operator==(const OpcodeLocation& lhs, const OpcodeLocation& rhs)
11365{
11366 if (!(lhs.value == rhs.value)) {
11367 return false;
11368 }
11369 return true;
11370}
11371
11372} // end of namespace Acir
11373
11374template <>
11375template <typename Serializer>
11377{
11378 serializer.increase_container_depth();
11379 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11380 serializer.decrease_container_depth();
11381}
11382
11383template <>
11384template <typename Deserializer>
11386{
11387 deserializer.increase_container_depth();
11389 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11390 deserializer.decrease_container_depth();
11391 return obj;
11392}
11393
11394namespace Acir {
11395
11396inline bool operator==(const OpcodeLocation::Acir& lhs, const OpcodeLocation::Acir& rhs)
11397{
11398 if (!(lhs.value == rhs.value)) {
11399 return false;
11400 }
11401 return true;
11402}
11403
11404} // end of namespace Acir
11405
11406template <>
11407template <typename Serializer>
11409 Serializer& serializer)
11410{
11411 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11412}
11413
11414template <>
11415template <typename Deserializer>
11417{
11419 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11420 return obj;
11421}
11422
11423namespace Acir {
11424
11426{
11427 if (!(lhs.acir_index == rhs.acir_index)) {
11428 return false;
11429 }
11430 if (!(lhs.brillig_index == rhs.brillig_index)) {
11431 return false;
11432 }
11433 return true;
11434}
11435
11436} // end of namespace Acir
11437
11438template <>
11439template <typename Serializer>
11441 Serializer& serializer)
11442{
11443 serde::Serializable<decltype(obj.acir_index)>::serialize(obj.acir_index, serializer);
11444 serde::Serializable<decltype(obj.brillig_index)>::serialize(obj.brillig_index, serializer);
11445}
11446
11447template <>
11448template <typename Deserializer>
11450 Deserializer& deserializer)
11451{
11453 obj.acir_index = serde::Deserializable<decltype(obj.acir_index)>::deserialize(deserializer);
11454 obj.brillig_index = serde::Deserializable<decltype(obj.brillig_index)>::deserialize(deserializer);
11455 return obj;
11456}
11457
11458namespace Acir {
11459
11460inline bool operator==(const Program& lhs, const Program& rhs)
11461{
11462 if (!(lhs.functions == rhs.functions)) {
11463 return false;
11464 }
11465 if (!(lhs.unconstrained_functions == rhs.unconstrained_functions)) {
11466 return false;
11467 }
11468 return true;
11469}
11470
11471} // end of namespace Acir
11472
11473template <>
11474template <typename Serializer>
11475void serde::Serializable<Acir::Program>::serialize(const Acir::Program& obj, Serializer& serializer)
11476{
11477 serializer.increase_container_depth();
11478 serde::Serializable<decltype(obj.functions)>::serialize(obj.functions, serializer);
11479 serde::Serializable<decltype(obj.unconstrained_functions)>::serialize(obj.unconstrained_functions, serializer);
11480 serializer.decrease_container_depth();
11481}
11482
11483template <>
11484template <typename Deserializer>
11486{
11487 deserializer.increase_container_depth();
11488 Acir::Program obj;
11489 obj.functions = serde::Deserializable<decltype(obj.functions)>::deserialize(deserializer);
11491 serde::Deserializable<decltype(obj.unconstrained_functions)>::deserialize(deserializer);
11492 deserializer.decrease_container_depth();
11493 return obj;
11494}
11495
11496namespace Acir {
11497
11498inline bool operator==(const ProgramWithoutBrillig& lhs, const ProgramWithoutBrillig& rhs)
11499{
11500 if (!(lhs.functions == rhs.functions)) {
11501 return false;
11502 }
11503 if (!(lhs.unconstrained_functions == rhs.unconstrained_functions)) {
11504 return false;
11505 }
11506 return true;
11507}
11508
11509} // end of namespace Acir
11510
11511template <>
11512template <typename Serializer>
11514 Serializer& serializer)
11515{
11516 serializer.increase_container_depth();
11517 serde::Serializable<decltype(obj.functions)>::serialize(obj.functions, serializer);
11518 serde::Serializable<decltype(obj.unconstrained_functions)>::serialize(obj.unconstrained_functions, serializer);
11519 serializer.decrease_container_depth();
11520}
11521
11522template <>
11523template <typename Deserializer>
11525{
11526 deserializer.increase_container_depth();
11528 obj.functions = serde::Deserializable<decltype(obj.functions)>::deserialize(deserializer);
11530 serde::Deserializable<decltype(obj.unconstrained_functions)>::deserialize(deserializer);
11531 deserializer.decrease_container_depth();
11532 return obj;
11533}
11534
11535namespace Acir {
11536
11537inline bool operator==(const PublicInputs& lhs, const PublicInputs& rhs)
11538{
11539 if (!(lhs.value == rhs.value)) {
11540 return false;
11541 }
11542 return true;
11543}
11544
11545} // end of namespace Acir
11546
11547template <>
11548template <typename Serializer>
11550{
11551 serializer.increase_container_depth();
11552 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11553 serializer.decrease_container_depth();
11554}
11555
11556template <>
11557template <typename Deserializer>
11559{
11560 deserializer.increase_container_depth();
11562 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11563 deserializer.decrease_container_depth();
11564 return obj;
11565}
11566
11567namespace Acir {
11568
11569inline bool operator==(const SemanticLength& lhs, const SemanticLength& rhs)
11570{
11571 if (!(lhs.value == rhs.value)) {
11572 return false;
11573 }
11574 return true;
11575}
11576
11577} // end of namespace Acir
11578
11579template <>
11580template <typename Serializer>
11582{
11583 serializer.increase_container_depth();
11584 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11585 serializer.decrease_container_depth();
11586}
11587
11588template <>
11589template <typename Deserializer>
11591{
11592 deserializer.increase_container_depth();
11594 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11595 deserializer.decrease_container_depth();
11596 return obj;
11597}
11598
11599namespace Acir {
11600
11601inline bool operator==(const SemiFlattenedLength& lhs, const SemiFlattenedLength& rhs)
11602{
11603 if (!(lhs.value == rhs.value)) {
11604 return false;
11605 }
11606 return true;
11607}
11608
11609} // end of namespace Acir
11610
11611template <>
11612template <typename Serializer>
11614 Serializer& serializer)
11615{
11616 serializer.increase_container_depth();
11617 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11618 serializer.decrease_container_depth();
11619}
11620
11621template <>
11622template <typename Deserializer>
11624{
11625 deserializer.increase_container_depth();
11627 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11628 deserializer.decrease_container_depth();
11629 return obj;
11630}
11631
11632namespace Acir {
11633
11634inline bool operator==(const ValueOrArray& lhs, const ValueOrArray& rhs)
11635{
11636 if (!(lhs.value == rhs.value)) {
11637 return false;
11638 }
11639 return true;
11640}
11641
11642} // end of namespace Acir
11643
11644template <>
11645template <typename Serializer>
11647{
11648 serializer.increase_container_depth();
11649 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11650 serializer.decrease_container_depth();
11651}
11652
11653template <>
11654template <typename Deserializer>
11656{
11657 deserializer.increase_container_depth();
11659 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11660 deserializer.decrease_container_depth();
11661 return obj;
11662}
11663
11664namespace Acir {
11665
11667{
11668 if (!(lhs.value == rhs.value)) {
11669 return false;
11670 }
11671 return true;
11672}
11673
11674} // end of namespace Acir
11675
11676template <>
11677template <typename Serializer>
11679 Serializer& serializer)
11680{
11681 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11682}
11683
11684template <>
11685template <typename Deserializer>
11687 Deserializer& deserializer)
11688{
11690 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11691 return obj;
11692}
11693
11694namespace Acir {
11695
11697{
11698 if (!(lhs.value == rhs.value)) {
11699 return false;
11700 }
11701 return true;
11702}
11703
11704} // end of namespace Acir
11705
11706template <>
11707template <typename Serializer>
11709 Serializer& serializer)
11710{
11711 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11712}
11713
11714template <>
11715template <typename Deserializer>
11717 Deserializer& deserializer)
11718{
11720 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11721 return obj;
11722}
11723
11724namespace Acir {
11725
11727{
11728 if (!(lhs.value == rhs.value)) {
11729 return false;
11730 }
11731 return true;
11732}
11733
11734} // end of namespace Acir
11735
11736template <>
11737template <typename Serializer>
11739 Serializer& serializer)
11740{
11741 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11742}
11743
11744template <>
11745template <typename Deserializer>
11747 Deserializer& deserializer)
11748{
11750 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11751 return obj;
11752}
11753
11754namespace Acir {
11755
11756inline bool operator==(const Witness& lhs, const Witness& rhs)
11757{
11758 if (!(lhs.value == rhs.value)) {
11759 return false;
11760 }
11761 return true;
11762}
11763
11764} // end of namespace Acir
11765
11766template <>
11767template <typename Serializer>
11768void serde::Serializable<Acir::Witness>::serialize(const Acir::Witness& obj, Serializer& serializer)
11769{
11770 serializer.increase_container_depth();
11771 serde::Serializable<decltype(obj.value)>::serialize(obj.value, serializer);
11772 serializer.decrease_container_depth();
11773}
11774
11775template <>
11776template <typename Deserializer>
11778{
11779 deserializer.increase_container_depth();
11780 Acir::Witness obj;
11781 obj.value = serde::Deserializable<decltype(obj.value)>::deserialize(deserializer);
11782 deserializer.decrease_container_depth();
11783 return obj;
11784}
Serves as a key-value node store for merkle trees. Caches all changes in memory before persisting the...
Definition acir.hpp:13
bool operator==(const AssertionPayload &lhs, const AssertionPayload &rhs)
Definition acir.hpp:7449
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:6975
std::vector< Acir::ExpressionOrMemory > payload
Definition acir.hpp:6976
friend bool operator==(const AssertionPayload &, const AssertionPayload &)
Definition acir.hpp:7449
void msgpack_pack(auto &packer) const
Definition acir.hpp:6980
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6987
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:159
void msgpack_pack(auto &packer) const
Definition acir.hpp:158
friend bool operator==(const Add &, const Add &)
Definition acir.hpp:7518
void msgpack_pack(auto &packer) const
Definition acir.hpp:179
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:180
friend bool operator==(const Div &, const Div &)
Definition acir.hpp:7587
void msgpack_pack(auto &packer) const
Definition acir.hpp:193
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:194
friend bool operator==(const Equals &, const Equals &)
Definition acir.hpp:7634
friend bool operator==(const IntegerDiv &, const IntegerDiv &)
Definition acir.hpp:7610
void msgpack_pack(auto &packer) const
Definition acir.hpp:186
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:187
friend bool operator==(const LessThanEquals &, const LessThanEquals &)
Definition acir.hpp:7681
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:208
void msgpack_pack(auto &packer) const
Definition acir.hpp:207
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:201
void msgpack_pack(auto &packer) const
Definition acir.hpp:200
friend bool operator==(const LessThan &, const LessThan &)
Definition acir.hpp:7657
void msgpack_pack(auto &packer) const
Definition acir.hpp:172
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:173
friend bool operator==(const Mul &, const Mul &)
Definition acir.hpp:7564
void msgpack_pack(auto &packer) const
Definition acir.hpp:165
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:166
friend bool operator==(const Sub &, const Sub &)
Definition acir.hpp:7541
std::variant< Add, Sub, Mul, Div, IntegerDiv, Equals, LessThan, LessThanEquals > value
Definition acir.hpp:211
void msgpack_pack(auto &packer) const
Definition acir.hpp:215
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:269
friend bool operator==(const BinaryFieldOp &, const BinaryFieldOp &)
Definition acir.hpp:7486
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:385
friend bool operator==(const Add &, const Add &)
Definition acir.hpp:7737
void msgpack_pack(auto &packer) const
Definition acir.hpp:384
void msgpack_pack(auto &packer) const
Definition acir.hpp:433
friend bool operator==(const And &, const And &)
Definition acir.hpp:7895
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:434
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:406
friend bool operator==(const Div &, const Div &)
Definition acir.hpp:7803
void msgpack_pack(auto &packer) const
Definition acir.hpp:405
void msgpack_pack(auto &packer) const
Definition acir.hpp:412
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:413
friend bool operator==(const Equals &, const Equals &)
Definition acir.hpp:7825
friend bool operator==(const LessThanEquals &, const LessThanEquals &)
Definition acir.hpp:7871
void msgpack_pack(auto &packer) const
Definition acir.hpp:426
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:427
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:420
friend bool operator==(const LessThan &, const LessThan &)
Definition acir.hpp:7848
void msgpack_pack(auto &packer) const
Definition acir.hpp:419
void msgpack_pack(auto &packer) const
Definition acir.hpp:398
friend bool operator==(const Mul &, const Mul &)
Definition acir.hpp:7781
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:399
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:441
void msgpack_pack(auto &packer) const
Definition acir.hpp:440
friend bool operator==(const Or &, const Or &)
Definition acir.hpp:7917
friend bool operator==(const Shl &, const Shl &)
Definition acir.hpp:7961
void msgpack_pack(auto &packer) const
Definition acir.hpp:454
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:455
void msgpack_pack(auto &packer) const
Definition acir.hpp:461
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:462
friend bool operator==(const Shr &, const Shr &)
Definition acir.hpp:7983
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:392
void msgpack_pack(auto &packer) const
Definition acir.hpp:391
friend bool operator==(const Sub &, const Sub &)
Definition acir.hpp:7759
friend bool operator==(const Xor &, const Xor &)
Definition acir.hpp:7939
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:448
void msgpack_pack(auto &packer) const
Definition acir.hpp:447
void msgpack_pack(auto &packer) const
Definition acir.hpp:469
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:539
std::variant< Add, Sub, Mul, Div, Equals, LessThan, LessThanEquals, And, Or, Xor, Shl, Shr > value
Definition acir.hpp:465
friend bool operator==(const BinaryIntOp &, const BinaryIntOp &)
Definition acir.hpp:7705
friend bool operator==(const Field &, const Field &)
Definition acir.hpp:8037
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:875
void msgpack_pack(auto &packer) const
Definition acir.hpp:874
Acir::IntegerBitSize value
Definition acir.hpp:879
friend bool operator==(const Integer &, const Integer &)
Definition acir.hpp:8059
void msgpack_pack(auto &packer) const
Definition acir.hpp:883
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:885
std::variant< Field, Integer > value
Definition acir.hpp:896
friend bool operator==(const BitSize &, const BitSize &)
Definition acir.hpp:8005
void msgpack_pack(auto &packer) const
Definition acir.hpp:900
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:930
void msgpack_pack(auto &packer) const
Definition acir.hpp:4420
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > key
Definition acir.hpp:4415
std::vector< Acir::Witness > outputs
Definition acir.hpp:4416
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:4413
friend bool operator==(const AES128Encrypt &, const AES128Encrypt &)
Definition acir.hpp:8119
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4429
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > iv
Definition acir.hpp:4414
friend bool operator==(const AND &, const AND &)
Definition acir.hpp:8164
Acir::FunctionInput lhs
Definition acir.hpp:4475
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4491
Acir::FunctionInput rhs
Definition acir.hpp:4476
void msgpack_pack(auto &packer) const
Definition acir.hpp:4482
std::shared_ptr< std::array< Acir::Witness, 32 > > outputs
Definition acir.hpp:4648
void msgpack_pack(auto &packer) const
Definition acir.hpp:4652
friend bool operator==(const Blake2s &, const Blake2s &)
Definition acir.hpp:8287
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:4647
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4659
void msgpack_pack(auto &packer) const
Definition acir.hpp:4700
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4707
std::shared_ptr< std::array< Acir::Witness, 32 > > outputs
Definition acir.hpp:4696
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:4695
friend bool operator==(const Blake3 &, const Blake3 &)
Definition acir.hpp:8322
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:4743
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > hashed_message
Definition acir.hpp:4746
void msgpack_pack(auto &packer) const
Definition acir.hpp:4752
friend bool operator==(const EcdsaSecp256k1 &, const EcdsaSecp256k1 &)
Definition acir.hpp:8357
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_y
Definition acir.hpp:4744
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4763
std::shared_ptr< std::array< Acir::FunctionInput, 64 > > signature
Definition acir.hpp:4745
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:4819
friend bool operator==(const EcdsaSecp256r1 &, const EcdsaSecp256r1 &)
Definition acir.hpp:8412
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4839
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > hashed_message
Definition acir.hpp:4822
void msgpack_pack(auto &packer) const
Definition acir.hpp:4828
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_y
Definition acir.hpp:4820
std::shared_ptr< std::array< Acir::FunctionInput, 64 > > signature
Definition acir.hpp:4821
std::shared_ptr< std::array< Acir::Witness, 2 > > outputs
Definition acir.hpp:4960
std::shared_ptr< std::array< Acir::FunctionInput, 2 > > input1
Definition acir.hpp:4957
friend bool operator==(const EmbeddedCurveAdd &, const EmbeddedCurveAdd &)
Definition acir.hpp:8512
void msgpack_pack(auto &packer) const
Definition acir.hpp:4964
std::shared_ptr< std::array< Acir::FunctionInput, 2 > > input2
Definition acir.hpp:4958
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4973
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
Definition acir.hpp:5019
friend bool operator==(const Keccakf1600 &, const Keccakf1600 &)
Definition acir.hpp:8557
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5031
void msgpack_pack(auto &packer) const
Definition acir.hpp:5024
std::shared_ptr< std::array< Acir::Witness, 25 > > outputs
Definition acir.hpp:5020
std::vector< Acir::FunctionInput > scalars
Definition acir.hpp:4896
std::vector< Acir::FunctionInput > points
Definition acir.hpp:4895
std::shared_ptr< std::array< Acir::Witness, 2 > > outputs
Definition acir.hpp:4898
friend bool operator==(const MultiScalarMul &, const MultiScalarMul &)
Definition acir.hpp:8467
void msgpack_pack(auto &packer) const
Definition acir.hpp:4902
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4911
std::vector< Acir::Witness > outputs
Definition acir.hpp:5144
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:5143
void msgpack_pack(auto &packer) const
Definition acir.hpp:5148
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5155
friend bool operator==(const Poseidon2Permutation &, const Poseidon2Permutation &)
Definition acir.hpp:8648
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4611
friend bool operator==(const RANGE &, const RANGE &)
Definition acir.hpp:8252
void msgpack_pack(auto &packer) const
Definition acir.hpp:4604
Acir::FunctionInput input
Definition acir.hpp:4599
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:5067
std::vector< Acir::FunctionInput > proof
Definition acir.hpp:5068
void msgpack_pack(auto &packer) const
Definition acir.hpp:5076
std::vector< Acir::FunctionInput > public_inputs
Definition acir.hpp:5069
friend bool operator==(const RecursiveAggregation &, const RecursiveAggregation &)
Definition acir.hpp:8592
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5087
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5205
std::shared_ptr< std::array< Acir::FunctionInput, 8 > > hash_values
Definition acir.hpp:5192
friend bool operator==(const Sha256Compression &, const Sha256Compression &)
Definition acir.hpp:8684
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
Definition acir.hpp:5191
std::shared_ptr< std::array< Acir::Witness, 8 > > outputs
Definition acir.hpp:5193
void msgpack_pack(auto &packer) const
Definition acir.hpp:5197
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4553
Acir::FunctionInput rhs
Definition acir.hpp:4538
Acir::FunctionInput lhs
Definition acir.hpp:4537
void msgpack_pack(auto &packer) const
Definition acir.hpp:4544
friend bool operator==(const XOR &, const XOR &)
Definition acir.hpp:8208
void msgpack_pack(auto &packer) const
Definition acir.hpp:5263
friend bool operator==(const BlackBoxFuncCall &, const BlackBoxFuncCall &)
Definition acir.hpp:8087
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5341
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:5259
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1250
void msgpack_pack(auto &packer) const
Definition acir.hpp:1241
friend bool operator==(const AES128Encrypt &, const AES128Encrypt &)
Definition acir.hpp:8756
Acir::HeapArray output
Definition acir.hpp:1297
Acir::HeapArray message
Definition acir.hpp:1296
friend bool operator==(const Blake2s &, const Blake2s &)
Definition acir.hpp:8801
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1308
void msgpack_pack(auto &packer) const
Definition acir.hpp:1301
Acir::HeapArray message
Definition acir.hpp:1344
Acir::HeapArray output
Definition acir.hpp:1345
void msgpack_pack(auto &packer) const
Definition acir.hpp:1349
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1356
friend bool operator==(const Blake3 &, const Blake3 &)
Definition acir.hpp:8835
Acir::MemoryAddress result
Definition acir.hpp:1444
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1458
friend bool operator==(const EcdsaSecp256k1 &, const EcdsaSecp256k1 &)
Definition acir.hpp:8904
void msgpack_pack(auto &packer) const
Definition acir.hpp:1448
Acir::MemoryAddress result
Definition acir.hpp:1513
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1527
friend bool operator==(const EcdsaSecp256r1 &, const EcdsaSecp256r1 &)
Definition acir.hpp:8954
void msgpack_pack(auto &packer) const
Definition acir.hpp:1517
Acir::MemoryAddress input1_x
Definition acir.hpp:1633
friend bool operator==(const EmbeddedCurveAdd &, const EmbeddedCurveAdd &)
Definition acir.hpp:9044
Acir::MemoryAddress input1_y
Definition acir.hpp:1634
Acir::MemoryAddress input2_x
Definition acir.hpp:1635
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1651
void msgpack_pack(auto &packer) const
Definition acir.hpp:1641
Acir::MemoryAddress input2_y
Definition acir.hpp:1636
friend bool operator==(const Keccakf1600 &, const Keccakf1600 &)
Definition acir.hpp:8869
void msgpack_pack(auto &packer) const
Definition acir.hpp:1397
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1404
friend bool operator==(const MultiScalarMul &, const MultiScalarMul &)
Definition acir.hpp:9004
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1592
void msgpack_pack(auto &packer) const
Definition acir.hpp:1584
void msgpack_pack(auto &packer) const
Definition acir.hpp:1707
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1714
friend bool operator==(const Poseidon2Permutation &, const Poseidon2Permutation &)
Definition acir.hpp:9094
friend bool operator==(const Sha256Compression &, const Sha256Compression &)
Definition acir.hpp:9129
void msgpack_pack(auto &packer) const
Definition acir.hpp:1756
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1764
friend bool operator==(const ToRadix &, const ToRadix &)
Definition acir.hpp:9169
Acir::MemoryAddress output_pointer
Definition acir.hpp:1807
Acir::MemoryAddress radix
Definition acir.hpp:1806
Acir::MemoryAddress output_bits
Definition acir.hpp:1809
Acir::MemoryAddress input
Definition acir.hpp:1805
Acir::MemoryAddress num_limbs
Definition acir.hpp:1808
void msgpack_pack(auto &packer) const
Definition acir.hpp:1813
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1823
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1954
void msgpack_pack(auto &packer) const
Definition acir.hpp:1888
friend bool operator==(const BlackBoxOp &, const BlackBoxOp &)
Definition acir.hpp:8724
std::variant< AES128Encrypt, Blake2s, Blake3, Keccakf1600, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Poseidon2Permutation, Sha256Compression, ToRadix > value
Definition acir.hpp:1884
void msgpack_pack(auto &packer) const
Definition acir.hpp:5686
friend bool operator==(const BlockId &, const BlockId &)
Definition acir.hpp:9218
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5688
uint32_t value
Definition acir.hpp:5682
friend bool operator==(const CallData &, const CallData &)
Definition acir.hpp:9304
void msgpack_pack(auto &packer) const
Definition acir.hpp:5713
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5715
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5705
friend bool operator==(const Memory &, const Memory &)
Definition acir.hpp:9282
void msgpack_pack(auto &packer) const
Definition acir.hpp:5704
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5730
friend bool operator==(const ReturnData &, const ReturnData &)
Definition acir.hpp:9333
void msgpack_pack(auto &packer) const
Definition acir.hpp:5729
void msgpack_pack(auto &packer) const
Definition acir.hpp:5737
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5771
std::variant< Memory, CallData, ReturnData > value
Definition acir.hpp:5733
friend bool operator==(const BlockType &, const BlockType &)
Definition acir.hpp:9250
void msgpack_pack(auto &packer) const
Definition acir.hpp:7311
friend bool operator==(const BrilligBytecode &, const BrilligBytecode &)
Definition acir.hpp:9356
std::vector< Acir::BrilligOpcode > bytecode
Definition acir.hpp:7307
std::string function_name
Definition acir.hpp:7306
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7318
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5936
void msgpack_pack(auto &packer) const
Definition acir.hpp:5934
std::vector< Acir::Expression > value
Definition acir.hpp:5930
friend bool operator==(const Array &, const Array &)
Definition acir.hpp:9454
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5954
void msgpack_pack(auto &packer) const
Definition acir.hpp:5952
friend bool operator==(const MemoryArray &, const MemoryArray &)
Definition acir.hpp:9483
Acir::Expression value
Definition acir.hpp:5912
friend bool operator==(const Single &, const Single &)
Definition acir.hpp:9425
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5918
void msgpack_pack(auto &packer) const
Definition acir.hpp:5916
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6003
std::variant< Single, Array, MemoryArray > value
Definition acir.hpp:5965
void msgpack_pack(auto &packer) const
Definition acir.hpp:5969
friend bool operator==(const BrilligInputs &, const BrilligInputs &)
Definition acir.hpp:9393
void msgpack_pack(auto &packer) const
Definition acir.hpp:2768
friend bool operator==(const BinaryFieldOp &, const BinaryFieldOp &)
Definition acir.hpp:9545
Acir::MemoryAddress destination
Definition acir.hpp:2761
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2777
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2841
Acir::MemoryAddress destination
Definition acir.hpp:2823
Acir::MemoryAddress rhs
Definition acir.hpp:2827
void msgpack_pack(auto &packer) const
Definition acir.hpp:2831
friend bool operator==(const BinaryIntOp &, const BinaryIntOp &)
Definition acir.hpp:9590
Acir::IntegerBitSize bit_size
Definition acir.hpp:2825
Acir::MemoryAddress lhs
Definition acir.hpp:2826
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3586
Acir::BlackBoxOp value
Definition acir.hpp:3580
friend bool operator==(const BlackBox &, const BlackBox &)
Definition acir.hpp:10150
void msgpack_pack(auto &packer) const
Definition acir.hpp:3584
void msgpack_pack(auto &packer) const
Definition acir.hpp:3150
friend bool operator==(const Call &, const Call &)
Definition acir.hpp:9821
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3156
Acir::MemoryAddress offset_address
Definition acir.hpp:3093
friend bool operator==(const CalldataCopy &, const CalldataCopy &)
Definition acir.hpp:9781
Acir::MemoryAddress destination_address
Definition acir.hpp:3091
void msgpack_pack(auto &packer) const
Definition acir.hpp:3097
Acir::MemoryAddress size_address
Definition acir.hpp:3092
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3105
Acir::MemoryAddress source
Definition acir.hpp:2948
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2961
void msgpack_pack(auto &packer) const
Definition acir.hpp:2953
Acir::MemoryAddress destination
Definition acir.hpp:2947
Acir::BitSize bit_size
Definition acir.hpp:2949
friend bool operator==(const Cast &, const Cast &)
Definition acir.hpp:9679
Acir::MemoryAddress source_b
Definition acir.hpp:3424
friend bool operator==(const ConditionalMov &, const ConditionalMov &)
Definition acir.hpp:10037
Acir::MemoryAddress source_a
Definition acir.hpp:3423
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3438
void msgpack_pack(auto &packer) const
Definition acir.hpp:3429
Acir::MemoryAddress destination
Definition acir.hpp:3422
Acir::MemoryAddress condition
Definition acir.hpp:3425
Acir::BitSize bit_size
Definition acir.hpp:3188
friend bool operator==(const Const &, const Const &)
Definition acir.hpp:9850
std::vector< uint8_t > value
Definition acir.hpp:3189
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3201
void msgpack_pack(auto &packer) const
Definition acir.hpp:3193
Acir::MemoryAddress destination
Definition acir.hpp:3187
std::vector< Acir::HeapValueType > input_value_types
Definition acir.hpp:3308
std::vector< Acir::HeapValueType > destination_value_types
Definition acir.hpp:3306
std::vector< Acir::ValueOrArray > destinations
Definition acir.hpp:3305
friend bool operator==(const ForeignCall &, const ForeignCall &)
Definition acir.hpp:9952
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3322
void msgpack_pack(auto &packer) const
Definition acir.hpp:3312
std::vector< Acir::ValueOrArray > inputs
Definition acir.hpp:3307
std::vector< uint8_t > value
Definition acir.hpp:3244
void msgpack_pack(auto &packer) const
Definition acir.hpp:3248
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3256
friend bool operator==(const IndirectConst &, const IndirectConst &)
Definition acir.hpp:9889
Acir::MemoryAddress destination_pointer
Definition acir.hpp:3242
void msgpack_pack(auto &packer) const
Definition acir.hpp:3054
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3060
friend bool operator==(const Jump &, const Jump &)
Definition acir.hpp:9752
void msgpack_pack(auto &packer) const
Definition acir.hpp:3007
Acir::MemoryAddress condition
Definition acir.hpp:3002
friend bool operator==(const JumpIf &, const JumpIf &)
Definition acir.hpp:9718
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3014
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3496
Acir::MemoryAddress destination
Definition acir.hpp:3484
Acir::MemoryAddress source_pointer
Definition acir.hpp:3485
friend bool operator==(const Load &, const Load &)
Definition acir.hpp:10082
void msgpack_pack(auto &packer) const
Definition acir.hpp:3489
Acir::MemoryAddress destination
Definition acir.hpp:3374
friend bool operator==(const Mov &, const Mov &)
Definition acir.hpp:10003
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3386
Acir::MemoryAddress source
Definition acir.hpp:3375
void msgpack_pack(auto &packer) const
Definition acir.hpp:3379
friend bool operator==(const Not &, const Not &)
Definition acir.hpp:9640
Acir::MemoryAddress source
Definition acir.hpp:2893
void msgpack_pack(auto &packer) const
Definition acir.hpp:2898
Acir::IntegerBitSize bit_size
Definition acir.hpp:2894
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2906
Acir::MemoryAddress destination
Definition acir.hpp:2892
friend bool operator==(const Return &, const Return &)
Definition acir.hpp:9929
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3300
void msgpack_pack(auto &packer) const
Definition acir.hpp:3299
friend bool operator==(const Stop &, const Stop &)
Definition acir.hpp:10209
void msgpack_pack(auto &packer) const
Definition acir.hpp:3643
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3649
Acir::HeapVector return_data
Definition acir.hpp:3639
friend bool operator==(const Store &, const Store &)
Definition acir.hpp:10116
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3544
Acir::MemoryAddress source
Definition acir.hpp:3533
Acir::MemoryAddress destination_pointer
Definition acir.hpp:3532
void msgpack_pack(auto &packer) const
Definition acir.hpp:3537
friend bool operator==(const Trap &, const Trap &)
Definition acir.hpp:10180
void msgpack_pack(auto &packer) const
Definition acir.hpp:3602
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3608
Acir::HeapVector revert_data
Definition acir.hpp:3598
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:3698
friend bool operator==(const BrilligOpcode &, const BrilligOpcode &)
Definition acir.hpp:9513
void msgpack_pack(auto &packer) const
Definition acir.hpp:3702
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:3800
void msgpack_pack(auto &packer) const
Definition acir.hpp:6137
std::vector< Acir::Witness > value
Definition acir.hpp:6133
friend bool operator==(const Array &, const Array &)
Definition acir.hpp:10300
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6139
void msgpack_pack(auto &packer) const
Definition acir.hpp:6119
friend bool operator==(const Simple &, const Simple &)
Definition acir.hpp:10270
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6121
friend bool operator==(const BrilligOutputs &, const BrilligOutputs &)
Definition acir.hpp:10238
void msgpack_pack(auto &packer) const
Definition acir.hpp:6154
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6184
std::variant< Simple, Array > value
Definition acir.hpp:6150
Acir::PublicInputs return_values
Definition acir.hpp:7235
void msgpack_pack(auto &packer) const
Definition acir.hpp:7240
std::vector< Acir::Opcode > opcodes
Definition acir.hpp:7232
friend bool operator==(const Circuit &, const Circuit &)
Definition acir.hpp:10329
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7251
std::vector< Acir::Witness > private_parameters
Definition acir.hpp:7233
Acir::PublicInputs public_parameters
Definition acir.hpp:7234
std::string function_name
Definition acir.hpp:7231
std::vector< std::tuple< Acir::OpcodeLocation, Acir::AssertionPayload > > assert_messages
Definition acir.hpp:7236
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:5856
std::vector< uint8_t > q_c
Definition acir.hpp:5857
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:5855
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:5869
void msgpack_pack(auto &packer) const
Definition acir.hpp:5861
friend bool operator==(const Expression &, const Expression &)
Definition acir.hpp:10386
void msgpack_pack(auto &packer) const
Definition acir.hpp:6821
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6823
friend bool operator==(const Expression &, const Expression &)
Definition acir.hpp:10461
void msgpack_pack(auto &packer) const
Definition acir.hpp:6839
friend bool operator==(const Memory &, const Memory &)
Definition acir.hpp:10491
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6841
std::variant< Expression, Memory > value
Definition acir.hpp:6852
void msgpack_pack(auto &packer) const
Definition acir.hpp:6856
friend bool operator==(const ExpressionOrMemory &, const ExpressionOrMemory &)
Definition acir.hpp:10428
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6886
std::vector< uint8_t > value
Definition acir.hpp:4253
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4259
friend bool operator==(const Constant &, const Constant &)
Definition acir.hpp:10553
void msgpack_pack(auto &packer) const
Definition acir.hpp:4257
void msgpack_pack(auto &packer) const
Definition acir.hpp:4275
friend bool operator==(const Witness &, const Witness &)
Definition acir.hpp:10583
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4277
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4322
void msgpack_pack(auto &packer) const
Definition acir.hpp:4292
std::variant< Constant, Witness > value
Definition acir.hpp:4288
friend bool operator==(const FunctionInput &, const FunctionInput &)
Definition acir.hpp:10521
void msgpack_pack(auto &packer) const
Definition acir.hpp:1189
Acir::SemiFlattenedLength size
Definition acir.hpp:1185
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1196
friend bool operator==(const HeapArray &, const HeapArray &)
Definition acir.hpp:10613
Acir::MemoryAddress pointer
Definition acir.hpp:1184
Acir::SemanticLength size
Definition acir.hpp:2273
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2284
void msgpack_pack(auto &packer) const
Definition acir.hpp:2277
friend bool operator==(const Array &, const Array &)
Definition acir.hpp:10711
std::vector< Acir::HeapValueType > value_types
Definition acir.hpp:2272
void msgpack_pack(auto &packer) const
Definition acir.hpp:2258
friend bool operator==(const Simple &, const Simple &)
Definition acir.hpp:10682
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2260
friend bool operator==(const Vector &, const Vector &)
Definition acir.hpp:10745
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2330
void msgpack_pack(auto &packer) const
Definition acir.hpp:2324
std::vector< Acir::HeapValueType > value_types
Definition acir.hpp:2320
void msgpack_pack(auto &packer) const
Definition acir.hpp:2364
friend bool operator==(const HeapValueType &, const HeapValueType &)
Definition acir.hpp:10650
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2398
std::variant< Simple, Array, Vector > value
Definition acir.hpp:2360
void msgpack_pack(auto &packer) const
Definition acir.hpp:2513
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2520
friend bool operator==(const HeapVector &, const HeapVector &)
Definition acir.hpp:10774
Acir::MemoryAddress size
Definition acir.hpp:2509
Acir::MemoryAddress pointer
Definition acir.hpp:2508
static void check_size(uint32_t actual, std::string const &name, uint32_t active, uint32_t reserved)
Definition acir.hpp:138
static bool is_int_keyed_map(msgpack::object const &o)
Definition acir.hpp:100
static void convert_or_throw(msgpack::object const &val, std::string const &struct_name, std::string const &field_name, T &field)
Definition acir.hpp:82
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:34
static std::map< std::string, msgpack::object const * > make_kvmap(msgpack::object const &o, std::string const &name)
Definition acir.hpp:15
static void int_map_dispatch(msgpack::object const &o, std::string const &name, Dispatch &&dispatch)
Definition acir.hpp:113
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:57
friend bool operator==(const U128 &, const U128 &)
Definition acir.hpp:10958
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:722
void msgpack_pack(auto &packer) const
Definition acir.hpp:721
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:701
friend bool operator==(const U16 &, const U16 &)
Definition acir.hpp:10889
void msgpack_pack(auto &packer) const
Definition acir.hpp:700
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:687
void msgpack_pack(auto &packer) const
Definition acir.hpp:686
friend bool operator==(const U1 &, const U1 &)
Definition acir.hpp:10843
void msgpack_pack(auto &packer) const
Definition acir.hpp:707
friend bool operator==(const U32 &, const U32 &)
Definition acir.hpp:10912
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:708
void msgpack_pack(auto &packer) const
Definition acir.hpp:714
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:715
friend bool operator==(const U64 &, const U64 &)
Definition acir.hpp:10935
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:694
void msgpack_pack(auto &packer) const
Definition acir.hpp:693
friend bool operator==(const U8 &, const U8 &)
Definition acir.hpp:10866
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:775
friend bool operator==(const IntegerBitSize &, const IntegerBitSize &)
Definition acir.hpp:10811
std::variant< U1, U8, U16, U32, U64, U128 > value
Definition acir.hpp:725
void msgpack_pack(auto &packer) const
Definition acir.hpp:729
bool read
Definition acir.hpp:6273
friend bool operator==(const MemOp &, const MemOp &)
Definition acir.hpp:10981
void msgpack_pack(auto &packer) const
Definition acir.hpp:6279
Acir::Witness index
Definition acir.hpp:6274
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6287
Acir::Witness value
Definition acir.hpp:6275
void msgpack_pack(auto &packer) const
Definition acir.hpp:1012
friend bool operator==(const Direct &, const Direct &)
Definition acir.hpp:11055
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1014
void msgpack_pack(auto &packer) const
Definition acir.hpp:1030
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1032
friend bool operator==(const Relative &, const Relative &)
Definition acir.hpp:11084
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1077
friend bool operator==(const MemoryAddress &, const MemoryAddress &)
Definition acir.hpp:11023
void msgpack_pack(auto &packer) const
Definition acir.hpp:1047
std::variant< Direct, Relative > value
Definition acir.hpp:1043
void msgpack_pack(auto &packer) const
Definition acir.hpp:6334
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6336
Acir::Expression value
Definition acir.hpp:6330
friend bool operator==(const AssertZero &, const AssertZero &)
Definition acir.hpp:11146
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6354
Acir::BlackBoxFuncCall value
Definition acir.hpp:6348
friend bool operator==(const BlackBoxFuncCall &, const BlackBoxFuncCall &)
Definition acir.hpp:11175
void msgpack_pack(auto &packer) const
Definition acir.hpp:6352
friend bool operator==(const BrilligCall &, const BrilligCall &)
Definition acir.hpp:11277
std::vector< Acir::BrilligInputs > inputs
Definition acir.hpp:6470
Acir::Expression predicate
Definition acir.hpp:6472
void msgpack_pack(auto &packer) const
Definition acir.hpp:6476
std::vector< Acir::BrilligOutputs > outputs
Definition acir.hpp:6471
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6485
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6547
Acir::Expression predicate
Definition acir.hpp:6534
friend bool operator==(const Call &, const Call &)
Definition acir.hpp:11321
void msgpack_pack(auto &packer) const
Definition acir.hpp:6538
std::vector< Acir::Witness > outputs
Definition acir.hpp:6533
std::vector< Acir::Witness > inputs
Definition acir.hpp:6532
Acir::BlockId block_id
Definition acir.hpp:6414
std::vector< Acir::Witness > init
Definition acir.hpp:6415
Acir::BlockType block_type
Definition acir.hpp:6416
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6428
void msgpack_pack(auto &packer) const
Definition acir.hpp:6420
friend bool operator==(const MemoryInit &, const MemoryInit &)
Definition acir.hpp:11238
friend bool operator==(const MemoryOp &, const MemoryOp &)
Definition acir.hpp:11205
void msgpack_pack(auto &packer) const
Definition acir.hpp:6371
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6378
Acir::BlockId block_id
Definition acir.hpp:6366
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:6592
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:6642
friend bool operator==(const Opcode &, const Opcode &)
Definition acir.hpp:11114
void msgpack_pack(auto &packer) const
Definition acir.hpp:6596
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7031
friend bool operator==(const Acir &, const Acir &)
Definition acir.hpp:11396
void msgpack_pack(auto &packer) const
Definition acir.hpp:7029
friend bool operator==(const Brillig &, const Brillig &)
Definition acir.hpp:11425
void msgpack_pack(auto &packer) const
Definition acir.hpp:7048
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7055
friend bool operator==(const OpcodeLocation &, const OpcodeLocation &)
Definition acir.hpp:11364
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7124
std::variant< Acir, Brillig > value
Definition acir.hpp:7090
void msgpack_pack(auto &packer) const
Definition acir.hpp:7094
void msgpack_pack(auto &packer) const
Definition acir.hpp:7358
std::vector< Acir::Circuit > functions
Definition acir.hpp:7353
friend bool operator==(const Program &, const Program &)
Definition acir.hpp:11460
std::vector< Acir::BrilligBytecode > unconstrained_functions
Definition acir.hpp:7354
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7365
void msgpack_pack(auto &packer) const
Definition acir.hpp:7405
std::vector< Acir::Circuit > functions
Definition acir.hpp:7400
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7412
std::monostate unconstrained_functions
Definition acir.hpp:7401
friend bool operator==(const ProgramWithoutBrillig &, const ProgramWithoutBrillig &)
Definition acir.hpp:11498
friend bool operator==(const PublicInputs &, const PublicInputs &)
Definition acir.hpp:11537
std::vector< Acir::Witness > value
Definition acir.hpp:7213
void msgpack_pack(auto &packer) const
Definition acir.hpp:7217
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:7219
friend bool operator==(const SemanticLength &, const SemanticLength &)
Definition acir.hpp:11569
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2238
void msgpack_pack(auto &packer) const
Definition acir.hpp:2236
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:1172
friend bool operator==(const SemiFlattenedLength &, const SemiFlattenedLength &)
Definition acir.hpp:11601
void msgpack_pack(auto &packer) const
Definition acir.hpp:1170
void msgpack_pack(auto &packer) const
Definition acir.hpp:2580
friend bool operator==(const HeapArray &, const HeapArray &)
Definition acir.hpp:11696
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2582
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2600
void msgpack_pack(auto &packer) const
Definition acir.hpp:2598
friend bool operator==(const HeapVector &, const HeapVector &)
Definition acir.hpp:11726
void msgpack_pack(auto &packer) const
Definition acir.hpp:2562
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2564
friend bool operator==(const MemoryAddress &, const MemoryAddress &)
Definition acir.hpp:11666
Acir::MemoryAddress value
Definition acir.hpp:2558
void msgpack_pack(auto &packer) const
Definition acir.hpp:2615
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:2649
std::variant< MemoryAddress, HeapArray, HeapVector > value
Definition acir.hpp:2611
friend bool operator==(const ValueOrArray &, const ValueOrArray &)
Definition acir.hpp:11634
uint32_t value
Definition acir.hpp:4233
void msgpack_pack(auto &packer) const
Definition acir.hpp:4237
void msgpack_unpack(msgpack::object const &o)
Definition acir.hpp:4239
friend bool operator==(const Witness &, const Witness &)
Definition acir.hpp:11756
static T deserialize(Deserializer &deserializer)
static void serialize(const T &value, Serializer &serializer)
void throw_or_abort(std::string const &err)