2 *****************************************************************************
4 Implementation of interfaces for a BACS-to-R1CS reduction.
8 *****************************************************************************
9 * @author This file is part of libsnark, developed by SCIPR Lab
10 * and contributors (see AUTHORS).
11 * @copyright MIT license (see LICENSE file)
12 *****************************************************************************/
14 #ifndef BACS_TO_R1CS_TCC_
15 #define BACS_TO_R1CS_TCC_
17 #include <libsnark/relations/circuit_satisfaction_problems/bacs/bacs.hpp>
18 #include <libsnark/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp>
23 template<typename FieldT>
24 r1cs_constraint_system<FieldT> bacs_to_r1cs_instance_map(
25 const bacs_circuit<FieldT> &circuit)
27 libff::enter_block("Call to bacs_to_r1cs_instance_map");
28 assert(circuit.is_valid());
29 r1cs_constraint_system<FieldT> result;
32 result.variable_annotations = circuit.variable_annotations;
35 result.primary_input_size = circuit.primary_input_size;
36 result.auxiliary_input_size =
37 circuit.auxiliary_input_size + circuit.gates.size();
39 for (auto &g : circuit.gates) {
40 result.constraints.emplace_back(
41 r1cs_constraint<FieldT>(g.lhs, g.rhs, g.output));
43 auto it = circuit.gate_annotations.find(g.output.index);
44 if (it != circuit.gate_annotations.end()) {
45 result.constraint_annotations[result.constraints.size() - 1] =
51 for (auto &g : circuit.gates) {
52 if (g.is_circuit_output) {
53 result.constraints.emplace_back(
54 r1cs_constraint<FieldT>(1, g.output, 0));
57 result.constraint_annotations[result.constraints.size() - 1] =
58 FMT("", "output_%zu_is_circuit_output", g.output.index);
63 libff::leave_block("Call to bacs_to_r1cs_instance_map");
68 template<typename FieldT>
69 r1cs_variable_assignment<FieldT> bacs_to_r1cs_witness_map(
70 const bacs_circuit<FieldT> &circuit,
71 const bacs_primary_input<FieldT> &primary_input,
72 const bacs_auxiliary_input<FieldT> &auxiliary_input)
74 libff::enter_block("Call to bacs_to_r1cs_witness_map");
75 const r1cs_variable_assignment<FieldT> result =
76 circuit.get_all_wires(primary_input, auxiliary_input);
77 libff::leave_block("Call to bacs_to_r1cs_witness_map");
82 } // namespace libsnark
84 #endif // BACS_TO_R1CS_TCC_