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
13 // Map each ExecutionOpcode to a SubtraceInfo
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::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_NOT } },
31 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SHL } },
33 { .subtrace_selector = SubtraceSel::ALU, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_SHR } },
35 { .subtrace_selector = SubtraceSel::CAST, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_TRUNCATE } },
36 // Bitwise - note the bitwise subtrace operation id need to match the op id values in the bitwise precomputed table
38 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_AND_OP_ID } },
40 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_OR_OP_ID } },
42 { .subtrace_selector = SubtraceSel::BITWISE, .subtrace_operation_id = AVM_BITWISE_XOR_OP_ID } },
43 // Toradixbe
44 { ExecutionOpCode::TORADIXBE, { .subtrace_selector = SubtraceSel::TORADIXBE, .subtrace_operation_id = 0 } },
45 // ECC
46 { ExecutionOpCode::ECADD, { .subtrace_selector = SubtraceSel::ECC, .subtrace_operation_id = 0 } },
47 // Data Copy
48 { ExecutionOpCode::CALLDATACOPY, { .subtrace_selector = SubtraceSel::CALLDATACOPY, .subtrace_operation_id = 0 } },
50 { .subtrace_selector = SubtraceSel::RETURNDATACOPY, .subtrace_operation_id = 0 } },
51 // Poseidon2Perm
52 { ExecutionOpCode::POSEIDON2PERM, { .subtrace_selector = SubtraceSel::POSEIDON2PERM, .subtrace_operation_id = 0 } },
53 // Execution
55 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_GETENVVAR } },
57 { .subtrace_selector = SubtraceSel::SET, .subtrace_operation_id = AVM_EXEC_OP_ID_ALU_TRUNCATE } },
59 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_MOV } },
61 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_JUMP } },
63 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_JUMPI } },
65 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_CALL } },
67 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_STATICCALL } },
69 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_INTERNALCALL } },
71 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_INTERNALRETURN } },
73 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURN } },
75 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_REVERT } },
77 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SUCCESSCOPY } },
79 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURNDATASIZE } },
81 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_DEBUGLOG } },
82 // Hashes
83 { ExecutionOpCode::KECCAKF1600, { .subtrace_selector = SubtraceSel::KECCAKF1600, .subtrace_operation_id = 0 } },
84 { ExecutionOpCode::POSEIDON2PERM, { .subtrace_selector = SubtraceSel::POSEIDON2PERM, .subtrace_operation_id = 0 } },
86 { .subtrace_selector = SubtraceSel::SHA256COMPRESSION, .subtrace_operation_id = 0 } },
87 // Tree operations
89 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SLOAD } },
91 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SSTORE } },
93 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_NOTEHASH_EXISTS } },
95 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_NULLIFIER_EXISTS } },
97 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_EMIT_NULLIFIER } },
98 // Misc
100 { .subtrace_selector = SubtraceSel::GETCONTRACTINSTANCE, .subtrace_operation_id = 0 } },
102 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_EMIT_NOTEHASH } },
104 { .subtrace_selector = SubtraceSel::EXECUTION,
105 .subtrace_operation_id = AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS } },
106 // EC
107 { ExecutionOpCode::ECADD, { .subtrace_selector = SubtraceSel::ECC, .subtrace_operation_id = 0 } },
108 // Side effects
110 { .subtrace_selector = SubtraceSel::EMITUNENCRYPTEDLOG, .subtrace_operation_id = 0 } },
112 { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SENDL2TOL1MSG } },
113};
114
116{
117 switch (subtrace_sel) {
118 case SubtraceSel::ALU:
119 return AVM_SUBTRACE_ID_ALU;
122 case SubtraceSel::SET:
123 return AVM_SUBTRACE_ID_SET;
130 case SubtraceSel::ECC:
131 return AVM_SUBTRACE_ID_ECC;
146 }
147
148 // clangd will complain if we miss a case.
149 // This is just to please gcc.
150 __builtin_unreachable();
151}
152
154{
155 using C = Column;
156
157 switch (subtrace_sel) {
158 case SubtraceSel::ALU:
159 return C::execution_sel_execute_alu;
161 return C::execution_sel_execute_cast;
162 case SubtraceSel::SET:
163 return C::execution_sel_execute_set;
165 return C::execution_sel_execute_bitwise;
167 return C::execution_sel_execute_to_radix;
169 return C::execution_sel_execute_poseidon2_perm;
170 case SubtraceSel::ECC:
171 return C::execution_sel_execute_ecc_add;
173 return C::execution_sel_execute_calldata_copy;
175 return C::execution_sel_execute_returndata_copy;
177 return C::execution_sel_execute_execution;
179 return C::execution_sel_execute_keccakf1600;
181 return C::execution_sel_execute_get_contract_instance;
183 return C::execution_sel_execute_emit_unencrypted_log;
185 return C::execution_sel_execute_sha256_compression;
186 }
187
188 // clangd will complain if we miss a case.
189 // This is just to please gcc.
190 __builtin_unreachable();
191}
192
193Column get_dyn_gas_selector(uint32_t dyn_gas_id)
194{
195 using C = Column;
196
197 switch (dyn_gas_id) {
199 return C::execution_sel_gas_calldata_copy;
201 return C::execution_sel_gas_returndata_copy;
203 return C::execution_sel_gas_to_radix;
205 return C::execution_sel_gas_bitwise;
207 return C::execution_sel_gas_emit_unencrypted_log;
209 return C::execution_sel_gas_sstore;
210 default:
211 assert(false && "Invalid dynamic gas id");
212 }
213
214 // This is just to please gcc.
215 __builtin_unreachable();
216}
217
218} // 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_SUBTRACE_ID_POSEIDON_PERM
#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_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