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
35
36namespace bb::avm2::simulation {
37
45
47 public:
48 virtual ~ExecutionInterface() = default;
49 // Returns the top-level execution result. TODO: This should only be top level enqueud calls
51};
52
53// In charge of executing a single enqueued call.
55 public:
93
94 ExecutionResult execute(std::unique_ptr<ContextInterface> enqueued_call_context) override;
95
96 // Opcode handlers. The order of the operands matters and should be the same as the wire format.
108 void set(ContextInterface& context, MemoryAddress dst_addr, uint8_t tag, const FF& value);
110 void jump(ContextInterface& context, uint32_t loc);
111 void jumpi(ContextInterface& context, MemoryAddress cond_addr, uint32_t loc);
113 MemoryAddress l2_gas_offset,
114 MemoryAddress da_gas_offset,
115 MemoryAddress addr,
116 MemoryAddress cd_size_offset,
119 MemoryAddress l2_gas_offset,
120 MemoryAddress da_gas_offset,
121 MemoryAddress addr,
122 MemoryAddress cd_size_offset,
124 void ret(ContextInterface& context, MemoryAddress ret_size_offset, MemoryAddress ret_offset);
125 void revert(ContextInterface& context, MemoryAddress rev_size_offset, MemoryAddress rev_offset);
127 MemoryAddress cd_size_offset,
131 MemoryAddress rd_size_offset,
132 MemoryAddress rd_offset,
135 void internal_call(ContextInterface& context, uint32_t loc);
140 MemoryAddress message_offset,
141 MemoryAddress fields_offset,
142 MemoryAddress fields_size_offset,
143 uint16_t message_size,
144 bool is_debug_logging_enabled);
149 void sstore(ContextInterface& context, MemoryAddress src_addr, MemoryAddress slot_addr);
151 MemoryAddress unique_note_hash_addr,
152 MemoryAddress leaf_index_addr,
155 MemoryAddress nullifier_offset,
156 MemoryAddress address_offset,
157 MemoryAddress exists_offset);
160 MemoryAddress address_offset,
161 MemoryAddress dst_offset,
162 uint8_t member_enum);
165 MemoryAddress msg_hash_addr,
166 MemoryAddress leaf_index_addr,
170 MemoryAddress p_x_addr,
171 MemoryAddress p_y_addr,
172 MemoryAddress p_inf_addr,
173 MemoryAddress q_x_addr,
174 MemoryAddress q_y_addr,
175 MemoryAddress q_inf_addr,
178 MemoryAddress value_addr,
179 MemoryAddress radix_addr,
180 MemoryAddress num_limbs_addr,
181 MemoryAddress is_output_bits_addr,
183 void emit_unencrypted_log(ContextInterface& context, MemoryAddress log_offset, MemoryAddress log_size_offset);
184 void send_l2_to_l1_msg(ContextInterface& context, MemoryAddress recipient_addr, MemoryAddress content_addr);
186 MemoryAddress output_addr,
187 MemoryAddress state_addr,
188 MemoryAddress input_addr);
191
192 protected:
193 // Only here for testing. TODO(fcarreiro): try to improve.
195
196 private:
201 const std::vector<Operand>& resolved_operands);
202 template <typename... Ts>
203 void call_with_operands(void (Execution::*f)(ContextInterface&, Ts...),
205 const std::vector<Operand>& resolved_operands);
207
208 void handle_enter_call(ContextInterface& parent_context, std::unique_ptr<ContextInterface> child_context);
209 void handle_exit_call();
211
212 // TODO(#13683): This is leaking circuit implementation details. We should have a better way to do this.
213 // Setters for inputs and output for gadgets/subtraces. These are used for register allocation.
216 const std::vector<TaggedValue>& get_inputs() const { return inputs; }
217 const TaggedValue& get_output() const { return output; }
218
221
236
239
241
246};
247
248} // 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)
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, HighLevelMerkleDBInterface &merkle_db)
Definition execution.hpp:56
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:64
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)
void debug_log(ContextInterface &context, MemoryAddress message_offset, MemoryAddress fields_offset, MemoryAddress fields_size_offset, uint16_t message_size, bool is_debug_logging_enabled)
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:83
void or_op(ContextInterface &context, MemoryAddress a_addr, MemoryAddress b_addr, MemoryAddress dst_addr)
const std::vector< TaggedValue > & get_inputs() const
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:45
void call_with_operands(void(Execution::*f)(ContextInterface &, Ts...), ContextInterface &context, const std::vector< Operand > &resolved_operands)
virtual ExecutionResult execute(std::unique_ptr< ContextInterface > context)=0
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