Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
logic_constraint.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Suyash], commit: e4712cda8def49d75fbba2d361625fc5e21945f5 }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
9
10namespace acir_format {
11
12template <typename Builder>
16 const uint32_t result,
17 const size_t num_bits,
18 const bool is_xor_gate)
19{
21
23 field_ct right = to_field_ct(b, builder);
24
25 field_ct computed_result = bb::stdlib::logic<Builder>::create_logic_constraint(left, right, num_bits, is_xor_gate);
26
27 // In write-VK mode the result witness holds a dummy zero. In certain cases, the computed result is non-zero so the
28 // assert_equal would spuriously fail. Patch the witness value so the downstream assertion sees the correct value.
29 // Eg. for an XOR gate, if the inputs are constants such that the result is a non-zero constant, the assert_equal
30 // will fail in write-VK mode since the result witness is initialized to zero.
31 if (builder.is_write_vk_mode()) {
32 builder.set_variable(result, computed_result.get_value());
33 }
34
35 field_ct acir_result = field_ct::from_witness_index(&builder, result);
36 computed_result.assert_equal(acir_result);
37}
38
42 const uint32_t result,
43 const size_t num_bits,
44 const bool is_xor_gate);
48 const uint32_t result,
49 const size_t num_bits,
50 const bool is_xor_gate);
51
52} // namespace acir_format
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.
Definition field.cpp:942
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:67
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
Definition field.cpp:838
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.
Definition logic.cpp:32
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
template void create_logic_gate< bb::UltraCircuitBuilder >(bb::UltraCircuitBuilder &builder, const WitnessOrConstant< bb::fr > a, const WitnessOrConstant< bb::fr > b, const uint32_t result, const size_t num_bits, const bool is_xor_gate)
template void create_logic_gate< bb::MegaCircuitBuilder >(bb::MegaCircuitBuilder &builder, const WitnessOrConstant< bb::fr > a, const WitnessOrConstant< bb::fr > b, const uint32_t result, const size_t num_bits, const bool is_xor_gate)
void create_logic_gate(Builder &builder, const WitnessOrConstant< bb::fr > a, const WitnessOrConstant< bb::fr > b, const uint32_t result, const size_t num_bits, const bool is_xor_gate)
bb::stdlib::field_t< Builder > to_field_ct(const WitnessOrConstant< typename Builder::FF > &input, Builder &builder)