2 *****************************************************************************
4 Implementation of interfaces for trace-line variables.
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 TRACE_LINES_TCC_
15 #define TRACE_LINES_TCC_
20 template<typename ramT>
21 memory_line_variable_gadget<ramT>::memory_line_variable_gadget(
22 ram_protoboard<ramT> &pb,
23 const size_t timestamp_size,
24 const ram_architecture_params<ramT> &ap,
25 const std::string &annotation_prefix)
26 : ram_gadget_base<ramT>(pb, annotation_prefix)
28 const size_t address_size = ap.address_size();
29 const size_t value_size = ap.value_size();
31 timestamp.reset(new dual_variable_gadget<FieldT>(
32 pb, timestamp_size, FMT(this->annotation_prefix, " timestamp")));
33 address.reset(new dual_variable_gadget<FieldT>(
34 pb, address_size, FMT(this->annotation_prefix, " address")));
35 contents_before.reset(new dual_variable_gadget<FieldT>(
36 pb, value_size, FMT(this->annotation_prefix, " contents_before")));
37 contents_after.reset(new dual_variable_gadget<FieldT>(
38 pb, value_size, FMT(this->annotation_prefix, " contents_after")));
41 template<typename ramT>
42 void memory_line_variable_gadget<ramT>::generate_r1cs_constraints(
43 const bool enforce_bitness)
45 timestamp->generate_r1cs_constraints(enforce_bitness);
46 address->generate_r1cs_constraints(enforce_bitness);
47 contents_before->generate_r1cs_constraints(enforce_bitness);
48 contents_after->generate_r1cs_constraints(enforce_bitness);
51 template<typename ramT>
52 void memory_line_variable_gadget<ramT>::generate_r1cs_witness_from_bits()
54 timestamp->generate_r1cs_witness_from_bits();
55 address->generate_r1cs_witness_from_bits();
56 contents_before->generate_r1cs_witness_from_bits();
57 contents_after->generate_r1cs_witness_from_bits();
60 template<typename ramT>
61 void memory_line_variable_gadget<ramT>::generate_r1cs_witness_from_packed()
63 timestamp->generate_r1cs_witness_from_packed();
64 address->generate_r1cs_witness_from_packed();
65 contents_before->generate_r1cs_witness_from_packed();
66 contents_after->generate_r1cs_witness_from_packed();
69 template<typename ramT>
70 pb_variable_array<ram_base_field<ramT>> memory_line_variable_gadget<
71 ramT>::all_vars() const
73 pb_variable_array<FieldT> r;
74 r.insert(r.end(), timestamp->bits.begin(), timestamp->bits.end());
75 r.insert(r.end(), address->bits.begin(), address->bits.end());
77 r.end(), contents_before->bits.begin(), contents_before->bits.end());
78 r.insert(r.end(), contents_after->bits.begin(), contents_after->bits.end());
83 template<typename ramT>
84 execution_line_variable_gadget<ramT>::execution_line_variable_gadget(
85 ram_protoboard<ramT> &pb,
86 const size_t timestamp_size,
87 const ram_architecture_params<ramT> &ap,
88 const std::string &annotation_prefix)
89 : memory_line_variable_gadget<ramT>(
90 pb, timestamp_size, ap, annotation_prefix)
92 const size_t cpu_state_size = ap.cpu_state_size();
95 pb, cpu_state_size, FMT(annotation_prefix, " cpu_state"));
96 has_accepted.allocate(pb, FMT(annotation_prefix, " has_accepted"));
99 } // namespace libsnark
101 #endif // TRACE_LINES_TCC_