19#include <gtest/gtest.h>
39TEST(UltraCircuitSMT, AssertEqual)
45 builder.set_variable_name(
a.witness_index,
"a");
46 builder.set_variable_name(
b.witness_index,
"b");
68 UltraCircuit circuit(circuit_info, &s, TermType::FFTerm);
78TEST(UltraCircuitSMT, ArithmeticRelation)
86 builder.set_variable_name(
a.get_witness_index(),
"a");
87 builder.set_variable_name(
b.get_witness_index(),
"b");
95 cir[
"a"] ==
a.get_value();
96 cir[
"b"] ==
b.get_value();
105TEST(UltraCircuitSMT, EllipticRelationADD)
113 auto p3 = p1.unconditional_add(p2);
115 builder.set_variable_name(p1.x.get_witness_index(),
"x1");
116 builder.set_variable_name(p2.x.get_witness_index(),
"x2");
117 builder.set_variable_name(p3.x.get_witness_index(),
"x3");
118 builder.set_variable_name(p1.y.get_witness_index(),
"y1");
119 builder.set_variable_name(p2.y.get_witness_index(),
"y2");
120 builder.set_variable_name(p3.y.get_witness_index(),
"y3");
127 cir[
"x1"] == p1.x.get_value();
128 cir[
"x2"] == p2.x.get_value();
129 cir[
"y1"] == p1.y.get_value();
130 cir[
"y2"] == p2.y.get_value();
132 bool res = s.
check();
138 bb::fr x3_builder_val = p3.x.get_value();
139 bb::fr y3_builder_val = p3.y.get_value();
141 ASSERT_EQ(x3_solver_val, x3_builder_val);
142 ASSERT_EQ(y3_solver_val, y3_builder_val);
144 ((
Bool(cir[
"x3"]) !=
Bool(
STerm(x3_builder_val, &s, TermType::FFTerm))) |
145 (
Bool(cir[
"y3"]) !=
Bool(
STerm(y3_builder_val, &s, TermType::FFTerm))))
151TEST(UltraCircuitSMT, EllipticRelationDBL)
159 builder.set_variable_name(p1.x.get_witness_index(),
"x1");
160 builder.set_variable_name(p2.x.get_witness_index(),
"x2");
161 builder.set_variable_name(p1.y.get_witness_index(),
"y1");
162 builder.set_variable_name(p2.y.get_witness_index(),
"y2");
163 builder.set_variable_name(p1.is_point_at_infinity().witness_index,
"is_inf");
170 cir[
"x1"] == p1.x.get_value();
171 cir[
"y1"] == p1.y.get_value();
172 cir[
"is_inf"] ==
static_cast<size_t>(p1.is_point_at_infinity().get_value());
174 bool res = s.
check();
180 bb::fr x2_builder_val = p2.x.get_value();
181 bb::fr y2_builder_val = p2.y.get_value();
183 ASSERT_EQ(x2_solver_val, x2_builder_val);
184 ASSERT_EQ(y2_solver_val, y2_builder_val);
186 ((
Bool(cir[
"x2"]) !=
Bool(
STerm(x2_builder_val, &s, TermType::FFTerm))) |
187 (
Bool(cir[
"y2"]) !=
Bool(
STerm(y2_builder_val, &s, TermType::FFTerm))))
193TEST(UltraCircuitSMT, OptimizedDeltaRangeRelation)
198 a.create_range_constraint(32);
199 builder.set_variable_name(
a.get_witness_index(),
"a");
200 builder.finalize_circuit(
false);
207 cir[
"a"] ==
a.get_value();
210 bool res = s.
check();
214TEST(UltraCircuitSMT, LookupRelation1)
221 builder.set_variable_name(
a.get_witness_index(),
"a");
222 builder.set_variable_name(
b.get_witness_index(),
"b");
229 cir[
"a"] ==
a.get_value();
230 cir[
"b"] ==
b.get_value();
233 ASSERT_TRUE(slv.
check());
236 ASSERT_EQ(c_solver_val, c_builder_val);
239TEST(UltraCircuitSMT, LookupRelation2)
246 builder.set_variable_name(
a.get_witness_index(),
"a");
247 builder.set_variable_name(
b.get_witness_index(),
"b");
249 builder.finalize_circuit(
false);
256 cir[
"a"] ==
a.get_value();
257 cir[
"b"] ==
b.get_value();
260 bool res = s.
check();
265 ASSERT_EQ(c_solver_val, c_builder_val);
293TEST(UltraCircuitSMT, ROMTables)
317 STerm i_s = cir[
"i"];
318 STerm j_s = cir[
"j"];
323 ASSERT_TRUE(slv.
check());
330 ASSERT_EQ(table_values[
static_cast<size_t>(i_cir)].get_value(), entry_i_cir);
331 ASSERT_EQ(table_values[
static_cast<size_t>(j_cir)].get_value(), entry_j_cir);
334TEST(UltraCircuitSMT, ROMTablesRelaxed)
357 circuit_info, &slv, TermType::FFTerm,
"",
true,
true);
359 STerm i_s = cir[
"i"];
360 STerm j_s = cir[
"j"];
365 ASSERT_TRUE(slv.
check());
372 ASSERT_EQ(table_values[
static_cast<size_t>(i_cir)].get_value(), entry_i_cir);
373 ASSERT_EQ(table_values[
static_cast<size_t>(j_cir)].get_value(), entry_j_cir);
376TEST(UltraCircuitSMT, RAMTables)
380 size_t table_size = 3;
382 for (
size_t i = 0; i < table_size; ++i) {
403 STerm i_s = cir[
"i"];
404 STerm entry_i_s = cir[
"entry_i"];
405 STerm entry_i_1_s = cir[
"entry_i_1"];
409 ASSERT_TRUE(slv.
check());
414 ASSERT_TRUE(entry_i_cir == el0);
415 ASSERT_TRUE(entry_i_1_cir == el1);
418TEST(UltraCircuitSMT, RAMTablesRelaxed)
422 size_t table_size = 3;
424 for (
size_t i = 0; i < table_size; ++i) {
444 circuit_info, &slv, TermType::FFTerm,
"",
true,
true);
446 STerm i_s = cir[
"i"];
447 STerm entry_i_s = cir[
"entry_i"];
448 STerm entry_i_1_s = cir[
"entry_i_1"];
452 ASSERT_TRUE(slv.
check());
457 ASSERT_TRUE(entry_i_cir == el0);
458 ASSERT_TRUE(entry_i_1_cir == el1);
461TEST(UltraCircuitSMT, XorOptimization)
465 builder.set_variable_name(
a.get_witness_index(),
"a");
467 builder.set_variable_name(
b.get_witness_index(),
"b");
472 uint32_t modulus_base = 16;
473 uint32_t bvsize = 256;
476 UltraCircuit circuit(circuit_info, &s, TermType::BVTerm);
478 circuit[
"a"] ==
a.get_value();
479 circuit[
"b"] ==
b.get_value();
488 ASSERT_EQ(c_sym, c_builder);
491TEST(UltraCircuitSMT, AndOptimization)
495 builder.set_variable_name(
a.get_witness_index(),
"a");
497 builder.set_variable_name(
b.get_witness_index(),
"b");
502 uint32_t modulus_base = 16;
503 uint32_t bvsize = 256;
506 UltraCircuit circuit(circuit_info, &s, TermType::BVTerm);
508 circuit[
"a"] ==
a.get_value();
509 circuit[
"b"] ==
b.get_value();
518 ASSERT_EQ(c_sym, c_builder);
virtual uint8_t get_random_uint8()=0
virtual uint32_t get_random_uint32()=0
cycle_group represents a group Element of the proving system's embedded curve i.e....
static cycle_group from_witness(Builder *_context, const AffineElement &_in)
Converts an AffineElement into a circuit witness.
void assert_equal(const field_t &rhs, std::string const &msg="field_t::assert_equal") const
Copy constraint: constrain that *this field is equal to rhs element.
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
uint32_t get_witness_index() const
Get the witness index of the current field element.
static field_pt create_logic_constraint(field_pt &a, field_pt &b, size_t num_bits, bool is_xor_gate, const std::function< std::pair< uint256_t, uint256_t >(uint256_t, uint256_t, size_t)> &get_chunk=[](uint256_t left, uint256_t right, size_t chunk_size) { uint256_t left_chunk=left &((uint256_t(1)<< chunk_size) - 1);uint256_t right_chunk=right &((uint256_t(1)<< chunk_size) - 1);return std::make_pair(left_chunk, right_chunk);})
A logical AND or XOR over a variable number of bits.
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.
Symbolic Circuit class for Standard Circuit Builder.
size_t get_num_gates() const
Get the num gates object.
Symbolic term element class.
Entry point for Barretenberg command-line interface.
TEST(MegaCircuitBuilder, CopyConstructor)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
CircuitSchema unpack_from_buffer(const msgpack::sbuffer &buf)
Get the CircuitSchema object.
const SolverConfiguration ultra_solver_config
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bool smt_timer(smt_solver::Solver *s)
Get the solver result and amount of time that it took to solve.
bb::fr string_to_fr(const std::string &number, int base, bool is_signed, size_t step)
Converts a string of an arbitrary base to fr. Note: there should be no prefix.
static field random_element(numeric::RNG *engine=nullptr) noexcept
Serialized state of a circuit.
stdlib::witness_t< UltraCircuitBuilder > witness_t
stdlib::public_witness_t< UltraCircuitBuilder > pub_witness_t