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
116
131
133
144
152
160
168
176
183
191
199
207
215
223
231
237
245
253
261
269
277
285
294
302
310
318
326
334
342
350
357
365
373
381
389
397
405
411
419
427
436
445
453
456 uint16_t slot_index; // index of the slot in memory_manager.storage_addresses
457 AddressRef slot_address; // address where we set slot value
460};
461
465 // msgpack cannot pack enum classes, so we pack that as a uint8_t
466 // 0 -> ADDRESS, 1 -> SENDER, 2 -> TRANSACTIONFEE, 3 -> CHAINID, 4 -> VERSION, 5 -> BLOCKNUMBER, 6 -> TIMESTAMP,
467 // 7 -> MINFEEPERDAGAS, 8 -> MINFEEPERL2GAS, 9 -> ISSTATICCALL, 10 -> L2GASLEFT, 11 -> DAGASLEFT
468 uint8_t type;
470};
471
477
487
496
503
510 // index of the note hash in the memory_manager.emitted_note_hashes
512 // absolute address where the note hash will be stored
514 // absolute address where the leaf index will be stored
516 // absolute address where the result will be stored
519};
520
531
539
545
564
566// M[copySizeOffset] = nestedReturndata.size()
567// M[dstOffset:dstOffset+M[copySizeOffset]] =
577
584
589
600
608
616
626
630 ParamRef value_address; // FF: value to convert
631 ParamRef radix_address; // U32: the radix/base
632 ParamRef num_limbs_address; // U32: number of output limbs
633 ParamRef output_bits_address; // U1: whether output is bits
634 AddressRef dst_address; // destination for limbs
635 bool is_output_bits; // known at generation time for memory tracking (U1 if true, U8 if false)
637};
638
697
698template <class... Ts> struct overloaded : Ts... {
699 using Ts::operator()...;
700};
701template <class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
702
703inline std::ostream& operator<<(std::ostream& os, const MemoryTagWrapper& tag)
704{
705 os << tag.value;
706 return os;
707}
708
709inline std::ostream& operator<<(std::ostream& os, const VariableRef& variable)
710{
711 os << "VariableRef " << variable.tag << " " << variable.index << " " << variable.base_offset_seed << " "
712 << static_cast<int>(static_cast<AddressingMode>(variable.mode));
713 return os;
714}
715
716inline std::ostream& operator<<(std::ostream& os, const AddressRef& result_address)
717{
718 os << "AddressRef " << result_address.address << " "
719 << static_cast<int>(static_cast<AddressingMode>(result_address.mode));
720 return os;
721}
722
723inline std::ostream& operator<<(std::ostream& os, const ParamRef& param)
724{
725 std::visit([&](auto&& arg) { os << arg; }, param);
726 return os;
727}
728
729inline std::ostream& operator<<(std::ostream& os, const FuzzInstruction& instruction)
730{
731 std::visit(
733 [&](ADD_8_Instruction arg) {
734 os << "ADD_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
735 },
736 [&](SET_8_Instruction arg) {
737 os << "SET_8_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
738 },
739 [&](SET_16_Instruction arg) {
740 os << "SET_16_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
741 },
742 [&](SET_32_Instruction arg) {
743 os << "SET_32_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
744 },
745 [&](SET_64_Instruction arg) {
746 os << "SET_64_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
747 },
748 [&](SET_128_Instruction arg) {
749 os << "SET_128_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value_high
750 << " " << arg.value_low;
751 },
752 [&](SET_FF_Instruction arg) {
753 os << "SET_FF_Instruction " << arg.value_tag << " " << arg.result_address << " " << arg.value;
754 },
755 [&](SUB_8_Instruction arg) {
756 os << "SUB_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
757 },
758 [&](MUL_8_Instruction arg) {
759 os << "MUL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
760 },
761 [&](DIV_8_Instruction arg) {
762 os << "DIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
763 },
764 [&](FDIV_8_Instruction arg) {
765 os << "FDIV_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
766 },
767 [&](EQ_8_Instruction arg) {
768 os << "EQ_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
769 },
770 [&](LT_8_Instruction arg) {
771 os << "LT_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
772 },
773 [&](LTE_8_Instruction arg) {
774 os << "LTE_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
775 },
776 [&](AND_8_Instruction arg) {
777 os << "AND_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
778 },
779 [&](OR_8_Instruction arg) {
780 os << "OR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
781 },
782 [&](XOR_8_Instruction arg) {
783 os << "XOR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
784 },
785 [&](SHL_8_Instruction arg) {
786 os << "SHL_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
787 },
788 [&](SHR_8_Instruction arg) {
789 os << "SHR_8_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
790 },
791 [&](NOT_8_Instruction arg) { os << "NOT_8_Instruction " << arg.a_address << " " << arg.result_address; },
792 [&](ADD_16_Instruction arg) {
793 os << "ADD_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
794 },
795 [&](SUB_16_Instruction arg) {
796 os << "SUB_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
797 },
798 [&](MUL_16_Instruction arg) {
799 os << "MUL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
800 },
801 [&](DIV_16_Instruction arg) {
802 os << "DIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
803 },
804 [&](FDIV_16_Instruction arg) {
805 os << "FDIV_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
806 },
807 [&](EQ_16_Instruction arg) {
808 os << "EQ_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
809 },
810 [&](LT_16_Instruction arg) {
811 os << "LT_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
812 },
813 [&](LTE_16_Instruction arg) {
814 os << "LTE_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
815 },
816 [&](AND_16_Instruction arg) {
817 os << "AND_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
818 },
819 [&](OR_16_Instruction arg) {
820 os << "OR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
821 },
822 [&](XOR_16_Instruction arg) {
823 os << "XOR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
824 },
825 [&](NOT_16_Instruction arg) { os << "NOT_16_Instruction " << arg.a_address << " " << arg.result_address; },
826 [&](SHL_16_Instruction arg) {
827 os << "SHL_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
828 },
829 [&](SHR_16_Instruction arg) {
830 os << "SHR_16_Instruction " << arg.a_address << " " << arg.b_address << " " << arg.result_address;
831 },
832 [&](CAST_8_Instruction arg) {
833 os << "CAST_8_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address << " "
834 << arg.target_tag;
835 },
836 [&](CAST_16_Instruction arg) {
837 os << "CAST_16_Instruction " << arg.src_tag << " " << arg.src_address << " " << arg.result_address
838 << " " << arg.target_tag;
839 },
840 [&](MOV_8_Instruction arg) {
841 os << "MOV_8_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
842 },
843 [&](MOV_16_Instruction arg) {
844 os << "MOV_16_Instruction " << arg.value_tag << " " << arg.src_address << " " << arg.result_address;
845 },
846 [&](SSTORE_Instruction arg) {
847 os << "SSTORE_Instruction " << arg.src_address << " " << arg.result_address << " " << arg.slot;
848 },
849 [&](SLOAD_Instruction arg) { os << "SLOAD_Instruction " << arg.slot_address << " " << arg.result_address; },
850 [&](GETENVVAR_Instruction arg) {
851 os << "GETENVVAR_Instruction " << arg.result_address << " " << static_cast<int>(arg.type);
852 },
853 [&](EMITNULLIFIER_Instruction arg) { os << "EMITNULIFIER_Instruction " << arg.nullifier_address; },
855 os << "NULLIFIEREXISTS_Instruction " << arg.nullifier_address << " " << arg.contract_address_address
856 << " " << arg.result_address;
857 },
859 os << "L1TOL2MSGEXISTS_Instruction " << arg.msg_hash_address << " " << arg.leaf_index_address << " "
860 << arg.result_address;
861 },
862 [&](EMITNOTEHASH_Instruction arg) {
863 os << "EMITNOTEHASH_Instruction " << arg.note_hash_address << " " << arg.note_hash;
864 },
866 os << "NOTEHASHEXISTS_Instruction " << arg.notehash_address << " " << arg.notehash_address << " "
867 << arg.leaf_index_address << " " << arg.result_address;
868 },
869 [&](CALLDATACOPY_Instruction arg) {
870 os << "CALLDATACOPY_Instruction " << arg.dst_address << " " << static_cast<int>(arg.copy_size) << " "
871 << arg.copy_size_address << " " << arg.cd_start_address << " " << arg.cd_start_address;
872 },
874 os << "SENDL2TOL1MSG_Instruction " << arg.recipient << " " << arg.recipient_address << " "
875 << arg.content << " " << arg.content_address;
876 },
878 os << "EMITUNENCRYPTEDLOG_Instruction " << arg.log_size_address << " " << arg.log_values_address;
879 },
880 [&](CALL_Instruction arg) {
881 os << "CALL_Instruction " << arg.l2_gas_address << " " << arg.da_gas_address << " "
882 << arg.contract_address_address << " " << arg.calldata_size_address << " " << arg.calldata_address
883 << " " << arg.is_static_call;
884 },
886 os << "RETURNDATASIZE_WITH_RETURNDATACOPY_Instruction " << arg.copy_size_offset << " "
887 << arg.dst_address << " " << arg.rd_start_offset;
888 },
889 [&](ECADD_Instruction arg) {
890 os << "ECADD_Instruction " << arg.p1_x << " " << arg.p1_y << " " << arg.p1_infinite << " " << arg.p2_x
891 << " " << arg.p2_y << " " << arg.p2_infinite << " " << arg.result;
892 },
894 os << "POSEIDON2PERM_Instruction " << arg.src_address << " " << arg.dst_address;
895 },
896 [&](KECCAKF1600_Instruction arg) {
897 os << "KECCAKF1600_Instruction " << arg.src_address << " " << arg.dst_address;
898 },
900 os << "SHA256COMPRESSION_Instruction " << arg.state_address << " " << arg.input_address << " "
901 << arg.dst_address;
902 },
903 [&](TORADIXBE_Instruction arg) {
904 os << "TORADIXBE_Instruction " << arg.value_address << " " << arg.radix_address << " "
905 << arg.num_limbs_address << " " << arg.output_bits_address << " " << arg.dst_address << " "
906 << arg.is_output_bits;
907 },
908 [&](auto) { os << "Unknown instruction"; },
909 },
911 return os;
912}
::FuzzInstruction FuzzInstruction
std::ostream & operator<<(std::ostream &os, const MemoryTagWrapper &tag)
bb::avm2::MemoryTag MemoryTag
AddressingMode
std::variant< VariableRef, AddressRef > ParamRef
Instruction instruction
ValueTag MemoryTag
AvmFlavorSettings::FF FF
Definition field.hpp:10
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
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] + mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] & mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
MSGPACK_FIELDS(address, pointer_address_seed, base_offset_seed, mode)
AddressingModeWrapper mode
uint32_t base_offset_seed
A seed for the generation of the base offset Used for Relative/IndirectRelative modes only Sets M[0] ...
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
AddressRef calldata_size_address
MSGPACK_FIELDS(l2_gas_address, da_gas_address, contract_address_address, calldata_address, calldata_size_address, calldata_size, is_static_call)
ParamRef l2_gas_address
ParamRef calldata_address
CALLDATACOPY: M[dstOffset:dstOffset+M[copySizeOffset]] = calldata[M[cdStartOffset]:M[cdStartOffset]+M...
MSGPACK_FIELDS(dst_address, copy_size, copy_size_address, cd_start, cd_start_address)
CAST_16: cast mem[src_offset_index] to target_tag and store at dst_offset.
AddressRef result_address
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
MemoryTagWrapper target_tag
MemoryTagWrapper src_tag
CAST_8: cast mem[src_offset_index] to target_tag and store at dst_offset.
MSGPACK_FIELDS(src_tag, src_address, result_address, target_tag)
AddressRef result_address
MemoryTagWrapper src_tag
MemoryTagWrapper target_tag
mem[result_offset] = mem[a_address] / mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] / mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_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.
MSGPACK_FIELDS(note_hash_address, note_hash)
EMITNULIFIER: inserts new nullifier to the nullifier tree.
MSGPACK_FIELDS(nullifier_address)
MSGPACK_FIELDS(log_size_address, log_values_address)
mem[result_offset] = mem[a_address] == mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] == mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
MSGPACK_FIELDS(contract_address_address, member_enum, dst_address)
GETENVVAR: M[result_offset] = getenvvar(type)
MSGPACK_FIELDS(result_address, type)
KECCAKF1600: Perform Keccak-f[1600] permutation on 25 U64 values M[dst_address:dst_address+25] = kecc...
MSGPACK_FIELDS(src_address, dst_address)
L1TOL2MSGEXISTS: Check if a L1 to L2 message exists M[result_address] = L1TOL2MSGEXISTS(M[msg_hash_ad...
MSGPACK_FIELDS(msg_hash_address, leaf_index_address, result_address)
mem[result_offset] = mem[a_address] < mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] < mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] <= mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] <= mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MOV_16 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
AddressRef result_address
MOV_8 instruction: mem[dst_offset] = mem[src_offset].
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, src_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address] (16-bit)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] * mem[b_address]
AddressRef result_address
MSGPACK_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)
MSGPACK_FIELDS(a_address, result_address)
AddressRef result_address
AddressRef result_address
MSGPACK_FIELDS(a_address, result_address)
NOTEHASHEXISTS: M[result_offset] = NOTEHASHEXISTS(M[notehash_offset], M[leaf_index_offset]) len = len...
MSGPACK_FIELDS(notehash_index, notehash_address, leaf_index_address, result_address)
NULLIFIEREXISTS: checks if nullifier exists in the nullifier tree Gets contract's address by GETENVVA...
MSGPACK_FIELDS(nullifier_address, contract_address_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] | mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
POSEIDON2PERM: Perform Poseidon2 permutation on 4 FF values M[dst_address:dst_address+4] = poseidon2_...
MSGPACK_FIELDS(src_address, dst_address)
: RETURNDATASIZE + RETURNDATACOPY:
MSGPACK_FIELDS(copy_size_offset, dst_address, rd_start, rd_start_offset)
Output of resolving an address in the memory manager In order to resolve a given absolute address wit...
uint32_t operand_address
std::optional< uint32_t > base_pointer
uint32_t absolute_address
std::optional< uint32_t > pointer_address
MSGPACK_FIELDS(recipient, recipient_address, content, content_address)
SET_128 instruction.
MSGPACK_FIELDS(value_tag, result_address, value_low, value_high)
MemoryTagWrapper value_tag
AddressRef result_address
SET_16 instruction.
AddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
SET_32 instruction.
MSGPACK_FIELDS(value_tag, result_address, value)
AddressRef result_address
MemoryTagWrapper value_tag
SET_64 instruction.
AddressRef result_address
MSGPACK_FIELDS(value_tag, result_address, value)
MemoryTagWrapper value_tag
SET_8 instruction.
MemoryTagWrapper value_tag
MSGPACK_FIELDS(value_tag, result_address, value)
AddressRef result_address
SET_FF instruction.
MSGPACK_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...
MSGPACK_FIELDS(state_address, input_address, dst_address)
mem[result_offset] = mem[a_address] << mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] << mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] >> mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
SLOAD: M[slot_offset] = slot; M[result_offset] = S[M[slotOffset]].
MSGPACK_FIELDS(slot_index, slot_address, result_address)
AddressRef result_address
AddressRef slot_address
SSTORE: M[slot_offset_index] = slot; S[M[slotOffset]] = M[srcOffset].
AddressRef result_address
MSGPACK_FIELDS(src_address, result_address, slot)
mem[result_offset] = mem[a_address] - mem[b_address] (16-bit)
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
mem[result_offset] = mem[a_address] - mem[b_address]
AddressRef result_address
MSGPACK_FIELDS(a_address, b_address, result_address)
MSGPACK_FIELDS(dst_address)
TORADIXBE: Convert a field element to a vector of limbs in big-endian radix representation M[dst_addr...
MSGPACK_FIELDS(value_address, radix_address, num_limbs_address, output_bits_address, dst_address, is_output_bits)
AddressingModeWrapper mode
uint32_t base_offset_seed
A seed for the generation of the base offset Used for Relative/IndirectRelative modes only Sets M[0] ...
uint32_t index
Index of the variable in the memory_manager.stored_variables map.
MSGPACK_FIELDS(tag, index, pointer_address_seed, base_offset_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)
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address
mem[result_offset] = mem[a_address] ^ mem[b_address]
MSGPACK_FIELDS(a_address, b_address, result_address)
AddressRef result_address