Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
execution.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <memory>
5#include <span>
6#include <stack>
7#include <vector>
8
37
38namespace bb::avm2::simulation {
39
40// In charge of executing a single enqueued call.
42 public:
64 , alu(alu)
69 , sha256(sha256)
80 , ctx_stack_events(ctx_stack_emitter)
81 {}
82
83 ExecutionResult execute(std::unique_ptr<ContextInterface> enqueued_call_context) override;
84
85 // Opcode handlers. The order of the operands matters and should be the same as the wire format.
97 void set(ContextInterface& context, MemoryAddress dst_addr, uint8_t tag, const FF& value);
99 void jump(ContextInterface& context, uint32_t loc);
100 void jumpi(ContextInterface& context, MemoryAddress cond_addr, uint32_t loc);
102 MemoryAddress l2_gas_offset,
103 MemoryAddress da_gas_offset,
104 MemoryAddress addr,
105 MemoryAddress cd_size_offset,
108 MemoryAddress l2_gas_offset,
109 MemoryAddress da_gas_offset,
110 MemoryAddress addr,
111 MemoryAddress cd_size_offset,
113 void ret(ContextInterface& context, MemoryAddress ret_size_offset, MemoryAddress ret_offset);
114 void revert(ContextInterface& context, MemoryAddress rev_size_offset, MemoryAddress rev_offset);
116 MemoryAddress cd_size_offset,
120 MemoryAddress rd_size_offset,
121 MemoryAddress rd_offset,
124 void internal_call(ContextInterface& context, uint32_t loc);
129 MemoryAddress level_offset,
130 MemoryAddress message_offset,
131 MemoryAddress fields_offset,
132 MemoryAddress fields_size_offset,
133 uint16_t message_size);
138 void sstore(ContextInterface& context, MemoryAddress src_addr, MemoryAddress slot_addr);
140 MemoryAddress unique_note_hash_addr,
141 MemoryAddress leaf_index_addr,
144 MemoryAddress nullifier_offset,
145 MemoryAddress address_offset,
146 MemoryAddress exists_offset);
149 MemoryAddress address_offset,
150 MemoryAddress dst_offset,
151 uint8_t member_enum);
154 MemoryAddress msg_hash_addr,
155 MemoryAddress leaf_index_addr,
159 MemoryAddress p_x_addr,
160 MemoryAddress p_y_addr,
161 MemoryAddress p_inf_addr,
162 MemoryAddress q_x_addr,
163 MemoryAddress q_y_addr,
164 MemoryAddress q_inf_addr,
167 MemoryAddress value_addr,
168 MemoryAddress radix_addr,
169 MemoryAddress num_limbs_addr,
170 MemoryAddress is_output_bits_addr,
172 void emit_unencrypted_log(ContextInterface& context, MemoryAddress log_size_offset, MemoryAddress log_offset);
173 void send_l2_to_l1_msg(ContextInterface& context, MemoryAddress recipient_addr, MemoryAddress content_addr);
175 MemoryAddress output_addr,
176 MemoryAddress state_addr,
177 MemoryAddress input_addr);
180
181 protected:
182 // Only here for testing. TODO(fcarreiro): try to improve.
184
189 const std::vector<Operand>& resolved_operands);
190 template <typename... Ts>
191 void call_with_operands(void (Execution::*f)(ContextInterface&, Ts...),
193 const std::vector<Operand>& resolved_operands);
195
196 void handle_enter_call(ContextInterface& parent_context, std::unique_ptr<ContextInterface> child_context);
197 void handle_exit_call();
199
200 // TODO(#13683): This is leaking circuit implementation details. We should have a better way to do this.
201 // Setters for inputs and output for gadgets/subtraces. These are used for register allocation.
204 const std::vector<TaggedValue>& get_inputs() const { return inputs; }
205 const TaggedValue& get_output() const { return output; }
206
209
225
228
230
235};
236
237} // namespace bb::avm2::simulation
MemoryTag dst_tag
void lt(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void emit_note_hash(ContextInterface &context, MemoryAddress note_hash_addr)
void mov(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr)
const TaggedValue & get_output() const
void static_call(ContextInterface &context, MemoryAddress l2_gas_offset, MemoryAddress da_gas_offset, MemoryAddress addr, MemoryAddress cd_size_offset, MemoryAddress cd_offset)
void debug_log(ContextInterface &context, MemoryAddress level_offset, MemoryAddress message_offset, MemoryAddress fields_offset, MemoryAddress fields_size_offset, uint16_t message_size)
EventEmitterInterface< ExecutionEvent > & events
Execution(AluInterface &alu, BitwiseInterface &bitwise, DataCopyInterface &data_copy, Poseidon2Interface &poseidon2, EccInterface &ecc, ToRadixInterface &to_radix, Sha256Interface &sha256, ExecutionComponentsProviderInterface &execution_components, ContextProviderInterface &context_provider, const InstructionInfoDBInterface &instruction_info_db, ExecutionIdManagerInterface &execution_id_manager, EventEmitterInterface< ExecutionEvent > &event_emitter, EventEmitterInterface< ContextStackEvent > &ctx_stack_emitter, KeccakF1600Interface &keccakf1600, GreaterThanInterface &greater_than, GetContractInstanceInterface &get_contract_instance_component, EmitUnencryptedLogInterface &emit_unencrypted_log_component, DebugLoggerInterface &debug_log_component, HighLevelMerkleDBInterface &merkle_db)
Definition execution.hpp:43
void cd_copy(ContextInterface &context, MemoryAddress cd_size_offset, MemoryAddress cd_offset, MemoryAddress dst_addr)
std::unique_ptr< GasTrackerInterface > gas_tracker
void dispatch_opcode(ExecutionOpCode opcode, ContextInterface &context, const std::vector< Operand > &resolved_operands)
ExecutionComponentsProviderInterface & execution_components
void set(ContextInterface &context, MemoryAddress dst_addr, uint8_t tag, const FF &value)
void internal_return(ContextInterface &context)
void set_output(ExecutionOpCode opcode, TaggedValue output)
KeccakF1600Interface & keccakf1600
virtual GasTrackerInterface & get_gas_tracker()
void poseidon2_permutation(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr)
void success_copy(ContextInterface &context, MemoryAddress dst_addr)
void fdiv(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void jumpi(ContextInterface &context, MemoryAddress cond_addr, uint32_t loc)
void sub(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
Definition execution.cpp:61
void rd_copy(ContextInterface &context, MemoryAddress rd_size_offset, MemoryAddress rd_offset, MemoryAddress dst_addr)
void div(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
EventEmitterInterface< ContextStackEvent > & ctx_stack_events
void set_execution_result(ExecutionResult exec_result)
void ecc_add(ContextInterface &context, MemoryAddress p_x_addr, MemoryAddress p_y_addr, MemoryAddress p_inf_addr, MemoryAddress q_x_addr, MemoryAddress q_y_addr, MemoryAddress q_inf_addr, MemoryAddress dst_addr)
void keccak_permutation(ContextInterface &context, MemoryAddress dst_addr, MemoryAddress src_addr)
void jump(ContextInterface &context, uint32_t loc)
void sha256_compression(ContextInterface &context, MemoryAddress output_addr, MemoryAddress state_addr, MemoryAddress input_addr)
void ret(ContextInterface &context, MemoryAddress ret_size_offset, MemoryAddress ret_offset)
std::vector< TaggedValue > inputs
void op_not(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr)
void handle_exceptional_halt(ContextInterface &context)
void handle_enter_call(ContextInterface &parent_context, std::unique_ptr< ContextInterface > child_context)
void note_hash_exists(ContextInterface &context, MemoryAddress unique_note_hash_addr, MemoryAddress leaf_index_addr, MemoryAddress dst_addr)
ContextProviderInterface & context_provider
ExecutionResult execute(std::unique_ptr< ContextInterface > enqueued_call_context) override
void shl(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress c_addr)
void cast(ContextInterface &context, MemoryAddress src_addr, MemoryAddress dst_addr, uint8_t dst_tag)
void to_radix_be(ContextInterface &context, MemoryAddress value_addr, MemoryAddress radix_addr, MemoryAddress num_limbs_addr, MemoryAddress is_output_bits_addr, MemoryAddress dst_addr)
EmitUnencryptedLogInterface & emit_unencrypted_log_component
void eq(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
std::vector< Operand > resolve_operands(const Instruction &instruction, const ExecInstructionSpec &spec)
void call(ContextInterface &context, MemoryAddress l2_gas_offset, MemoryAddress da_gas_offset, MemoryAddress addr, MemoryAddress cd_size_offset, MemoryAddress cd_offset)
DataCopyInterface & data_copy
std::stack< std::unique_ptr< ContextInterface > > external_call_stack
GreaterThanInterface & greater_than
void set_and_validate_inputs(ExecutionOpCode opcode, std::vector< TaggedValue > inputs)
void revert(ContextInterface &context, MemoryAddress rev_size_offset, MemoryAddress rev_offset)
void rd_size(ContextInterface &context, MemoryAddress dst_addr)
void mul(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
Definition execution.cpp:81
void or_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
const std::vector< TaggedValue > & get_inputs() const
DebugLoggerInterface & debug_log_component
void xor_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
ExecutionResult get_execution_result() const
Poseidon2Interface & poseidon2
GetContractInstanceInterface & get_contract_instance_component
void lte(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
const InstructionInfoDBInterface & instruction_info_db
HighLevelMerkleDBInterface & merkle_db
void and_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
void shr(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress c_addr)
ExecutionIdManagerInterface & execution_id_manager
void add(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
Definition execution.cpp:41
void call_with_operands(void(Execution::*f)(ContextInterface &, Ts...), ContextInterface &context, const std::vector< Operand > &resolved_operands)
EventEmitter< DataCopyEvent > event_emitter
uint32_t dst_addr
Instruction instruction
uint32_t MemoryAddress
AvmFlavorSettings::FF FF
Definition field.hpp:10
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
uint32_t cd_offset