@@ -78,6 +78,102 @@ TEST(Databus, CallDataAndReturnData)
7878 EXPECT_TRUE (CircuitChecker::check (builder));
7979}
8080
81+ /* *
82+ * @brief An expository test demonstrating the functionality of the databus in a small use case when the entries are
83+ * constant witnesses
84+ */
85+ TEST (Databus, ConstantEntryAccess)
86+ {
87+
88+ Builder builder;
89+ databus_ct databus;
90+ fr value_0 = 13 ;
91+ fr value_1 = 12 ;
92+ auto constant_0 = witness_ct::create_constant_witness (&builder, value_0);
93+ auto constant_1 = witness_ct::create_constant_witness (&builder, value_1);
94+ databus.return_data .set_values ({ constant_0, constant_1 });
95+ field_ct idx_0 (witness_ct (&builder, 0 ));
96+ field_ct idx_1 (witness_ct (&builder, 1 ));
97+
98+ field_ct read_result_0 = databus.return_data [idx_0];
99+ field_ct read_result_1 = databus.return_data [idx_1];
100+
101+ EXPECT_EQ (value_0, read_result_0.get_value ());
102+ EXPECT_EQ (value_1, read_result_1.get_value ());
103+ EXPECT_TRUE (CircuitChecker::check (builder));
104+ }
105+
106+ /* *
107+ * @brief An expository test demonstrating the functionality of the databus in a small use case when the entries of the
108+ * bus_vector are not normalized
109+ */
110+ TEST (Databus, UnnormalizedEntryAccess)
111+ {
112+
113+ Builder builder;
114+ databus_ct databus;
115+ std::array<fr, 3 > raw_calldata_entries = { 3 , 2 , 1 };
116+ std::array<fr, 3 > raw_returndata_entries = { 3 , 2 , 1 };
117+ std::vector<field_ct> calldata_entries;
118+ for (fr entry : raw_calldata_entries) {
119+ calldata_entries.emplace_back (witness_ct (&builder, entry));
120+ field_ct entry_witness = witness_ct (&builder, entry);
121+ }
122+ std::vector<field_ct> returndata_entries;
123+ for (fr entry : raw_returndata_entries) {
124+ field_ct entry_witness = witness_ct (&builder, entry);
125+ // add the value to itself to make it unnormalized (the multiplicative constant will be 2)
126+ returndata_entries.emplace_back (entry_witness + entry_witness);
127+ }
128+ databus.calldata .set_values (calldata_entries);
129+ databus.return_data .set_values (returndata_entries);
130+ field_ct idx_0 = witness_ct (&builder, 0 );
131+ field_ct idx_1 = witness_ct (&builder, 1 );
132+ field_ct idx_2 = witness_ct (&builder, 2 );
133+ databus.return_data [idx_0].assert_equal (databus.calldata [idx_0] + databus.calldata [idx_0]);
134+ databus.return_data [idx_1].assert_equal (databus.calldata [idx_1] + databus.calldata [idx_1]);
135+ databus.return_data [idx_2].assert_equal (databus.calldata [idx_2] + databus.calldata [idx_2]);
136+ EXPECT_TRUE (CircuitChecker::check (builder));
137+ }
138+
139+ /* *
140+ * @brief An expository test demonstrating the functionality of the databus in a small use case where the indices are
141+ * constant and/or unnormalized
142+ */
143+ TEST (Databus, ConstantAndUnnormalizedIndices)
144+ {
145+ Builder builder;
146+ databus_ct databus;
147+ std::array<fr, 3 > raw_calldata_values = { 54 , 32 , 30 };
148+ std::array<fr, 3 > raw_returndata_values = { 54 , 32 , 116 };
149+ // Populate the calldata in the databus
150+ std::vector<field_ct> calldata_values;
151+ for (auto & value : raw_calldata_values) {
152+ calldata_values.emplace_back (witness_ct (&builder, value));
153+ }
154+ databus.calldata .set_values (calldata_values);
155+
156+ // Populate the return data in the databus
157+ std::vector<field_ct> returndata_values;
158+ for (auto & value : raw_returndata_values) {
159+ returndata_values.emplace_back (witness_ct (&builder, value));
160+ }
161+ databus.return_data .set_values (returndata_values);
162+
163+ // constant first index
164+ field_ct idx_0 (witness_ct::create_constant_witness (&builder, 0 ));
165+ field_ct idx_1 (witness_ct (&builder, 1 ));
166+ // un-normalized index (with multiplicative constant 2)
167+ field_ct idx_2 = idx_1 + idx_1;
168+ field_ct sum = databus.calldata [idx_0] + databus.calldata [idx_1] + databus.calldata [idx_2];
169+
170+ databus.return_data [idx_0].assert_equal (databus.calldata [idx_0]);
171+ databus.return_data [idx_1].assert_equal (databus.calldata [idx_1]);
172+ databus.return_data [idx_2].assert_equal (sum);
173+
174+ EXPECT_TRUE (CircuitChecker::check (builder));
175+ }
176+
81177/* *
82178 * @brief A failure test demonstrating that trying to prove (via a databus read) that an erroneous value is present in
83179 * the databus will result in an invalid witness.
@@ -179,4 +275,4 @@ TEST(Databus, DuplicateRead)
179275 databus.return_data [idx_1];
180276
181277 EXPECT_TRUE (CircuitChecker::check (builder));
182- }
278+ }
0 commit comments