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
581
589
597
607
611 ParamRef value_address; // FF: value to convert
612 ParamRef radix_address; // U32: the radix/base
613 ParamRef num_limbs_address; // U32: number of output limbs
614 ParamRef output_bits_address; // U1: whether output is bits
615 AddressRef dst_address; // destination for limbs
616 bool is_output_bits; // known at generation time for memory tracking (U1 if true, U8 if false)
619};
620
629
690
691template <class... Ts> struct overloaded : Ts... {
692 using Ts::operator()...;
693};
694template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
695
696inline std::ostream& operator<<(std::ostream& os, const MemoryTagWrapper& tag)
697{
698 os << tag.value;
699 return os;
700}
701
702inline std::ostream& operator<<(std::ostream& os, const VariableRef& variable)
703{
704 os << "VariableRef " << variable.tag << " " << variable.index << " "
705 << static_cast<int>(static_cast<AddressingMode>(variable.mode));
706 return os;
707}
708
709inline std::ostream& operator<<(std::ostream& os, const AddressRef& result_address)
710{
711 os << "AddressRef " << result_address.address << " "
712 << static_cast<int>(static_cast<AddressingMode>(result_address.mode));
713 return os;
714}
715
716inline std::ostream& operator<<(std::ostream& os, const ParamRef& param)
717{
718 std::visit([&](auto&& arg) { os << arg; }, param);
719 return os;
720}
721
722inline std::ostream& operator<<(std::ostream& os, const FuzzInstruction& instruction)
723{
724 std::visit(
726 [&](ADD_8_Instruction arg) {
727 os << "ADD_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
728 },
729 [&](SET_8_Instruction arg) {
730 os << "SET_8_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
731 },
732 [&](SET_16_Instruction arg) {
733 os << "SET_16_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
734 },
735 [&](SET_32_Instruction arg) {
736 os << "SET_32_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
737 },
738 [&](SET_64_Instruction arg) {
739 os << "SET_64_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
740 },
741 [&](SET_128_Instruction arg) {
742 os << "SET_128_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value_high
743 << " " << arg.value_low;
744 },
745 [&](SET_FF_Instruction arg) {
746 os << "SET_FF_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
747 },
748 [&](SUB_8_Instruction arg) {
749 os << "SUB_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
750 },
751 [&](MUL_8_Instruction arg) {
752 os << "MUL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
753 },
754 [&](DIV_8_Instruction arg) {
755 os << "DIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
756 },
757 [&](FDIV_8_Instruction arg) {
758 os << "FDIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
759 },
760 [&](EQ_8_Instruction arg) {
761 os << "EQ_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
762 },
763 [&](LT_8_Instruction arg) {
764 os << "LT_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
765 },
766 [&](LTE_8_Instruction arg) {
767 os << "LTE_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
768 },
769 [&](AND_8_Instruction arg) {
770 os << "AND_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
771 },
772 [&](OR_8_Instruction arg) {
773 os << "OR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
774 },
775 [&](XOR_8_Instruction arg) {
776 os << "XOR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
777 },
778 [&](SHL_8_Instruction arg) {
779 os << "SHL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
780 },
781 [&](SHR_8_Instruction arg) {
782 os << "SHR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
783 },
784 [&](NOT_8_Instruction arg) { os << "NOT_8_Instruction " << arg.a_address << " " << arg.result_address; },
785 [&](ADD_16_Instruction arg) {
786 os << "ADD_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
787 },
788 [&](SUB_16_Instruction arg) {
789 os << "SUB_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
790 },
791 [&](MUL_16_Instruction arg) {
792 os << "MUL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
793 },
794 [&](DIV_16_Instruction arg) {
795 os << "DIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
796 },
797 [&](FDIV_16_Instruction arg) {
798 os << "FDIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
799 },
800 [&](EQ_16_Instruction arg) {
801 os << "EQ_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
802 },
803 [&](LT_16_Instruction arg) {
804 os << "LT_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
805 },
806 [&](LTE_16_Instruction arg) {
807 os << "LTE_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
808 },
809 [&](AND_16_Instruction arg) {
810 os << "AND_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
811 },
812 [&](OR_16_Instruction arg) {
813 os << "OR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
814 },
815 [&](XOR_16_Instruction arg) {
816 os << "XOR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
817 },
818 [&](NOT_16_Instruction arg) { os << "NOT_16_Instruction " << arg.a_address << " " << arg.result_address; },
819 [&](SHL_16_Instruction arg) {
820 os << "SHL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
821 },
822 [&](SHR_16_Instruction arg) {
823 os << "SHR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
824 },
825 [&](CAST_8_Instruction arg) {
826 os << "CAST_8_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address << " "
827 << arg.target_tag;
828 },
829 [&](CAST_16_Instruction arg) {
830 os << "CAST_16_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address
831 << " " << arg.target_tag;
832 },
833 [&](MOV_8_Instruction arg) {
834 os << "MOV_8_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
835 },
836 [&](MOV_16_Instruction arg) {
837 os << "MOV_16_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
838 },
839 [&](SSTORE_Instruction arg) {
840 os << "SSTORE_Instruction " << arg.src_address << " " << arg.result_address << " " << arg.slot;
841 },
842 [&](SLOAD_Instruction arg) { os << "SLOAD_Instruction " << arg.slot_address << " " << arg.result_address; },
843 [&](GETENVVAR_Instruction arg) {
844 os << "GETENVVAR_Instruction " << arg.result_address << " " << static_cast<int>(arg.type);
845 },
846 [&](EMITNULLIFIER_Instruction arg) { os << "EMITNULIFIER_Instruction " << arg.nullifier_address; },
848 os << "NULLIFIEREXISTS_Instruction " << arg.siloed_nullifier_address << " " << arg.result_address;
849 },
851 os << "L1TOL2MSGEXISTS_Instruction " << arg.msg_hash_address << " " << arg.leaf_index_address << " "
852 << arg.result_address;
853 },
854 [&](EMITNOTEHASH_Instruction arg) {
855 os << "EMITNOTEHASH_Instruction " << arg.note_hash_address << " " << arg.note_hash;
856 },
858 os << "NOTEHASHEXISTS_Instruction " << arg.notehash_address << " " << arg.notehash_address << " "
859 << arg.leaf_index_address << " " << arg.result_address;
860 },
861 [&](CALLDATACOPY_Instruction arg) {
862 os << "CALLDATACOPY_Instruction " << arg.copy_size_address << " " << arg.cd_offset_address << " "
863 << arg.dst_address;
864 },
866 os << "SENDL2TOL1MSG_Instruction " << arg.recipient_address << " " << arg.content_address;
867 },
869 os << "EMITPUBLICLOG_Instruction " << arg.log_size_address << " " << arg.log_values_address;
870 },
871 [&](CALL_Instruction arg) {
872 os << "CALL_Instruction " << arg.l2_gas_address << " " << arg.da_gas_address << " "
873 << arg.contract_address_address << " " << arg.calldata_size_address << " " << arg.calldata_address
874 << " " << arg.is_static_call;
875 },
876 [&](RETURNDATASIZE_Instruction arg) { os << "RETURNDATASIZE_Instruction " << arg.dst_address; },
878 os << "RETURNDATACOPY_Instruction " << arg.copy_size_address << " " << arg.rd_offset_address << " "
879 << arg.dst_address;
880 },
881 [&](ECADD_Instruction arg) {
882 os << "ECADD_Instruction " << arg.p1_x << " " << arg.p1_y << " " << arg.p2_x << " " << arg.p2_y << " "
883 << arg.result;
884 },
886 os << "POSEIDON2PERM_Instruction " << arg.src_address << " " << arg.dst_address;
887 },
888 [&](KECCAKF1600_Instruction arg) {
889 os << "KECCAKF1600_Instruction " << arg.src_address << " " << arg.dst_address;
890 },
892 os << "SHA256COMPRESSION_Instruction " << arg.state_address << " " << arg.input_address << " "
893 << arg.dst_address;
894 },
895 [&](TORADIXBE_Instruction arg) {
896 os << "TORADIXBE_Instruction " << arg.value_address << " " << arg.radix_address << " "
897 << arg.num_limbs_address << " " << arg.output_bits_address << " " << arg.dst_address << " "
898 << arg.is_output_bits;
899 },
900 [&](DEBUGLOG_Instruction arg) {
901 os << "DEBUGLOG_Instruction " << arg.level_offset << " " << arg.message_offset << " "
902 << arg.fields_offset << " " << arg.fields_size_offset << " " << arg.message_size;
903 },
904 [&](auto) { os << "Unknown instruction"; },
905 },
907 return os;
908}
::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, p2_x, p2_y, 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