Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
instruction_spec.cpp
Go to the documentation of this file.
2
3#include <array>
4#include <cstdint>
5#include <unordered_map>
6
9
10namespace bb::avm2::tracegen {
11
12// Map each ExecutionOpcode to a SubtraceInfo - ordered to match ExecutionOpCode enum
14{
15 static const std::unordered_map<ExecutionOpCode, SubtraceInfo> SUBTRACE_INFO_MAP = {
17 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_ADD } },
19 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SUB } },
21 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_MUL } },
23 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_DIV } },
25 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_FDIV } },
27 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_EQ } },
29 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_LT } },
31 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_LTE } },
33 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_AND_OP_ID } },
35 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_OR_OP_ID } },
37 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_XOR_OP_ID } },
39 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_NOT } },
41 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SHL } },
43 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SHR } },
44 { ExecutionOpCode::CAST, { .subtrace_selector = SubtraceSel::CAST, .subtrace_operation_id = 0 } },
46 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_GETENVVAR } },
48 { .subtrace_selector = SubtraceSel::CALLDATACOPY, .subtrace_operation_id = 0 } },
50 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SUCCESSCOPY } },
52 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURNDATASIZE } },
54 { .subtrace_selector = SubtraceSel::RETURNDATACOPY, .subtrace_operation_id = 0 } },
56 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_JUMP } },
58 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_JUMPI } },
60 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_INTERNALCALL } },
62 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_INTERNALRETURN } },
63 { ExecutionOpCode::SET, { .subtrace_selector = SubtraceSel::SET, .subtrace_operation_id = 0 } },
65 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_MOV } },
67 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SLOAD } },
69 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SSTORE } },
71 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_NOTEHASH_EXISTS } },
73 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_EMIT_NOTEHASH } },
75 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_NULLIFIER_EXISTS } },
77 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_EMIT_NULLIFIER } },
79 { .subtrace_selector = SubtraceSel::EXECUTION,
80 .subtrace_operation_id = AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS } },
82 { .subtrace_selector = SubtraceSel::GETCONTRACTINSTANCE, .subtrace_operation_id = 0 } },
84 { .subtrace_selector = SubtraceSel::EMITUNENCRYPTEDLOG, .subtrace_operation_id = 0 } },
86 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SENDL2TOL1MSG } },
88 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_CALL } },
90 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_STATICCALL } },
92 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURN } },
94 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_REVERT } },
96 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_DEBUGLOG } },
98 { .subtrace_selector = SubtraceSel::POSEIDON2PERM, .subtrace_operation_id = 0 } },
100 { .subtrace_selector = SubtraceSel::SHA256COMPRESSION, .subtrace_operation_id = 0 } },
101 { ExecutionOpCode::KECCAKF1600, { .subtrace_selector = SubtraceSel::KECCAKF1600, .subtrace_operation_id = 0 } },
102 { ExecutionOpCode::ECADD, { .subtrace_selector = SubtraceSel::ECC, .subtrace_operation_id = 0 } },
103 { ExecutionOpCode::TORADIXBE, { .subtrace_selector = SubtraceSel::TORADIXBE, .subtrace_operation_id = 0 } },
104 };
105 return SUBTRACE_INFO_MAP;
106}
107
109{
110 switch (subtrace_sel) {
113 case SubtraceSel::ALU:
114 return AVM_SUBTRACE_ID_ALU;
123 case SubtraceSel::SET:
124 return AVM_SUBTRACE_ID_SET;
135 case SubtraceSel::ECC:
136 return AVM_SUBTRACE_ID_ECC;
139 }
140
141 // clangd will complain if we miss a case.
142 // This is just to please gcc.
143 __builtin_unreachable();
144}
145
147{
148 using C = Column;
149
150 switch (subtrace_sel) {
152 return C::execution_sel_exec_dispatch_execution;
153 case SubtraceSel::ALU:
154 return C::execution_sel_exec_dispatch_alu;
156 return C::execution_sel_exec_dispatch_bitwise;
158 return C::execution_sel_exec_dispatch_cast;
160 return C::execution_sel_exec_dispatch_calldata_copy;
162 return C::execution_sel_exec_dispatch_returndata_copy;
163 case SubtraceSel::SET:
164 return C::execution_sel_exec_dispatch_set;
166 return C::execution_sel_exec_dispatch_get_contract_instance;
168 return C::execution_sel_exec_dispatch_emit_unencrypted_log;
170 return C::execution_sel_exec_dispatch_poseidon2_perm;
172 return C::execution_sel_exec_dispatch_sha256_compression;
174 return C::execution_sel_exec_dispatch_keccakf1600;
175 case SubtraceSel::ECC:
176 return C::execution_sel_exec_dispatch_ecc_add;
178 return C::execution_sel_exec_dispatch_to_radix;
179 }
180
181 // clangd will complain if we miss a case.
182 // This is just to please gcc.
183 __builtin_unreachable();
184}
185
186Column get_dyn_gas_selector(uint32_t dyn_gas_id)
187{
188 using C = Column;
189
190 switch (dyn_gas_id) {
192 return C::execution_sel_gas_calldata_copy;
194 return C::execution_sel_gas_returndata_copy;
196 return C::execution_sel_gas_to_radix;
198 return C::execution_sel_gas_bitwise;
200 return C::execution_sel_gas_emit_unencrypted_log;
202 return C::execution_sel_gas_sstore;
203 default:
204 assert(false && "Invalid dynamic gas id");
205 }
206
207 // This is just to please gcc.
208 __builtin_unreachable();
209}
210
211} // namespace bb::avm2::tracegen
#define AVM_EXEC_OP_ID_SUCCESSCOPY
#define AVM_DYN_GAS_ID_RETURNDATACOPY
#define AVM_EXEC_OP_ID_NULLIFIER_EXISTS
#define AVM_EXEC_OP_ID_SSTORE
#define AVM_BITWISE_AND_OP_ID
#define AVM_EXEC_OP_ID_EMIT_NULLIFIER
#define AVM_BITWISE_OR_OP_ID
#define AVM_SUBTRACE_ID_BITWISE
#define AVM_SUBTRACE_ID_SET
#define AVM_SUBTRACE_ID_ECC
#define AVM_DYN_GAS_ID_SSTORE
#define AVM_SUBTRACE_ID_GETCONTRACTINSTANCE
#define AVM_EXEC_OP_ID_ALU_LTE
#define AVM_SUBTRACE_ID_CAST
#define AVM_SUBTRACE_ID_RETURNDATA_COPY
#define AVM_EXEC_OP_ID_NOTEHASH_EXISTS
#define AVM_DYN_GAS_ID_TORADIX
#define AVM_EXEC_OP_ID_SLOAD
#define AVM_EXEC_OP_ID_RETURN
#define AVM_EXEC_OP_ID_ALU_DIV
#define AVM_EXEC_OP_ID_INTERNALCALL
#define AVM_SUBTRACE_ID_SHA256_COMPRESSION
#define AVM_EXEC_OP_ID_ALU_ADD
#define AVM_EXEC_OP_ID_STATICCALL
#define AVM_EXEC_OP_ID_JUMP
#define AVM_EXEC_OP_ID_ALU_SHL
#define AVM_EXEC_OP_ID_DEBUGLOG
#define AVM_EXEC_OP_ID_ALU_EQ
#define AVM_EXEC_OP_ID_ALU_SUB
#define AVM_SUBTRACE_ID_TO_RADIX
#define AVM_BITWISE_XOR_OP_ID
#define AVM_SUBTRACE_ID_KECCAKF1600
#define AVM_EXEC_OP_ID_EMIT_NOTEHASH
#define AVM_DYN_GAS_ID_CALLDATACOPY
#define AVM_EXEC_OP_ID_REVERT
#define AVM_EXEC_OP_ID_ALU_NOT
#define AVM_EXEC_OP_ID_MOV
#define AVM_DYN_GAS_ID_EMITUNENCRYPTEDLOG
#define AVM_DYN_GAS_ID_BITWISE
#define AVM_SUBTRACE_ID_ALU
#define AVM_SUBTRACE_ID_CALLDATA_COPY
#define AVM_EXEC_OP_ID_ALU_MUL
#define AVM_EXEC_OP_ID_SENDL2TOL1MSG
#define AVM_EXEC_OP_ID_RETURNDATASIZE
#define AVM_EXEC_OP_ID_CALL
#define AVM_EXEC_OP_ID_JUMPI
#define AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS
#define AVM_EXEC_OP_ID_GETENVVAR
#define AVM_SUBTRACE_ID_POSEIDON2_PERM
#define AVM_EXEC_OP_ID_ALU_FDIV
#define AVM_EXEC_OP_ID_ALU_SHR
#define AVM_EXEC_OP_ID_ALU_LT
#define AVM_SUBTRACE_ID_EMITUNENCRYPTEDLOG
#define AVM_EXEC_OP_ID_INTERNALRETURN
#define AVM_SUBTRACE_ID_EXECUTION
Column get_dyn_gas_selector(uint32_t dyn_gas_id)
Get the column selector for a given dynamic gas ID.
const std::unordered_map< ExecutionOpCode, SubtraceInfo > & get_subtrace_info_map()
Column get_subtrace_selector(SubtraceSel subtrace_sel)
Get the column selector for a given subtrace selector.
FF get_subtrace_id(SubtraceSel subtrace_sel)
Get the subtrace ID for a given subtrace enum.
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13