2#include "../bool/bool.hpp"
3#include "../byte_array/byte_array.hpp"
4#include "../circuit_builders/circuit_builders_fwd.hpp"
5#include "../field/field.hpp"
6#include "../plookup/plookup.hpp"
8#include "./plookup/uint.hpp"
24template <
typename Builder,
typename Native>
class uint {
26 static_assert((
sizeof(Native) == 1) || (
sizeof(Native) == 2) || (
sizeof(Native) == 4) || (
sizeof(Native) == 8));
29 static constexpr size_t width =
sizeof(Native) * 8;
45 const uint32_t witness_index,
46 const size_t num_bits,
47 std::string
const& msg)
const;
49 static constexpr size_t num_accumulators()
51 return (width + Builder::UINT_LOG2_BASE - 1) / Builder::UINT_LOG2_BASE;
66 uint operator/(
const uint& other)
const;
67 uint operator%(
const uint& other)
const;
69 uint operator&(
const uint& other)
const;
70 uint operator^(
const uint& other)
const;
71 uint operator|(
const uint& other)
const;
72 uint operator~()
const;
77 uint ror(
const size_t target_rotation)
const;
78 uint rol(
const size_t target_rotation)
const;
79 uint ror(
const uint256_t target_rotation)
const {
return ror(
static_cast<size_t>(target_rotation.data[0])); }
80 uint rol(
const uint256_t target_rotation)
const {
return rol(
static_cast<size_t>(target_rotation.data[0])); }
107 *
this = operator/(other);
112 *
this = operator%(other);
118 *
this = operator&(other);
123 *
this = operator^(other);
128 *
this = operator|(other);
132 uint operator>>=(
const size_t shift)
137 uint operator<<=(
const size_t shift)
143 uint256_t get_mask()
const {
return MASK; };
149 bool is_constant()
const {
return witness_index == IS_CONSTANT; }
150 Builder* get_context()
const {
return context; }
154 size_t get_width()
const {
return width; }
156 uint32_t get_witness_index()
const {
return witness_index; }
158 uint256_t get_additive_constant()
const {
return additive_constant; }
163 enum WitnessStatus { OK, NOT_NORMALIZED, WEAK_NORMALIZED };
166 mutable WitnessStatus witness_status;
167 mutable std::vector<uint32_t> accumulators;
168 mutable uint32_t witness_index;
171 static constexpr uint256_t MASK = CIRCUIT_UINT_MAX_PLUS_ONE - 1;
179 std::pair<uint, uint> divmod(
const uint& other)
const;
180 uint logic_operator(
const uint& other,
const LogicOp op_type)
const;
181 uint weak_normalize()
const;
186template <
typename T,
typename w>
inline std::ostream& operator<<(std::ostream& os,
uint<T, w> const& v)
188 return os << v.get_value();
191template <
typename Builder>
193 typename std::conditional<HasPlookup<Builder>, uint_plookup<Builder, uint8_t>, uint<Builder, uint8_t>>::type;
194template <
typename Builder>
196 typename std::conditional<HasPlookup<Builder>, uint_plookup<Builder, uint16_t>, uint<Builder, uint16_t>>::type;
197template <
typename Builder>
199 typename std::conditional<HasPlookup<Builder>, uint_plookup<Builder, uint32_t>, uint<Builder, uint32_t>>::type;
200template <
typename Builder>
202 typename std::conditional<HasPlookup<Builder>, uint_plookup<Builder, uint64_t>, uint<Builder, uint64_t>>::type;
204EXTERN_STDLIB_BASIC_TYPE_VA(uint, uint8_t);
205EXTERN_STDLIB_BASIC_TYPE_VA(uint, uint16_t);
206EXTERN_STDLIB_BASIC_TYPE_VA(uint, uint32_t);
207EXTERN_STDLIB_BASIC_TYPE_VA(uint, uint64_t);
Definition: uint256.hpp:25
Definition: standard_circuit_builder.hpp:12
Definition: byte_array.hpp:9
A standard library fixed-width unsigned integer type. Useful, e.g., for hashing. Use safe_uint instea...
Definition: uint.hpp:24
uint operator+(const uint &other) const
Return a uint which, if range constrained, would be proven to be the sum of self and other.
Definition: arithmetic.cpp:40
uint ror(const size_t target_rotation) const
Definition: logic.cpp:295
bool_t< Builder > at(const size_t bit_index) const
Extract the bit value at a given position.
Definition: uint.cpp:285
uint operator<<(const size_t shift) const
Definition: logic.cpp:159
uint operator>>(const size_t shift) const
Right shift a uint.
Definition: logic.cpp:42
uint operator*(const uint &other) const
Multiply two uint_ct's, trucating overflowing bits.
Definition: arithmetic.cpp:191
bool_t< Builder > operator>(const uint &other) const
Determine whether this > other.
Definition: comparison.cpp:17
uint operator-(const uint &other) const
Return a uint which, if range constrained, would be proven to be the difference of self and other.
Definition: arithmetic.cpp:130
uint normalize() const
For non-constants, weakly normalize and constrain the updated witness to width-many bits.
Definition: uint.cpp:239
std::vector< uint32_t > constrain_accumulators(Builder *ctx, const uint32_t witness_index, const size_t num_bits, std::string const &msg) const
Constrain accumulators.
Definition: uint.cpp:14
Definition: witness.hpp:10
Definition: widget.bench.cpp:13