Skip to content

Commit

Permalink
fix: Brillig range check with consistent bit size (#4357)
Browse files Browse the repository at this point in the history
# Description

## Problem\*

Partial work towards #4275

## Summary\*



## Additional Context

Tested in aztec-packages here
AztecProtocol/aztec-packages#4556

## Documentation\*

Check one:
- [x] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[Exceptional Case]** Documentation to be submitted in a separate
PR.

# PR Checklist\*

- [x] I have tested the changes locally.
- [x] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
sirasistant authored Feb 13, 2024
1 parent 1048f81 commit ea47d4a
Showing 1 changed file with 13 additions and 7 deletions.
20 changes: 13 additions & 7 deletions compiler/noirc_evaluator/src/brillig/brillig_gen/brillig_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,23 +619,29 @@ impl<'block> BrilligBlock<'block> {
);
}
Instruction::RangeCheck { value, max_bit_size, assert_message } => {
let left = self.convert_ssa_register_value(*value, dfg);
let max = BigUint::from(2_u128).pow(*max_bit_size);
let right = self.brillig_context.allocate_register();
self.brillig_context.const_instruction(
right,
let value = self.convert_ssa_register_value(*value, dfg);
// Cast original value to field
let left = self.brillig_context.allocate_register();
self.convert_cast(left, value, &Type::field());

// Create a field constant with the max
let max = BigUint::from(2_u128).pow(*max_bit_size) - BigUint::from(1_u128);
let right = self.brillig_context.make_constant(
FieldElement::from_be_bytes_reduce(&max.to_bytes_be()).into(),
FieldElement::max_num_bits(),
);

// Check if lte max
let brillig_binary_op = BrilligBinaryOp::Integer {
op: BinaryIntOp::LessThan,
bit_size: max_bit_size + 1,
op: BinaryIntOp::LessThanEquals,
bit_size: FieldElement::max_num_bits(),
};
let condition = self.brillig_context.allocate_register();
self.brillig_context.binary_instruction(left, right, condition, brillig_binary_op);

self.brillig_context.constrain_instruction(condition, assert_message.clone());
self.brillig_context.deallocate_register(condition);
self.brillig_context.deallocate_register(left);
self.brillig_context.deallocate_register(right);
}
Instruction::IncrementRc { value } => {
Expand Down

0 comments on commit ea47d4a

Please sign in to comment.