Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
memory_trace.cpp
Go to the documentation of this file.
2
3#include <array>
4#include <cstdint>
5#include <memory>
6#include <vector>
7
15
16// Permutations.
27
28namespace bb::avm2::tracegen {
29
32{
35
36 // Create a vector of pointers to avoid copying the events.
38 const size_t trace_size = events.size();
39 event_ptrs.reserve(trace_size);
40
41 for (const auto& event : events) {
42 event_ptrs.push_back(&event);
43 }
44
45 std::ranges::sort(event_ptrs, [](const auto* lhs, const auto* rhs) { return lhs->operator<(*rhs); });
46
47 using C = Column;
48
49 // We rely on the following assert in computing C::memory_tag_ff_diff_inv value
50 // below. Namely: (tag - MemoryTag::FF).invert() == tag.invert().
51 static_assert(static_cast<uint8_t>(MemoryTag::FF) == 0);
52
53 // We pre-compute the inverses for the tag values.
54 // It serves to speed up trace generation of column C::memory_tag_ff_diff_inv values.
55 constexpr size_t NUM_TAGS = static_cast<size_t>(MemoryTag::MAX) + 1;
56 // Precomputed inverses from 0, 1 ... NUM_TAGS.
57 std::array<FF, NUM_TAGS> tag_inverts;
58 for (size_t i = 0; i < NUM_TAGS; i++) {
59 tag_inverts.at(i) = FF(i);
60 }
61 FF::batch_invert(tag_inverts);
62
63 // We use shift in this trace and keep the first row empty.
64 uint32_t row = 1;
65
66 for (uint32_t i = 0; i < trace_size; i++) {
67 const auto& event = *event_ptrs[i];
68 const bool is_last = i + 1 == trace_size;
69 const bool sel_tag_is_ff = event.value.get_tag() == MemoryTag::FF;
70 const uint64_t global_addr = (static_cast<uint64_t>(event.space_id) << 32) + event.addr;
71 const uint64_t timestamp =
72 (static_cast<uint64_t>(event.execution_clk) << 1) + static_cast<uint64_t>(event.mode);
73
74 uint64_t diff = 0; // keep it 0 for the last row.
75 bool last_access = true; // keep it true for the last row.
76 uint64_t global_addr_diff = 0;
77
78 if (!is_last) {
79 const auto& next_event = *event_ptrs[i + 1];
80 const uint64_t next_global_addr = (static_cast<uint64_t>(next_event.space_id) << 32) + next_event.addr;
81 const uint64_t next_timestamp =
82 (static_cast<uint64_t>(next_event.execution_clk) << 1) + static_cast<uint64_t>(next_event.mode);
83 const uint64_t two_consecutive_writes =
84 static_cast<uint64_t>(event.mode) * static_cast<uint64_t>(next_event.mode);
85 global_addr_diff = next_global_addr - global_addr;
86 last_access = global_addr != next_global_addr;
87 diff = last_access ? global_addr_diff : (next_timestamp - timestamp - two_consecutive_writes);
88 }
89
90 trace.set(row,
91 { {
92 { C::memory_sel, 1 },
93 { C::memory_value, event.value },
94 { C::memory_tag, static_cast<uint8_t>(event.value.get_tag()) },
95 { C::memory_space_id, event.space_id },
96 { C::memory_address, event.addr },
97 { C::memory_clk, event.execution_clk },
98 { C::memory_rw, event.mode == MemoryMode::WRITE ? 1 : 0 },
99 { C::memory_sel_rng_chk, is_last ? 0 : 1 },
100 { C::memory_global_addr, global_addr },
101 { C::memory_timestamp, timestamp },
102 { C::memory_last_access, last_access },
103 { C::memory_glob_addr_diff_inv, global_addr_diff }, // Will be inverted in batch later
104 { C::memory_diff, diff },
105 { C::memory_limb_0_, diff & 0xFFFF },
106 { C::memory_limb_1_, (diff >> 16) & 0xFFFF },
107 { C::memory_limb_2_, (diff >> 32) },
108 { C::memory_sel_tag_is_ff, sel_tag_is_ff ? 1 : 0 },
109 { C::memory_tag_ff_diff_inv, tag_inverts.at(static_cast<uint8_t>(event.value.get_tag())) },
110 { C::memory_sel_rng_write, (event.mode == MemoryMode::WRITE && !sel_tag_is_ff) ? 1 : 0 },
111 { C::memory_max_bits, get_tag_bits(event.value.get_tag()) },
112 } });
113 row++;
114 }
115
116 // Batch invert the columns.
117 trace.invert_columns({ { C::memory_glob_addr_diff_inv } });
118}
119
123 // Addressing.
132 // Registers.
139 // Data Copy.
142 // Get Contract Instance.
145 // Unencrypted Log.
147 // Poseidon2.
156 // Keccak.
158 // Sha256.
168 // ECADD
172 // To Radix.
174 // Others.
175 >(Column::memory_sel)
176 .add<lookup_memory_range_check_limb_0_settings, InteractionType::LookupIntoIndexedByClk>()
178 .add<lookup_memory_range_check_limb_2_settings, InteractionType::LookupIntoIndexedByClk>()
180 .add<lookup_memory_range_check_write_tagged_value_settings, InteractionType::LookupGeneric>(
181 Column::range_check_sel);
182
183} // namespace bb::avm2::tracegen
InteractionDefinition & add(auto &&... args)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
TestTraceContainer trace
permutation_settings< perm_sha256_mem_mem_op_6_settings_ > perm_sha256_mem_mem_op_6_settings
permutation_settings< perm_registers_mem_op_4_settings_ > perm_registers_mem_op_4_settings
permutation_settings< perm_sha256_mem_mem_input_read_settings_ > perm_sha256_mem_mem_input_read_settings
permutation_settings< perm_poseidon2_mem_pos_write_mem_2_settings_ > perm_poseidon2_mem_pos_write_mem_2_settings
permutation_settings< perm_poseidon2_mem_pos_read_mem_1_settings_ > perm_poseidon2_mem_pos_read_mem_1_settings
permutation_settings< perm_ecc_mem_write_mem_1_settings_ > perm_ecc_mem_write_mem_1_settings
permutation_settings< perm_registers_mem_op_3_settings_ > perm_registers_mem_op_3_settings
permutation_settings< perm_registers_mem_op_1_settings_ > perm_registers_mem_op_1_settings
permutation_settings< perm_addressing_indirect_from_memory_3_settings_ > perm_addressing_indirect_from_memory_3_settings
permutation_settings< perm_addressing_indirect_from_memory_5_settings_ > perm_addressing_indirect_from_memory_5_settings
permutation_settings< perm_poseidon2_mem_pos_read_mem_3_settings_ > perm_poseidon2_mem_pos_read_mem_3_settings
lookup_settings< lookup_memory_range_check_limb_1_settings_ > lookup_memory_range_check_limb_1_settings
permutation_settings< perm_addressing_base_address_from_memory_settings_ > perm_addressing_base_address_from_memory_settings
permutation_settings< perm_sha256_mem_mem_op_2_settings_ > perm_sha256_mem_mem_op_2_settings
permutation_settings< perm_addressing_indirect_from_memory_1_settings_ > perm_addressing_indirect_from_memory_1_settings
permutation_settings< perm_poseidon2_mem_pos_write_mem_0_settings_ > perm_poseidon2_mem_pos_write_mem_0_settings
permutation_settings< perm_sha256_mem_mem_op_4_settings_ > perm_sha256_mem_mem_op_4_settings
permutation_settings< perm_poseidon2_mem_pos_write_mem_1_settings_ > perm_poseidon2_mem_pos_write_mem_1_settings
permutation_settings< perm_sha256_mem_mem_op_3_settings_ > perm_sha256_mem_mem_op_3_settings
permutation_settings< perm_addressing_indirect_from_memory_0_settings_ > perm_addressing_indirect_from_memory_0_settings
permutation_settings< perm_get_contract_instance_mem_write_contract_instance_member_settings_ > perm_get_contract_instance_mem_write_contract_instance_member_settings
permutation_settings< perm_addressing_indirect_from_memory_2_settings_ > perm_addressing_indirect_from_memory_2_settings
permutation_settings< perm_poseidon2_mem_pos_write_mem_3_settings_ > perm_poseidon2_mem_pos_write_mem_3_settings
permutation_settings< perm_ecc_mem_write_mem_0_settings_ > perm_ecc_mem_write_mem_0_settings
permutation_settings< perm_data_copy_mem_read_settings_ > perm_data_copy_mem_read_settings
permutation_settings< perm_keccak_memory_slice_to_mem_settings_ > perm_keccak_memory_slice_to_mem_settings
permutation_settings< perm_get_contract_instance_mem_write_contract_instance_exists_settings_ > perm_get_contract_instance_mem_write_contract_instance_exists_settings
uint8_t get_tag_bits(ValueTag tag)
permutation_settings< perm_sha256_mem_mem_op_0_settings_ > perm_sha256_mem_mem_op_0_settings
permutation_settings< perm_sha256_mem_mem_op_1_settings_ > perm_sha256_mem_mem_op_1_settings
permutation_settings< perm_registers_mem_op_0_settings_ > perm_registers_mem_op_0_settings
permutation_settings< perm_registers_mem_op_2_settings_ > perm_registers_mem_op_2_settings
permutation_settings< perm_sha256_mem_mem_op_7_settings_ > perm_sha256_mem_mem_op_7_settings
lookup_settings< lookup_memory_tag_max_bits_settings_ > lookup_memory_tag_max_bits_settings
permutation_settings< perm_emit_unencrypted_log_read_mem_settings_ > perm_emit_unencrypted_log_read_mem_settings
permutation_settings< perm_addressing_indirect_from_memory_4_settings_ > perm_addressing_indirect_from_memory_4_settings
permutation_settings< perm_addressing_indirect_from_memory_6_settings_ > perm_addressing_indirect_from_memory_6_settings
permutation_settings< perm_registers_mem_op_5_settings_ > perm_registers_mem_op_5_settings
permutation_settings< perm_ecc_mem_write_mem_2_settings_ > perm_ecc_mem_write_mem_2_settings
permutation_settings< perm_poseidon2_mem_pos_read_mem_0_settings_ > perm_poseidon2_mem_pos_read_mem_0_settings
permutation_settings< perm_poseidon2_mem_pos_read_mem_2_settings_ > perm_poseidon2_mem_pos_read_mem_2_settings
permutation_settings< perm_data_copy_mem_write_settings_ > perm_data_copy_mem_write_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
permutation_settings< perm_sha256_mem_mem_op_5_settings_ > perm_sha256_mem_mem_op_5_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
simulation::PublicDataTreeReadWriteEvent event
static void batch_invert(C &coeffs) noexcept