barretenberg
Loading...
Searching...
No Matches
AvmMini_circuit_builder.hpp
1
2
3// AUTOGENERATED FILE
4#pragma once
5
6#include "barretenberg/common/throw_or_abort.hpp"
7#include "barretenberg/ecc/curves/bn254/fr.hpp"
8#include "barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp"
9
10#include "barretenberg/flavor/generated/AvmMini_flavor.hpp"
11#include "barretenberg/relations/generated/AvmMini/avm_mini.hpp"
12#include "barretenberg/relations/generated/AvmMini/mem_trace.hpp"
13
14using namespace barretenberg;
15
16namespace proof_system {
17
18template <typename FF> struct AvmMiniFullRow {
19 FF avmMini_clk{};
20 FF avmMini_first{};
21 FF memTrace_m_clk{};
22 FF memTrace_m_sub_clk{};
23 FF memTrace_m_addr{};
24 FF memTrace_m_val{};
25 FF memTrace_m_lastAccess{};
26 FF memTrace_m_rw{};
27 FF avmMini_subop{};
28 FF avmMini_ia{};
29 FF avmMini_ib{};
30 FF avmMini_ic{};
31 FF avmMini_mem_op_a{};
32 FF avmMini_mem_op_b{};
33 FF avmMini_mem_op_c{};
34 FF avmMini_rwa{};
35 FF avmMini_rwb{};
36 FF avmMini_rwc{};
37 FF avmMini_mem_idx_a{};
38 FF avmMini_mem_idx_b{};
39 FF avmMini_mem_idx_c{};
40 FF avmMini_last{};
41 FF memTrace_m_addr_shift{};
42 FF memTrace_m_rw_shift{};
43 FF memTrace_m_val_shift{};
44};
45
47 public:
49 using FF = Flavor::FF;
50 using Row = AvmMiniFullRow<FF>;
51
52 // TODO: template
55
56 static constexpr size_t num_fixed_columns = 25;
57 static constexpr size_t num_polys = 22;
58 std::vector<Row> rows;
59
60 void set_trace(std::vector<Row>&& trace) { rows = std::move(trace); }
61
62 ProverPolynomials compute_polynomials()
63 {
64 const auto num_rows = get_circuit_subgroup_size();
66
67 // Allocate mem for each column
68 for (auto& poly : polys.get_all()) {
69 poly = Polynomial(num_rows);
70 }
71
72 for (size_t i = 0; i < rows.size(); i++) {
73 polys.avmMini_clk[i] = rows[i].avmMini_clk;
74 polys.avmMini_first[i] = rows[i].avmMini_first;
75 polys.memTrace_m_clk[i] = rows[i].memTrace_m_clk;
76 polys.memTrace_m_sub_clk[i] = rows[i].memTrace_m_sub_clk;
77 polys.memTrace_m_addr[i] = rows[i].memTrace_m_addr;
78 polys.memTrace_m_val[i] = rows[i].memTrace_m_val;
79 polys.memTrace_m_lastAccess[i] = rows[i].memTrace_m_lastAccess;
80 polys.memTrace_m_rw[i] = rows[i].memTrace_m_rw;
81 polys.avmMini_subop[i] = rows[i].avmMini_subop;
82 polys.avmMini_ia[i] = rows[i].avmMini_ia;
83 polys.avmMini_ib[i] = rows[i].avmMini_ib;
84 polys.avmMini_ic[i] = rows[i].avmMini_ic;
85 polys.avmMini_mem_op_a[i] = rows[i].avmMini_mem_op_a;
86 polys.avmMini_mem_op_b[i] = rows[i].avmMini_mem_op_b;
87 polys.avmMini_mem_op_c[i] = rows[i].avmMini_mem_op_c;
88 polys.avmMini_rwa[i] = rows[i].avmMini_rwa;
89 polys.avmMini_rwb[i] = rows[i].avmMini_rwb;
90 polys.avmMini_rwc[i] = rows[i].avmMini_rwc;
91 polys.avmMini_mem_idx_a[i] = rows[i].avmMini_mem_idx_a;
92 polys.avmMini_mem_idx_b[i] = rows[i].avmMini_mem_idx_b;
93 polys.avmMini_mem_idx_c[i] = rows[i].avmMini_mem_idx_c;
94 polys.avmMini_last[i] = rows[i].avmMini_last;
95 }
96
97 polys.memTrace_m_addr_shift = Polynomial(polys.memTrace_m_addr.shifted());
98 polys.memTrace_m_rw_shift = Polynomial(polys.memTrace_m_rw.shifted());
99 polys.memTrace_m_val_shift = Polynomial(polys.memTrace_m_val.shifted());
100
101 return polys;
102 }
103
104 [[maybe_unused]] bool check_circuit()
105 {
106 ProverPolynomials polys = compute_polynomials();
107 const size_t num_rows = polys.get_polynomial_size();
108
109 const auto evaluate_relation = [&]<typename Relation>(const std::string& relation_name) {
110 typename Relation::SumcheckArrayOfValuesOverSubrelations result;
111 for (auto& r : result) {
112 r = 0;
113 }
114 constexpr size_t NUM_SUBRELATIONS = result.size();
115
116 for (size_t i = 0; i < num_rows; ++i) {
117 Relation::accumulate(result, polys.get_row(i), {}, 1);
118
119 bool x = true;
120 for (size_t j = 0; j < NUM_SUBRELATIONS; ++j) {
121 if (result[j] != 0) {
122 throw_or_abort(
123 format("Relation ", relation_name, ", subrelation index ", j, " failed at row ", i));
124 x = false;
125 }
126 }
127 if (!x) {
128 return false;
129 }
130 }
131 return true;
132 };
133
134 if (!evaluate_relation.template operator()<AvmMini_vm::mem_trace<FF>>("mem_trace")) {
135 return false;
136 }
137 if (!evaluate_relation.template operator()<AvmMini_vm::avm_mini<FF>>("avm_mini")) {
138 return false;
139 }
140
141 return true;
142 }
143
144 [[nodiscard]] size_t get_num_gates() const { return rows.size(); }
145
146 [[nodiscard]] size_t get_circuit_subgroup_size() const
147 {
148 const size_t num_rows = get_num_gates();
149 const auto num_rows_log2 = static_cast<size_t>(numeric::get_msb64(num_rows));
150 size_t num_rows_pow2 = 1UL << (num_rows_log2 + (1UL << num_rows_log2 == num_rows ? 0 : 1));
151 return num_rows_pow2;
152 }
153};
154} // namespace proof_system
Definition: polynomial.hpp:12
Definition: AvmMini_circuit_builder.hpp:46
The templates defined herein facilitate sharing the relation arithmetic between the prover and the ve...
Definition: relation_types.hpp:121
A container for the prover polynomials handles.
Definition: AvmMini_flavor.hpp:263
AllValues get_row(size_t row_idx) const
Returns the evaluations of all prover polynomials at one point on the boolean hypercube,...
Definition: AvmMini_flavor.hpp:277
Definition: AvmMini_flavor.hpp:21
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16
Definition: AvmMini_circuit_builder.hpp:18