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_