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
15 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_ADD } },
17 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SUB } },
19 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_MUL } },
21 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_DIV } },
23 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_FDIV } },
24 { ExecutionOpCode::EQ, { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_EQ } },
25 { ExecutionOpCode::LT, { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_LT } },
27 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_LTE } },
29 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_AND_OP_ID } },
31 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_OR_OP_ID } },
33 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_XOR_OP_ID } },
35 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_NOT } },
37 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SHL } },
39 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SHR } },
41 { .subtrace_selector = SubtraceSel::CAST, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_TRUNCATE } },
43 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_GETENVVAR } },
44 { ExecutionOpCode::CALLDATACOPY, { .subtrace_selector = SubtraceSel::CALLDATACOPY, .subtrace_operation_id = 0 } },
46 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SUCCESSCOPY } },
48 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURNDATASIZE } },
50 { .subtrace_selector = SubtraceSel::RETURNDATACOPY, .subtrace_operation_id = 0 } },
52 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_JUMP } },
54 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_JUMPI } },
56 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_INTERNALCALL } },
58 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_INTERNALRETURN } },
60 { .subtrace_selector = SubtraceSel::SET, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_TRUNCATE } },
62 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_MOV } },
64 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SLOAD } },
66 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SSTORE } },
68 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_NOTEHASH_EXISTS } },
70 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_EMIT_NOTEHASH } },
72 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_NULLIFIER_EXISTS } },
74 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_EMIT_NULLIFIER } },
76 { .subtrace_selector = SubtraceSel::EXECUTION,
77 .subtrace_operation_id = AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS } },
79 { .subtrace_selector = SubtraceSel::GETCONTRACTINSTANCE, .subtrace_operation_id = 0 } },
81 { .subtrace_selector = SubtraceSel::EMITUNENCRYPTEDLOG, .subtrace_operation_id = 0 } },
83 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SENDL2TOL1MSG } },
85 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_CALL } },
87 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_STATICCALL } },
89 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURN } },
91 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_REVERT } },
93 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_DEBUGLOG } },
94 { ExecutionOpCode::POSEIDON2PERM, { .subtrace_selector = SubtraceSel::POSEIDON2PERM, .subtrace_operation_id = 0 } },
96 { .subtrace_selector = SubtraceSel::SHA256COMPRESSION, .subtrace_operation_id = 0 } },
97 { ExecutionOpCode::KECCAKF1600, { .subtrace_selector = SubtraceSel::KECCAKF1600, .subtrace_operation_id = 0 } },
98 { ExecutionOpCode::ECADD, { .subtrace_selector = SubtraceSel::ECC, .subtrace_operation_id = 0 } },
99 { ExecutionOpCode::TORADIXBE, { .subtrace_selector = SubtraceSel::TORADIXBE, .subtrace_operation_id = 0 } },
100};
101
103{
104 switch (subtrace_sel) {
107 case SubtraceSel::ALU:
108 return AVM_SUBTRACE_ID_ALU;
117 case SubtraceSel::SET:
118 return AVM_SUBTRACE_ID_SET;
129 case SubtraceSel::ECC:
130 return AVM_SUBTRACE_ID_ECC;
133 }
134
135 // clangd will complain if we miss a case.
136 // This is just to please gcc.
137 __builtin_unreachable();
138}
139
141{
142 using C = Column;
143
144 switch (subtrace_sel) {
146 return C::execution_sel_exec_dispatch_execution;
147 case SubtraceSel::ALU:
148 return C::execution_sel_exec_dispatch_alu;
150 return C::execution_sel_exec_dispatch_bitwise;
152 return C::execution_sel_exec_dispatch_cast;
154 return C::execution_sel_exec_dispatch_calldata_copy;
156 return C::execution_sel_exec_dispatch_returndata_copy;
157 case SubtraceSel::SET:
158 return C::execution_sel_exec_dispatch_set;
160 return C::execution_sel_exec_dispatch_get_contract_instance;
162 return C::execution_sel_exec_dispatch_emit_unencrypted_log;
164 return C::execution_sel_exec_dispatch_poseidon2_perm;
166 return C::execution_sel_exec_dispatch_sha256_compression;
168 return C::execution_sel_exec_dispatch_keccakf1600;
169 case SubtraceSel::ECC:
170 return C::execution_sel_exec_dispatch_ecc_add;
172 return C::execution_sel_exec_dispatch_to_radix;
173 }
174
175 // clangd will complain if we miss a case.
176 // This is just to please gcc.
177 __builtin_unreachable();
178}
179
180Column get_dyn_gas_selector(uint32_t dyn_gas_id)
181{
182 using C = Column;
183
184 switch (dyn_gas_id) {
186 return C::execution_sel_gas_calldata_copy;
188 return C::execution_sel_gas_returndata_copy;
190 return C::execution_sel_gas_to_radix;
192 return C::execution_sel_gas_bitwise;
194 return C::execution_sel_gas_emit_unencrypted_log;
196 return C::execution_sel_gas_sstore;
197 default:
198 assert(false && "Invalid dynamic gas id");
199 }
200
201 // This is just to please gcc.
202 __builtin_unreachable();
203}
204
205} // 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_EXEC_OP_ID_ALU_TRUNCATE
#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
const std::unordered_map< ExecutionOpCode, SubtraceInfo > SUBTRACE_INFO_MAP
Column get_dyn_gas_selector(uint32_t dyn_gas_id)
Get the column selector for a given dynamic gas ID.
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