Skip to content

Commit 54d1aa4

Browse files
committed
simplify: detect xor
1 parent 61741b3 commit 54d1aa4

File tree

4 files changed

+281
-207
lines changed

4 files changed

+281
-207
lines changed

patronus/src/expr.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,5 @@ pub use serialize::SerializableIrNode;
2828
pub(crate) use serialize::{serialize_expr, serialize_expr_ref};
2929
pub(crate) use simplify::simplify;
3030
pub use simplify::{Simplifier, simplify_single_expression};
31-
pub use transform::simple_transform_expr;
32-
pub(crate) use transform::{ExprTransformMode, do_transform_expr};
31+
pub use transform::{ExprTransformMode, do_transform_expr, simple_transform_expr};
3332
pub use types::{TypeCheck, TypeCheckError};

patronus/src/expr/simplify.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ impl<T: ExprMap<Option<ExprRef>>> Simplifier<T> {
103103
}
104104
}
105105

106+
impl<T: ExprMap<Option<ExprRef>> + Default> Default for Simplifier<T> {
107+
fn default() -> Self {
108+
Self {
109+
cache: T::default(),
110+
}
111+
}
112+
}
113+
106114
/// Simplifies one expression (not its children)
107115
pub(crate) fn simplify(ctx: &mut Context, expr: ExprRef, children: &[ExprRef]) -> Option<ExprRef> {
108116
match (ctx[expr].clone(), children) {
@@ -324,6 +332,17 @@ fn simplify_bv_and(ctx: &mut Context, a: ExprRef, b: ExprRef) -> Option<ExprRef>
324332
let or = ctx.or(*a, *b);
325333
Some(ctx.not(or))
326334
}
335+
// or(a, b) & !and(a,b) -> a xor b
336+
(Expr::BVOr(a, b, _), Expr::BVNot(n, _))
337+
| (Expr::BVNot(n, _), Expr::BVOr(a, b, _)) => {
338+
if let Expr::BVAnd(c, d, _) = &ctx[*n]
339+
&& ((a == c && b == d) || (a == d && b == c))
340+
{
341+
Some(ctx.xor(*a, *b))
342+
} else {
343+
None
344+
}
345+
}
327346
_ => None,
328347
}
329348
}

patronus/src/expr/transform.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub fn simple_transform_expr(
3030
}
3131

3232
#[inline]
33-
pub(crate) fn do_transform_expr<T: ExprMap<Option<ExprRef>>>(
33+
pub fn do_transform_expr<T: ExprMap<Option<ExprRef>>>(
3434
ctx: &mut Context,
3535
mode: ExprTransformMode,
3636
transformed: &mut T,

0 commit comments

Comments
 (0)