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
7#include "barretenberg/aztec/aztec_constants.hpp"
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::EMITPUBLICLOG, .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) {
112 return AVM_SUBTRACE_ID_EXECUTION;
113 case SubtraceSel::ALU:
114 return AVM_SUBTRACE_ID_ALU;
116 return AVM_SUBTRACE_ID_BITWISE;
118 return AVM_SUBTRACE_ID_CAST;
120 return AVM_SUBTRACE_ID_CALLDATA_COPY;
122 return AVM_SUBTRACE_ID_RETURNDATA_COPY;
123 case SubtraceSel::SET:
124 return AVM_SUBTRACE_ID_SET;
126 return AVM_SUBTRACE_ID_GETCONTRACTINSTANCE;
128 return AVM_SUBTRACE_ID_EMITPUBLICLOG;
130 return AVM_SUBTRACE_ID_POSEIDON2_PERM;
132 return AVM_SUBTRACE_ID_SHA256_COMPRESSION;
134 return AVM_SUBTRACE_ID_KECCAKF1600;
135 case SubtraceSel::ECC:
136 return AVM_SUBTRACE_ID_ECC;
138 return AVM_SUBTRACE_ID_TO_RADIX;
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_public_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) {
191 case AVM_DYN_GAS_ID_CALLDATACOPY:
192 return C::execution_sel_gas_calldata_copy;
193 case AVM_DYN_GAS_ID_RETURNDATACOPY:
194 return C::execution_sel_gas_returndata_copy;
195 case AVM_DYN_GAS_ID_TORADIX:
196 return C::execution_sel_gas_to_radix;
197 case AVM_DYN_GAS_ID_EMITPUBLICLOG:
198 return C::execution_sel_gas_emit_public_log;
199 case AVM_DYN_GAS_ID_SSTORE:
200 return C::execution_sel_gas_sstore;
201 default:
202 BB_ASSERT(false, "Invalid dynamic gas id");
203 }
204
205 // This is just to please gcc.
206 __builtin_unreachable();
207}
208
209} // namespace bb::avm2::tracegen
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
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