Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
trace_container.cpp
Go to the documentation of this file.
2
6
7namespace bb::avm2::tracegen {
8namespace {
9
10// We need a zero value to return (a reference to) when a value is not found.
11static const FF zero = FF::zero();
12constexpr auto clk_column = Column::precomputed_clk;
13
14} // namespace
15
19
20const FF& TraceContainer::get(Column col, uint32_t row) const
21{
22 auto& column_data = (*trace)[static_cast<size_t>(col)];
23 std::shared_lock lock(column_data.mutex);
24 const auto it = column_data.rows.find(row);
25 return it == column_data.rows.end() ? zero : it->second;
26}
27
29{
30 if (is_shift(col)) {
31 return get(unshift_column(col).value(), row + 1);
32 }
33 return get(static_cast<Column>(col), row);
34}
35
36void TraceContainer::set(Column col, uint32_t row, const FF& value)
37{
38 auto& column_data = (*trace)[static_cast<size_t>(col)];
39 std::unique_lock lock(column_data.mutex);
40 if (!value.is_zero()) {
41 column_data.rows.insert_or_assign(row, value);
42 column_data.max_row_number = std::max(column_data.max_row_number, static_cast<int64_t>(row));
43 } else {
44 auto num_erased = column_data.rows.erase(row);
45 if (column_data.max_row_number == row && num_erased > 0) {
46 // This shouldn't happen often. We delay recalculation of the max row number
47 // until someone actually needs it.
48 column_data.row_number_dirty = true;
49 }
50 }
51}
52
53void TraceContainer::set(uint32_t row, std::span<const std::pair<Column, FF>> values)
54{
55 for (const auto& [col, value] : values) {
56 set(col, row, value);
57 }
58}
59
61{
62 auto& column_data = (*trace)[static_cast<size_t>(col)];
63 std::unique_lock lock(column_data.mutex);
64 column_data.rows.reserve(size);
65}
66
68{
69 auto& column_data = (*trace)[static_cast<size_t>(col)];
70 std::unique_lock lock(column_data.mutex);
71 if (column_data.row_number_dirty) {
72 // Trigger recalculation of max row number.
73 auto keys = std::views::keys(column_data.rows);
74 const auto it = std::max_element(keys.begin(), keys.end());
75 // We use -1 to indicate that the column is empty.
76 column_data.max_row_number = it == keys.end() ? -1 : static_cast<int64_t>(*it);
77 column_data.row_number_dirty = false;
78 }
79 return static_cast<uint32_t>(column_data.max_row_number + 1);
80}
81
83{
85 for (size_t col = 0; col < num_columns(); ++col) {
86 if (static_cast<Column>(col) != clk_column) {
88 }
89 }
90 return max_rows;
91}
92
97
98void TraceContainer::visit_column(Column col, const std::function<void(uint32_t, const FF&)>& visitor) const
99{
100 auto& column_data = (*trace)[static_cast<size_t>(col)];
101 std::shared_lock lock(column_data.mutex);
102 for (const auto& [row, value] : column_data.rows) {
103 visitor(row, value);
104 }
105}
106
108{
109 auto& column_data = (*trace)[static_cast<size_t>(col)];
110 std::unique_lock lock(column_data.mutex);
111 column_data.rows.clear();
112 column_data.max_row_number = 0;
113 column_data.row_number_dirty = false;
114}
115
116} // namespace bb::avm2::tracegen
static constexpr size_t num_columns()
const FF & get(Column col, uint32_t row) const
void reserve_column(Column col, size_t size)
const FF & get_column_or_shift(ColumnAndShifts col, uint32_t row) const
void visit_column(Column col, const std::function< void(uint32_t, const FF &)> &visitor) const
uint32_t get_column_rows(Column col) const
void set(Column col, uint32_t row, const FF &value)
TestTraceContainer trace
bool is_shift(ColumnAndShifts c)
std::optional< Column > unshift_column(ColumnAndShifts c)
constexpr auto NUM_COLUMNS_WITHOUT_SHIFTS
Definition columns.hpp:41
ColumnAndShifts
Definition columns.hpp:35
AvmFlavorSettings::FF FF
Definition field.hpp:10
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
BB_INLINE constexpr bool is_zero() const noexcept
static constexpr field zero()