1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

Implement Le, Gt, Ge

This commit is contained in:
Tjaden Hess 2018-10-31 17:57:57 -04:00
parent 59bd101fc5
commit a1d0a0aee8
2 changed files with 61 additions and 1 deletions

View file

@ -0,0 +1,8 @@
// comparison operator example
def main(field x) -> (field):
field y = if x >= 3 then 1 else 5 fi
field z = if y <= x then x**3 else y**3 fi
y = if x < 3 then 2 else 6 fi
z = if y > z then 1 else 2 fi
x = if x == x then x else y fi
return x + y + z

View file

@ -355,13 +355,31 @@ impl Flattener {
FlatExpression::Identifier(name_1_y) FlatExpression::Identifier(name_1_y)
}, },
BooleanExpression::Le(box lhs, box rhs) => {
let lt = self.flatten_boolean_expression(functions_flattened,
arguments_flattened,
statements_flattened,
BooleanExpression::Lt(box lhs.clone(), box rhs.clone()));
let eq = self.flatten_boolean_expression(functions_flattened,
arguments_flattened,
statements_flattened,
BooleanExpression::Eq(box lhs.clone(), box rhs.clone()));
FlatExpression::Add(box eq, box lt)
}
BooleanExpression::Gt(lhs, rhs) => self.flatten_boolean_expression(functions_flattened,
arguments_flattened,
statements_flattened,
BooleanExpression::Lt(rhs, lhs)),
BooleanExpression::Ge(lhs, rhs) => self.flatten_boolean_expression(functions_flattened,
arguments_flattened,
statements_flattened,
BooleanExpression::Le(rhs, lhs)),
BooleanExpression::Value(b) => { BooleanExpression::Value(b) => {
FlatExpression::Number(match b { FlatExpression::Number(match b {
true => T::from(1), true => T::from(1),
false => T::from(0) false => T::from(0)
}) })
} }
_ => unimplemented!(),
} }
} }
@ -1746,6 +1764,40 @@ mod tests {
); );
} }
#[test]
fn geq_leq() {
let expression_le =
BooleanExpression::Le(
box FieldElementExpression::Number(FieldPrime::from(32)),
box FieldElementExpression::Number(FieldPrime::from(4))
);
let expression_ge =
BooleanExpression::Ge(
box FieldElementExpression::Number(FieldPrime::from(32)),
box FieldElementExpression::Number(FieldPrime::from(4))
);
let mut functions_flattened = vec![];
let mut flattener = Flattener::new(FieldPrime::get_required_bits());
flattener.load_corelib(&mut functions_flattened);
flattener.flatten_boolean_expression(
&functions_flattened,
&vec![],
&mut vec![],
expression_le
);
flattener.flatten_boolean_expression(
&functions_flattened,
&vec![],
&mut vec![],
expression_ge
);
}
#[test] #[test]
fn field_array() { fn field_array() {