Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
block_constraint.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Raju], commit: 05a381f8b31ae4648e480f1369e911b148216e8b}
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
13
14namespace acir_format {
15
16using namespace bb;
17
24{
26
28 init.reserve(constraint.init.size());
29 for (const auto idx : constraint.init) {
31 }
32
33 switch (constraint.type) {
34 // Note: CallData/ReturnData require DataBus, which is only available in Mega and in particular is _not_ supported
35 // by Ultra. If we encounter them in an Ultra circuit, we return an error.
36 case BlockType::ROM:
38 break;
39 case BlockType::RAM:
41 break;
45 "UltraCircuitBuilder (standalone Noir application) does not support CallData/ReturnData "
46 "block constraints. Use MegaCircuitBuilder (Aztec app) or fall back to RAM and ROM operations.");
47 break;
48 default:
49 bb::assert_failure("Unexpected block constraint type.");
50 break;
51 }
52}
53
59{
61
63 init.reserve(constraint.init.size());
64 for (const auto idx : constraint.init) {
66 }
67
68 switch (constraint.type) {
69 case BlockType::ROM: {
71 } break;
72 case BlockType::RAM: {
74 } break;
77 } break;
80 } break;
81 default:
82 bb::assert_failure("Unexpected block constraint type.");
83 break;
84 }
85}
86
87template <typename Builder>
89 const BlockConstraint& constraint,
91{
94
95 rom_table_ct table(&builder, init);
96 for (const auto& op : constraint.trace) {
97 field_ct value = to_field_ct(op.value, builder);
98 field_ct index = to_field_ct(op.index, builder);
99
100 switch (op.access_type) {
101 case AccessType::Read:
102 value.assert_equal(table[index]);
103 break;
104 default:
105 bb::assert_failure("Invalid AccessType for ROM memory operation.");
106 break;
107 }
108 }
109}
110
111template <typename Builder>
113 const BlockConstraint& constraint,
115{
118
119 ram_table_ct table(&builder, init);
120 for (const auto& op : constraint.trace) {
121 field_ct value = to_field_ct(op.value, builder);
122 field_ct index = to_field_ct(op.index, builder);
123
124 switch (op.access_type) {
125 case AccessType::Read:
126 value.assert_equal(table.read(index));
127 break;
129 table.write(index, value);
130 break;
131 default:
132 bb::assert_failure("Invalid AccessType for RAM memory operation.");
133 break;
134 }
135 }
136}
137
138template <typename Builder>
140 const BlockConstraint& constraint,
142{
145
147
148 // Method for processing operations on a generic databus calldata array
149 auto process_calldata = [&](auto& calldata_array) {
150 calldata_array.set_context(&builder);
151 calldata_array.set_values(init); // Initialize the data in the bus array
152
153 for (const auto& op : constraint.trace) {
154 field_ct value = to_field_ct(op.value, builder);
155 field_ct index = to_field_ct(op.index, builder);
156
157 switch (op.access_type) {
158 case AccessType::Read:
159 value.assert_equal(calldata_array[index]);
160 break;
161 default:
162 bb::assert_failure("Invalid AccessType for CallData memory operation.");
163 break;
164 }
165 }
166 };
167
168 // Process primary or secondary calldata based on calldata_id
169 switch (constraint.calldata_id) {
171 process_calldata(databus.calldata);
172 break;
174 process_calldata(databus.secondary_calldata);
175 break;
176 default:
177 bb::assert_failure("Databus only supports two calldata arrays.");
178 break;
179 }
180}
181
182template <typename Builder>
184 const BlockConstraint& constraint,
186{
188 // Return data opcodes simply copy the data from the initialization vector to the return data vector in the databus.
189 // There is no operation happening.
190 BB_ASSERT_EQ(constraint.trace.size(), 0U, "Return data opcodes should have empty traces");
191
193
195 // Populate the returndata in the databus
197 // For each entry of the return data, explicitly assert equality with the initialization value. This implicitly
198 // creates the return data read gates that are required to connect witness values in the main wires to witness
199 // values in the databus return data column.
200 size_t c = 0;
201 for (const auto& value : init) {
202 value.assert_equal(databus.return_data[c]);
203 c++;
204 }
205}
206
207} // namespace acir_format
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:93
void set_values(const std::vector< field_pt > &entries_in)
Set the entries of the bus vector from possibly unnormalized or constant inputs.
Definition databus.cpp:14
void set_context(Builder *builder_context)
Definition databus.hpp:51
bus_vector return_data
Definition databus.hpp:64
bus_vector calldata
Definition databus.hpp:62
bus_vector secondary_calldata
Definition databus.hpp:63
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:62
field_pt read(const field_pt &index) const
Read a field element from the RAM table at an index value.
void write(const field_pt &index, const field_pt &value)
Write a field element from the RAM table at an index value.
AluTraceBuilder builder
Definition alu.test.cpp:124
const auto init
Definition fr.bench.cpp:135
void process_RAM_operations(Builder &builder, const BlockConstraint &constraint, std::vector< bb::stdlib::field_t< Builder > > &init)
void create_block_constraints(UltraCircuitBuilder &builder, const BlockConstraint &constraint)
Create block constraints; Specialization for Ultra arithmetization.
void process_call_data_operations(Builder &builder, const BlockConstraint &constraint, std::vector< bb::stdlib::field_t< Builder > > &init)
void process_ROM_operations(Builder &builder, const BlockConstraint &constraint, std::vector< bb::stdlib::field_t< Builder > > &init)
void process_return_data_operations(Builder &builder, const BlockConstraint &constraint, std::vector< bb::stdlib::field_t< Builder > > &init)
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< typename Builder::FF > &input, Builder &builder)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
void assert_failure(std::string const &err)
Definition assert.cpp:11
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Struct holding the data required to add memory constraints to a circuit.
std::vector< uint32_t > init