force reduce x_to_bits embed arguments
This commit is contained in:
parent
f7f6a8421a
commit
db9abf4519
4 changed files with 44 additions and 21 deletions
|
@ -1089,7 +1089,10 @@ impl<'ast, T: Field> Flattener<'ast, T> {
|
|||
bitwidth: UBitwidth,
|
||||
) -> Vec<FlatUExpression<T>> {
|
||||
let expression = UExpression::try_from(expression).unwrap();
|
||||
let from = expression.metadata.as_ref().unwrap().bitwidth();
|
||||
let metadata = expression.metadata.as_ref().unwrap();
|
||||
assert!(!metadata.should_reduce.is_unknown());
|
||||
|
||||
let from = metadata.bitwidth();
|
||||
let p = self.flatten_uint_expression(statements_flattened, expression);
|
||||
self.get_bits(&p, from as usize, bitwidth, statements_flattened)
|
||||
.into_iter()
|
||||
|
|
|
@ -492,24 +492,44 @@ impl<'ast, T: Field> Folder<'ast, T> for UintOptimizer<'ast, T> {
|
|||
_ => {}
|
||||
};
|
||||
|
||||
vec![ZirStatement::MultipleDefinition(
|
||||
lhs,
|
||||
ZirExpressionList::EmbedCall(
|
||||
embed,
|
||||
generics,
|
||||
arguments
|
||||
.into_iter()
|
||||
.map(|e| match e {
|
||||
ZirExpression::Uint(e) => {
|
||||
let e = self.fold_uint_expression(e);
|
||||
let e = force_no_reduce(e);
|
||||
ZirExpression::Uint(e)
|
||||
}
|
||||
e => self.fold_expression(e),
|
||||
})
|
||||
.collect(),
|
||||
),
|
||||
)]
|
||||
match embed {
|
||||
FlatEmbed::U8ToBits
|
||||
| FlatEmbed::U16ToBits
|
||||
| FlatEmbed::U32ToBits
|
||||
| FlatEmbed::U64ToBits => {
|
||||
vec![ZirStatement::MultipleDefinition(
|
||||
lhs,
|
||||
ZirExpressionList::EmbedCall(
|
||||
embed,
|
||||
generics,
|
||||
arguments
|
||||
.into_iter()
|
||||
.map(|e| match e {
|
||||
ZirExpression::Uint(e) => {
|
||||
let e = self.fold_uint_expression(e);
|
||||
let e = force_reduce(e);
|
||||
ZirExpression::Uint(e)
|
||||
}
|
||||
e => self.fold_expression(e),
|
||||
})
|
||||
.collect(),
|
||||
),
|
||||
)]
|
||||
}
|
||||
_ => {
|
||||
vec![ZirStatement::MultipleDefinition(
|
||||
lhs,
|
||||
ZirExpressionList::EmbedCall(
|
||||
embed,
|
||||
generics,
|
||||
arguments
|
||||
.into_iter()
|
||||
.map(|e| self.fold_expression(e))
|
||||
.collect(),
|
||||
),
|
||||
)]
|
||||
}
|
||||
}
|
||||
}
|
||||
ZirStatement::Assertion(BooleanExpression::UintEq(box left, box right)) => {
|
||||
let left = self.fold_uint_expression(left);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// Generic walk through a typed AST. Not mutating in place
|
||||
// Generic walk through ZIR. Not mutating in place
|
||||
|
||||
use crate::zir::types::UBitwidth;
|
||||
use crate::zir::*;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// Generic walk through a typed AST. Not mutating in place
|
||||
// Generic walk through ZIR. Not mutating in place
|
||||
|
||||
use crate::zir::types::UBitwidth;
|
||||
use crate::zir::*;
|
||||
|
|
Loading…
Reference in a new issue