2#include "../circuit_builders/circuit_builders_fwd.hpp"
3#include "../uint/uint.hpp"
14 bit_array(
const std::vector<uint32<Builder>>& input);
17 : context(input.get_context())
18 , length(input.size() * 8)
20 const auto bytes = input.bytes();
21 const size_t num_bits = bytes.size() * 8;
22 values.resize(num_bits);
23 for (
size_t i = 0; i < bytes.size(); ++i) {
24 const auto byte = bytes[i];
26 for (
size_t j = 0; j < 8; ++j) {
29 values[i * 8 + j] = bit;
33 byte.assert_equal(accumulator);
35 std::reverse(values.begin(), values.end());
38 template <
size_t N>
bit_array(
const std::array<uint32<Builder>, N>& input)
41 for (
const auto& x : input) {
42 if (x.get_context() !=
nullptr) {
43 context = x.get_context();
48 size_t num_words =
static_cast<size_t>(N);
49 values.resize(num_words * 32);
50 for (
size_t i = 0; i < num_words; ++i) {
51 size_t input_index = num_words - 1 - i;
52 for (
size_t j = 0; j < 32; ++j) {
53 values[i * 32 + j] = input[input_index].at(j);
56 length = num_words * 32;
71 std::vector<bool_t<Builder>> rbits(values.rbegin(), values.rend());
73 const size_t num_bits = rbits.size();
74 const size_t num_bytes = (num_bits / 8) + (num_bits % 8 != 0);
76 std::vector<field_t<Builder>> values(num_bytes);
78 for (
size_t i = 0; i < num_bytes; ++i) {
80 if (i == num_bytes - 1 && (num_bits % 8 != 0)) {
84 for (
size_t j = 0; j < end; ++j) {
85 const auto bit = rbits[i * 8 + j];
89 values[i] = accumulator;
94 template <
size_t N>
operator std::array<uint32<Builder>, N>()
97 std::array<uint32<Builder>, N> output;
98 for (
size_t i = 0; i < N; ++i) {
99 std::array<bool_t<Builder>, 32> bools;
102 start = ((N - i) * 32) - 32;
103 end = start + 32 > length ? length : start + 32;
104 for (
size_t j = start; j < end; ++j) {
105 bools[j - start] = values[j];
107 if (start + 32 > length) {
108 for (
size_t j = end; j < start + 32; ++j) {
112 output[i] = uint32<Builder>(context, bools);
117 std::vector<uint32<Builder>> to_uint32_vector();
119 template <
size_t N>
void populate_uint32_array(
const size_t starting_index, std::array<uint32<Builder>, N>& output)
123 size_t num_uint32s = (length / 32) + (length % 32 != 0);
124 size_t num_selected_uint32s = N;
127 for (
size_t i = (0); i < num_selected_uint32s; ++i) {
128 std::array<bool_t<Builder>, 32> bools;
131 start = ((num_uint32s - i) * 32) - 32;
132 end = start + 32 > length ? length : start + 32;
133 for (
size_t j = start; j < end; ++j) {
134 bools[j - start] = values[j - starting_index];
136 if (start + 32 > length) {
137 for (
size_t j = end; j < start + 32; ++j) {
142 output[count] = uint32<Builder>(context, bools);
147 std::string get_witness_as_string()
const;
149 size_t size()
const {
return length; }
151 Builder* get_context()
const {
return context; }
155 size_t num_ulongs = (length / 32) + (length % 32 != 0);
156 std::vector<uint32_t> ulong_vector(num_ulongs, 0);
157 for (
size_t i = 0; i < length; ++i) {
158 size_t ulong_index = i / 32;
159 uint32_t shift =
static_cast<uint32_t
>(i - (ulong_index * 32));
160 ulong_vector[num_ulongs - 1 - ulong_index] =
161 ulong_vector[num_ulongs - 1 - ulong_index] + (
static_cast<uint32_t
>(values[i].get_value()) << shift);
164 for (
size_t i = 0; i < num_ulongs; ++i) {
165 printf(
" %x", (ulong_vector[i]));
170 std::vector<bool_t<Builder>> get_bits()
const
172 const std::vector<bool_t<Builder>> result(values.begin(), values.end());
179 std::vector<bool_t<Builder>> values;
Definition: uint256.hpp:25
Definition: standard_circuit_builder.hpp:12
Definition: bit_array.hpp:9
Definition: byte_array.hpp:9
Definition: witness.hpp:10
Definition: widget.bench.cpp:13