Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
instruction.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <cstring>
5#include <stdexcept>
6#include <variant>
7
13
15
19
20 MemoryTagWrapper() = default;
24
25 operator MemoryTag() const { return value; }
26
27 void msgpack_pack(auto& packer) const
28 {
29 uint64_t value_to_serialize = static_cast<uint64_t>(this->value);
30 packer.pack_bin(sizeof(value_to_serialize));
31 packer.pack_bin_body((char*)&value_to_serialize, sizeof(value_to_serialize)); // NOLINT
32 }
33
34 void msgpack_unpack(msgpack::object const& o)
35 {
36 // Handle binary data unpacking
37 if (o.type == msgpack::type::BIN) {
38 auto bin = o.via.bin;
39 if (bin.size == sizeof(uint64_t)) {
40 uint64_t value_to_deserialize = 0;
41 std::memcpy(&value_to_deserialize, bin.ptr, sizeof(value_to_deserialize));
42 *this = MemoryTagWrapper(static_cast<MemoryTag>(value_to_deserialize));
43 } else {
44 throw std::runtime_error("Invalid binary data size for MemoryTag");
45 }
46 }
47 }
48};
49
50enum class AddressingMode : uint8_t {
51 Direct = 0,
52 Indirect = 1,
53 Relative = 2,
55};
56
60
65
66 operator AddressingMode() const { return value; }
67
68 void msgpack_pack(auto& packer) const
69 {
70 uint8_t value_to_serialize = static_cast<uint8_t>(this->value);
71 packer.pack_bin(sizeof(value_to_serialize));
72 packer.pack_bin_body((char*)&value_to_serialize, sizeof(value_to_serialize)); // NOLINT
73 }
74
75 void msgpack_unpack(msgpack::object const& o)
76 {
77 // Handle binary data unpacking
78 if (o.type == msgpack::type::BIN) {
79 auto bin = o.via.bin;
80 if (bin.size == sizeof(uint8_t)) {
81 uint8_t value_to_deserialize = 0;
82 std::memcpy(&value_to_deserialize, bin.ptr, sizeof(value_to_deserialize));
83 *this = AddressingModeWrapper(static_cast<AddressingMode>(value_to_deserialize));
84 } else {
85 throw std::runtime_error("Invalid binary data size for AddressingMode");
86 }
87 }
88 }
89};
90
112
123
125
136
137inline std::ostream& operator<<(std::ostream& os, const ResolvedAddress& address)
138{
139 os << "ResolvedAddress {\n";
140 os << " absolute_address: " << address.absolute_address << ",\n";
141 os << " operand_address: " << address.operand_address << ",\n";
142 os << " pointer_address: " << address.pointer_address.value() << ",\n";
143 os << " via_relative: " << address.via_relative << ",\n";
144 os << "}";
145 return os;
146}
147
155
163
171
179
186
194
202
210
218
226
234
240
248
256
264
272
280
288
297
305
313
321
329
337
345
353
360
368
376
384
392
400
408
414
422
430
439
448
456
459 uint16_t slot_index; // index of the slot in memory_manager.storage_addresses
460 AddressRef slot_address; // address where we set slot value
461 ParamRef contract_address_address; // address where the contract address will be stored
464};
465
472
478
486
495
502
509
516
522
528
547
552
560
567
572
583
591
599
609
613 ParamRef value_address; // FF: value to convert
614 ParamRef radix_address; // U32: the radix/base
615 ParamRef num_limbs_address; // U32: number of output limbs
616 ParamRef output_bits_address; // U1: whether output is bits
617 AddressRef dst_address; // destination for limbs
618 bool is_output_bits; // known at generation time for memory tracking (U1 if true, U8 if false)
621};
622
631
692
693template <class... Ts> struct overloaded : Ts... {
694 using Ts::operator()...;
695};
696template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
697
698inline std::ostream& operator<<(std::ostream& os, const MemoryTagWrapper& tag)
699{
700 os << tag.value;
701 return os;
702}
703
704inline std::ostream& operator<<(std::ostream& os, const VariableRef& variable)
705{
706 os << "VariableRef " << variable.tag << " " << variable.index << " "
707 << static_cast<int>(static_cast<AddressingMode>(variable.mode));
708 return os;
709}
710
711inline std::ostream& operator<<(std::ostream& os, const AddressRef& result_address)
712{
713 os << "AddressRef " << result_address.address << " "
714 << static_cast<int>(static_cast<AddressingMode>(result_address.mode));
715 return os;
716}
717
718inline std::ostream& operator<<(std::ostream& os, const ParamRef& param)
719{
720 std::visit([&](auto&& arg) { os << arg; }, param);
721 return os;
722}
723
724inline std::ostream& operator<<(std::ostream& os, const FuzzInstruction& instruction)
725{
726 std::visit(
728 [&](ADD_8_Instruction arg) {
729 os << "ADD_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
730 },
731 [&](SET_8_Instruction arg) {
732 os << "SET_8_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
733 },
734 [&](SET_16_Instruction arg) {
735 os << "SET_16_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
736 },
737 [&](SET_32_Instruction arg) {
738 os << "SET_32_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
739 },
740 [&](SET_64_Instruction arg) {
741 os << "SET_64_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
742 },
743 [&](SET_128_Instruction arg) {
744 os << "SET_128_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value_high
745 << " " << arg.value_low;
746 },
747 [&](SET_FF_Instruction arg) {
748 os << "SET_FF_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
749 },
750 [&](SUB_8_Instruction arg) {
751 os << "SUB_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
752 },
753 [&](MUL_8_Instruction arg) {
754 os << "MUL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
755 },
756 [&](DIV_8_Instruction arg) {
757 os << "DIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
758 },
759 [&](FDIV_8_Instruction arg) {
760 os << "FDIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
761 },
762 [&](EQ_8_Instruction arg) {
763 os << "EQ_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
764 },
765 [&](LT_8_Instruction arg) {
766 os << "LT_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
767 },
768 [&](LTE_8_Instruction arg) {
769 os << "LTE_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
770 },
771 [&](AND_8_Instruction arg) {
772 os << "AND_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
773 },
774 [&](OR_8_Instruction arg) {
775 os << "OR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
776 },
777 [&](XOR_8_Instruction arg) {
778 os << "XOR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
779 },
780 [&](SHL_8_Instruction arg) {
781 os << "SHL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
782 },
783 [&](SHR_8_Instruction arg) {
784 os << "SHR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
785 },
786 [&](NOT_8_Instruction arg) { os << "NOT_8_Instruction " << arg.a_address << " " << arg.result_address; },
787 [&](ADD_16_Instruction arg) {
788 os << "ADD_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
789 },
790 [&](SUB_16_Instruction arg) {
791 os << "SUB_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
792 },
793 [&](MUL_16_Instruction arg) {
794 os << "MUL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
795 },
796 [&](DIV_16_Instruction arg) {
797 os << "DIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
798 },
799 [&](FDIV_16_Instruction arg) {
800 os << "FDIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
801 },
802 [&](EQ_16_Instruction arg) {
803 os << "EQ_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
804 },
805 [&](LT_16_Instruction arg) {
806 os << "LT_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
807 },
808 [&](LTE_16_Instruction arg) {
809 os << "LTE_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
810 },
811 [&](AND_16_Instruction arg) {
812 os << "AND_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
813 },
814 [&](OR_16_Instruction arg) {
815 os << "OR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
816 },
817 [&](XOR_16_Instruction arg) {
818 os << "XOR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
819 },
820 [&](NOT_16_Instruction arg) { os << "NOT_16_Instruction " << arg.a_address << " " << arg.result_address; },
821 [&](SHL_16_Instruction arg) {
822 os << "SHL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
823 },
824 [&](SHR_16_Instruction arg) {
825 os << "SHR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
826 },
827 [&](CAST_8_Instruction arg) {
828 os << "CAST_8_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address << " "
829 << arg.target_tag;
830 },
831 [&](CAST_16_Instruction arg) {
832 os << "CAST_16_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address
833 << " " << arg.target_tag;
834 },
835 [&](MOV_8_Instruction arg) {
836 os << "MOV_8_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
837 },
838 [&](MOV_16_Instruction arg) {
839 os << "MOV_16_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
840 },
841 [&](SSTORE_Instruction arg) {
842 os << "SSTORE_Instruction " << arg.src_address << " " << arg.result_address << " " << arg.slot;
843 },
844 [&](SLOAD_Instruction arg) { os << "SLOAD_Instruction " << arg.slot_address << " " << arg.result_address; },
845 [&](GETENVVAR_Instruction arg) {
846 os << "GETENVVAR_Instruction " << arg.result_address << " " << static_cast<int>(arg.type);
847 },
848 [&](EMITNULLIFIER_Instruction arg) { os << "EMITNULIFIER_Instruction " << arg.nullifier_address; },
850 os << "NULLIFIEREXISTS_Instruction " << arg.siloed_nullifier_address << " " << arg.result_address;
851 },
853 os << "L1TOL2MSGEXISTS_Instruction " << arg.msg_hash_address << " " << arg.leaf_index_address << " "
854 << arg.result_address;
855 },
856 [&](EMITNOTEHASH_Instruction arg) {
857 os << "EMITNOTEHASH_Instruction " << arg.note_hash_address << " " << arg.note_hash;
858 },
860 os << "NOTEHASHEXISTS_Instruction " << arg.notehash_address << " " << arg.notehash_address << " "
861 << arg.leaf_index_address << " " << arg.result_address;
862 },
863 [&](CALLDATACOPY_Instruction arg) {
864 os << "CALLDATACOPY_Instruction " << arg.copy_size_address << " " << arg.cd_offset_address << " "
865 << arg.dst_address;
866 },
868 os << "SENDL2TOL1MSG_Instruction " << arg.recipient_address << " " << arg.content_address;
869 },
871 os << "EMITPUBLICLOG_Instruction " << arg.log_size_address << " " << arg.log_values_address;
872 },
873 [&](CALL_Instruction arg) {
874 os << "CALL_Instruction " << arg.l2_gas_address << " " << arg.da_gas_address << " "
875 << arg.contract_address_address << " " << arg.calldata_size_address << " " << arg.calldata_address
876 << " " << arg.is_static_call;
877 },
878 [&](RETURNDATASIZE_Instruction arg) { os << "RETURNDATASIZE_Instruction " << arg.dst_address; },
880 os << "RETURNDATACOPY_Instruction " << arg.copy_size_address << " " << arg.rd_offset_address << " "
881 << arg.dst_address;
882 },
883 [&](ECADD_Instruction arg) {
884 os << "ECADD_Instruction " << arg.p1_x << " " << arg.p1_y << " " << arg.p1_infinite << " " << arg.p2_x
885 << " " << arg.p2_y << " " << arg.p2_infinite << " " << arg.result;
886 },
888 os << "POSEIDON2PERM_Instruction " << arg.src_address << " " << arg.dst_address;
889 },
890 [&](KECCAKF1600_Instruction arg) {
891 os << "KECCAKF1600_Instruction " << arg.src_address << " " << arg.dst_address;
892 },
894 os << "SHA256COMPRESSION_Instruction " << arg.state_address << " " << arg.input_address << " "
895 << arg.dst_address;
896 },
897 [&](TORADIXBE_Instruction arg) {
898 os << "TORADIXBE_Instruction " << arg.value_address << " " << arg.radix_address << " "
899 << arg.num_limbs_address << " " << arg.output_bits_address << " " << arg.dst_address << " "
900 << arg.is_output_bits;
901 },
902 [&](DEBUGLOG_Instruction arg) {
903 os << "DEBUGLOG_Instruction " << arg.level_offset << " " << arg.message_offset << " "
904 << arg.fields_offset << " " << arg.fields_size_offset << " " << arg.message_size;
905 },
906 [&](auto) { os << "Unknown instruction"; },
907 },
909 return os;
910}
::FuzzInstruction FuzzInstruction
bb::avm2::MemoryTag MemoryTag
std::ostream & operator<<(std::ostream &os, const ResolvedAddress &address)
AddressingMode
std::variant< VariableRef, AddressRef > ParamRef
Instruction instruction
AvmFlavorSettings::FF FF
Definition field.hpp:10
ValueTag MemoryTag
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
mem[result_offset] = mem[a_address] + mem[b_address] (16-bit)
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] + mem[b_address]
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address]
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
SERIALIZATION_FIELDS(address, pointer_address_seed, mode)
AddressingModeWrapper mode
uint16_t pointer_address_seed
A seed for the generation of the pointer address Used for Indirect/IndirectRelative modes only.
uint32_t address
Wrapper for AddressingMode to allow for msgpack packing and unpacking.
AddressingModeWrapper()=default
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
AddressingModeWrapper(AddressingMode v)
AddressingMode value
ParamRef contract_address_address
ParamRef da_gas_address
SERIALIZATION_FIELDS(l2_gas_address, da_gas_address, contract_address_address, calldata_address, calldata_size_address, calldata_size, is_static_call)
AddressRef calldata_size_address
ParamRef l2_gas_address
ParamRef calldata_address
SERIALIZATION_FIELDS(copy_size_address, cd_offset_address, dst_address)
CAST_16: cast mem[src_offset_index] to target_tag and store at dst_offset.
SERIALIZATION_FIELDS(src_tag, src_address, result_address, target_tag)
AddressRef result_address
MemoryTagWrapper target_tag
MemoryTagWrapper src_tag
CAST_8: cast mem[src_offset_index] to target_tag and store at dst_offset.
AddressRef result_address
SERIALIZATION_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper src_tag
MemoryTagWrapper target_tag
SERIALIZATION_FIELDS(level_offset, message_offset, fields_offset, fields_size_offset, message_size)
mem[result_offset] = mem[a_address] / mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] / mem[b_address]
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
SERIALIZATION_FIELDS(p1_x, p1_y, p1_infinite, p2_x, p2_y, p2_infinite, result)
EMITNOTEHASH: M[note_hash_offset] = note_hash; emit note hash to the note hash tree.
SERIALIZATION_FIELDS(note_hash_address, note_hash)
EMITNULIFIER: inserts new nullifier to the nullifier tree.
SERIALIZATION_FIELDS(nullifier_address)
SERIALIZATION_FIELDS(log_size_address, log_values_address)
mem[result_offset] = mem[a_address] == mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] == mem[b_address]
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
SERIALIZATION_FIELDS(contract_address_address, member_enum, dst_address)
GETENVVAR: M[result_offset] = getenvvar(type)
SERIALIZATION_FIELDS(result_address, type)
KECCAKF1600: Perform Keccak-f[1600] permutation on 25 U64 values M[dst_address:dst_address+25] = kecc...
SERIALIZATION_FIELDS(src_address, dst_address)
L1TOL2MSGEXISTS: Check if a L1 to L2 message exists M[result_address] = L1TOL2MSGEXISTS(M[msg_hash_ad...
SERIALIZATION_FIELDS(msg_hash_address, leaf_index_address, result_address)
mem[result_offset] = mem[a_address] < mem[b_address] (16-bit)
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] < mem[b_address]
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] <= mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] <= mem[b_address]
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
MOV_16 instruction: mem[dst_offset] = mem[src_offset].
SERIALIZATION_FIELDS(value_tag, src_address, result_address)
MemoryTagWrapper value_tag
AddressRef result_address
MOV_8 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
SERIALIZATION_FIELDS(value_tag, src_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address]
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
Wrapper for MemoryTag to allow for msgpack packing and unpacking.
MemoryTagWrapper(MemoryTag v)
MemoryTagWrapper()=default
void msgpack_pack(auto &packer) const
void msgpack_unpack(msgpack::object const &o)
SERIALIZATION_FIELDS(a_address, result_address)
AddressRef result_address
AddressRef result_address
SERIALIZATION_FIELDS(a_address, result_address)
SERIALIZATION_FIELDS(notehash_address, leaf_index_address, result_address)
NULLIFIEREXISTS: checks if a siloed nullifier exists in the nullifier tree M[result_address] = NULLIF...
SERIALIZATION_FIELDS(siloed_nullifier_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] | mem[b_address]
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
POSEIDON2PERM: Perform Poseidon2 permutation on 4 FF values M[dst_address:dst_address+4] = poseidon2_...
SERIALIZATION_FIELDS(src_address, dst_address)
SERIALIZATION_FIELDS(copy_size_address, rd_offset_address, dst_address)
SERIALIZATION_FIELDS(dst_address)
Output of resolving an address in the memory manager In order to resolve a given absolute address wit...
uint32_t operand_address
uint32_t absolute_address
std::optional< uint32_t > pointer_address
SERIALIZATION_FIELDS(recipient_address, content_address)
SET_128 instruction.
MemoryTagWrapper value_tag
SERIALIZATION_FIELDS(value_tag, result_address, value_low, value_high)
AddressRef result_address
SET_16 instruction.
AddressRef result_address
MemoryTagWrapper value_tag
SERIALIZATION_FIELDS(value_tag, result_address, value)
SET_32 instruction.
AddressRef result_address
SERIALIZATION_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
SET_64 instruction.
SERIALIZATION_FIELDS(value_tag, result_address, value)
AddressRef result_address
MemoryTagWrapper value_tag
SET_8 instruction.
MemoryTagWrapper value_tag
AddressRef result_address
SERIALIZATION_FIELDS(value_tag, result_address, value)
SET_FF instruction.
SERIALIZATION_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
AddressRef result_address
SHA256COMPRESSION: Perform SHA256 compression M[dst_address:dst_address+8] = sha256_compression(M[sta...
SERIALIZATION_FIELDS(state_address, input_address, dst_address)
mem[result_offset] = mem[a_address] << mem[b_address] (16-bit)
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] << mem[b_address]
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address] (16-bit)
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address]
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
SLOAD: M[slot_offset] = slot; M[result_offset] = S[M[slotOffset]].
SERIALIZATION_FIELDS(slot_index, slot_address, contract_address_address, result_address)
AddressRef result_address
ParamRef contract_address_address
AddressRef slot_address
SSTORE: M[slot_offset_index] = slot; S[M[slotOffset]] = M[srcOffset].
AddressRef result_address
SERIALIZATION_FIELDS(src_address, result_address, slot)
mem[result_offset] = mem[a_address] - mem[b_address] (16-bit)
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] - mem[b_address]
AddressRef result_address
SERIALIZATION_FIELDS(a_address, b_address, result_address)
SERIALIZATION_FIELDS(dst_address)
TORADIXBE: Convert a field element to a vector of limbs in big-endian radix representation M[dst_addr...
SERIALIZATION_FIELDS(value_address, radix_address, num_limbs_address, output_bits_address, dst_address, is_output_bits)
AddressingModeWrapper mode
uint32_t index
Index of the variable in the memory_manager.stored_variables map.
SERIALIZATION_FIELDS(tag, index, pointer_address_seed, mode)
MemoryTagWrapper tag
uint16_t pointer_address_seed
A seed for the generation of the pointer address Used for Indirect/IndirectRelative modes only.
mem[result_offset] = mem[a_address] ^ mem[b_address] (16-bit)
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] ^ mem[b_address]
SERIALIZATION_FIELDS(a_address, b_address, result_address)
AddressRef result_address