26 BB_ASSERT_LTE(radix,
static_cast<decltype(radix)
>(256),
"Radix is greater than 256");
27 BB_ASSERT_GTE(radix,
static_cast<decltype(radix)
>(2),
"Radix is less than 2");
29 std::vector<uint8_t> limbs;
31 limbs.reserve(
std::max(num_limbs, num_p_limbs));
34 while (value_integer != 0) {
35 auto [quotient, remainder] = value_integer.
divmod(
static_cast<uint64_t
>(radix));
36 limbs.push_back(
static_cast<uint8_t
>(remainder));
37 value_integer = quotient;
40 if (num_limbs > limbs.size()) {
41 limbs.insert(limbs.end(), num_limbs - limbs.size(), 0);
51 bool truncated = num_limbs < limbs.size();
53 limbs.erase(limbs.begin() + num_limbs, limbs.end());
56 return { limbs, truncated };
70 std::vector<bool> bits;
71 bits.reserve(limbs.size());
73 for (uint8_t val : limbs) {
74 bits.push_back(val != 0);
77 return { bits, truncated };
111 uint16_t space_id =
memory.get_space_id();
115 uint64_t write_addr_upper_bound =
static_cast<uint64_t
>(
dst_addr) + num_limbs;
121 bool radix_is_lt_2 =
gt.gt(2, radix);
122 bool radix_is_gt_256 =
gt.gt(radix, 256);
127 bool invalid_num_limbs = (num_limbs == 0) && (!
value.
is_zero());
131 .space_id = space_id,
132 .num_limbs = num_limbs,
140 if (dst_out_of_range || radix_is_lt_2 || radix_is_gt_256 || invalid_bitwise_radix || invalid_num_limbs) {
142 throw ToRadixException(
"Error during BE conversion: Invalid parameters for ToRadix");
145 bool truncated =
false;
148 event.limbs.reserve(num_limbs);
150 const auto [limbs, truncated_decomposition] =
to_le_bits(
value, num_limbs);
151 truncated = truncated_decomposition;
152 std::ranges::for_each(limbs.rbegin(), limbs.rend(), [&](
bool bit) {
153 event.limbs.push_back(MemoryValue::from<uint1_t>(bit));
156 const auto [limbs, truncated_decomposition] =
to_le_radix(
value, num_limbs, radix);
157 truncated = truncated_decomposition;
158 std::ranges::for_each(limbs.rbegin(), limbs.rend(), [&](uint8_t limb) {
159 event.limbs.push_back(MemoryValue::from<uint8_t>(limb));
170 for (uint32_t i = 0; i < num_limbs; i++) {
#define BB_ASSERT_GTE(left, right,...)
#define BB_ASSERT_LTE(left, right,...)
virtual uint32_t get_execution_id() const =0
EventEmitterInterface< ToRadixMemoryEvent > & memory_events
EventEmitterInterface< ToRadixEvent > & events
std::pair< std::vector< bool >, bool > to_le_bits(const FF &value, uint32_t num_limbs) override
Performs a little endian radix decomposition of a field element into bits. This emits a ToRadixEvent.
std::pair< std::vector< uint8_t >, bool > to_le_radix(const FF &value, uint32_t num_limbs, uint32_t radix) override
Performs a little endian radix decomposition of a field element into limbs. This emits a ToRadixEvent...
void to_be_radix(MemoryInterface &memory, const FF &value, uint32_t radix, uint32_t num_limbs, bool is_output_bits, MemoryAddress dst_addr) override
Performs a big endian radix decomposition of a field element into limbs. This directly emits a ToRadi...
ExecutionIdManagerInterface & execution_id_manager
constexpr std::pair< uint256_t, uint256_t > divmod(const uint256_t &b) const
AVM range check gadget for witness generation.
size_t get_p_limbs_per_radix_size(size_t radix)
Gets the number of limbs that the modulus, p, decomposes into for a given radix.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
simulation::PublicDataTreeReadWriteEvent event
BB_INLINE constexpr bool is_zero() const noexcept