25 BB_ASSERT_LTE(radix,
static_cast<decltype(radix)
>(256),
"Radix is greater than 256");
26 BB_ASSERT_GTE(radix,
static_cast<decltype(radix)
>(2),
"Radix is less than 2");
28 std::vector<uint8_t> limbs;
30 limbs.reserve(
std::max(num_limbs, num_p_limbs));
33 while (value_integer != 0) {
34 auto [quotient, remainder] = value_integer.
divmod(
static_cast<uint64_t
>(radix));
35 limbs.push_back(
static_cast<uint8_t
>(remainder));
36 value_integer = quotient;
39 if (num_limbs > limbs.size()) {
40 limbs.insert(limbs.end(), num_limbs - limbs.size(), 0);
50 bool truncated = num_limbs < limbs.size();
52 limbs.erase(limbs.begin() + num_limbs, limbs.end());
55 return { limbs, truncated };
69 std::vector<bool> bits;
70 bits.reserve(limbs.size());
72 for (uint8_t val : limbs) {
73 bits.push_back(val != 0);
76 return { bits, truncated };
108 uint16_t space_id =
memory.get_space_id();
112 uint64_t write_addr_upper_bound =
static_cast<uint64_t
>(
dst_addr) + num_limbs;
118 bool radix_is_lt_2 =
gt.gt(2, radix);
119 bool radix_is_gt_256 =
gt.gt(radix, 256);
124 bool invalid_num_limbs = (num_limbs == 0) && (!
value.
is_zero());
128 .space_id = space_id,
129 .num_limbs = num_limbs,
137 if (dst_out_of_range || radix_is_lt_2 || radix_is_gt_256 || invalid_bitwise_radix || invalid_num_limbs) {
139 throw ToRadixException(
"Error during BE conversion: Invalid parameters for ToRadix");
142 bool truncated =
false;
145 event.limbs.reserve(num_limbs);
147 const auto [limbs, truncated_decomposition] =
to_le_bits(
value, num_limbs);
148 truncated = truncated_decomposition;
149 std::ranges::for_each(limbs.rbegin(), limbs.rend(), [&](
bool bit) {
150 event.limbs.push_back(MemoryValue::from<uint1_t>(bit));
153 const auto [limbs, truncated_decomposition] =
to_le_radix(
value, num_limbs, radix);
154 truncated = truncated_decomposition;
155 std::ranges::for_each(limbs.rbegin(), limbs.rend(), [&](uint8_t limb) {
156 event.limbs.push_back(MemoryValue::from<uint8_t>(limb));
167 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