Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_circuit_builder_memory.test.cpp
Go to the documentation of this file.
3
4#include <array>
5#include <gtest/gtest.h>
6
7using namespace bb;
8
9namespace bb {
10
12{
14
15 std::array<uint32_t, 8> rom_values{
17 builder.add_variable(fr::random_element()), builder.add_variable(fr::random_element()),
18 builder.add_variable(fr::random_element()), builder.add_variable(fr::random_element()),
19 builder.add_variable(fr::random_element()), builder.add_variable(fr::random_element()),
20 };
21
22 size_t rom_id = builder.create_ROM_array(8);
23
24 for (size_t i = 0; i < 8; ++i) {
25 builder.set_ROM_element(rom_id, i, rom_values[i]);
26 }
27
28 uint32_t a_idx = builder.read_ROM_array(rom_id, builder.add_variable(fr(5)));
29 EXPECT_NE(a_idx, rom_values[5]);
30 uint32_t b_idx = builder.read_ROM_array(rom_id, builder.add_variable(fr(4)));
31 uint32_t c_idx = builder.read_ROM_array(rom_id, builder.add_variable(fr(1)));
32
33 const auto d_value = builder.get_variable(a_idx) + builder.get_variable(b_idx) + builder.get_variable(c_idx);
34 uint32_t d_idx = builder.add_variable(d_value);
35
36 builder.create_big_add_gate({
37 a_idx,
38 b_idx,
39 c_idx,
40 d_idx,
41 1,
42 1,
43 1,
44 -1,
45 0,
46 });
47
48 EXPECT_TRUE(CircuitChecker::check(builder));
49}
50
56{
58
59 // Initialize a length 1 RAM array with a single value
60 fr ram_value = 5;
61 uint32_t ram_value_idx = builder.add_variable(ram_value);
62 size_t ram_id = builder.create_RAM_array(/*array_size=*/1);
63 builder.init_RAM_element(ram_id, /*index_value=*/0, ram_value_idx);
64
65 // Read from the RAM array we just created (at the 0th index)
66 uint32_t read_idx = builder.add_variable(fr(0));
67 uint32_t a_idx = builder.read_RAM_array(ram_id, read_idx);
68
69 // Use the result in a simple arithmetic gate
70 builder.create_big_add_gate({
71 a_idx,
72 builder.zero_idx(),
73 builder.zero_idx(),
74 builder.zero_idx(),
75 -1,
76 0,
77 0,
78 0,
79 builder.get_variable(ram_value_idx),
80 });
81
82 EXPECT_TRUE(CircuitChecker::check(builder));
83}
84
86{
88
89 std::array<uint32_t, 8> ram_values{
91 builder.add_variable(fr::random_element()), builder.add_variable(fr::random_element()),
92 builder.add_variable(fr::random_element()), builder.add_variable(fr::random_element()),
93 builder.add_variable(fr::random_element()), builder.add_variable(fr::random_element()),
94 };
95
96 size_t ram_id = builder.create_RAM_array(8);
97
98 for (size_t i = 0; i < 8; ++i) {
99 builder.init_RAM_element(ram_id, i, ram_values[i]);
100 }
101
102 uint32_t a_idx = builder.read_RAM_array(ram_id, builder.add_variable(fr(5)));
103 EXPECT_NE(a_idx, ram_values[5]);
104
105 uint32_t b_idx = builder.read_RAM_array(ram_id, builder.add_variable(fr(4)));
106 uint32_t c_idx = builder.read_RAM_array(ram_id, builder.add_variable(fr(1)));
107
108 builder.write_RAM_array(ram_id, builder.add_variable(fr(4)), builder.add_variable(fr(500)));
109 uint32_t d_idx = builder.read_RAM_array(ram_id, builder.add_variable(fr(4)));
110
111 EXPECT_EQ(builder.get_variable(d_idx), 500);
112
113 // ensure these vars get used in another arithmetic gate
114 const auto e_value = builder.get_variable(a_idx) + builder.get_variable(b_idx) + builder.get_variable(c_idx) +
115 builder.get_variable(d_idx);
116 uint32_t e_idx = builder.add_variable(e_value);
117
118 builder.create_big_add_gate(
119 {
120 a_idx,
121 b_idx,
122 c_idx,
123 d_idx,
124 -1,
125 -1,
126 -1,
127 -1,
128 0,
129 },
130 true);
131 builder.create_big_add_gate(
132 {
133 builder.zero_idx(),
134 builder.zero_idx(),
135 builder.zero_idx(),
136 e_idx,
137 0,
138 0,
139 0,
140 0,
141 0,
142 },
143 false);
144
145 EXPECT_TRUE(CircuitChecker::check(builder));
146
147 // Test the builder copy constructor for a circuit with RAM gates
148 UltraCircuitBuilder duplicate_builder{ builder };
149
150 EXPECT_EQ(duplicate_builder.get_num_finalized_gates_inefficient(), builder.get_num_finalized_gates_inefficient());
151 EXPECT_TRUE(CircuitChecker::check(duplicate_builder));
152}
153
154} // namespace bb
virtual uint32_t add_variable(const FF &in)
Add a variable to variables.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
AluTraceBuilder builder
Definition alu.test.cpp:124
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:174
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
static field random_element(numeric::RNG *engine=nullptr) noexcept