@@ -308,6 +308,20 @@ impl Context {
308308 debug_assert_eq ! ( a. get_bv_type( self ) . unwrap( ) , b. get_bv_type( self ) . unwrap( ) ) ;
309309 self . add_expr ( Expr :: BVXor ( a, b, b. get_bv_type ( self ) . unwrap ( ) ) )
310310 }
311+
312+ pub fn xor3 ( & mut self , a : ExprRef , b : ExprRef , c : ExprRef ) -> ExprRef {
313+ let x = self . xor ( a, b) ;
314+ self . xor ( x, c)
315+ }
316+
317+ pub fn majority ( & mut self , a : ExprRef , b : ExprRef , c : ExprRef ) -> ExprRef {
318+ let a_and_b = self . and ( a, b) ;
319+ let a_and_c = self . and ( a, c) ;
320+ let b_and_c = self . and ( b, c) ;
321+ let x = self . or ( a_and_b, a_and_c) ;
322+ self . or ( x, b_and_c)
323+ }
324+
311325 pub fn shift_left ( & mut self , a : ExprRef , b : ExprRef ) -> ExprRef {
312326 debug_assert_eq ! ( a. get_bv_type( self ) . unwrap( ) , b. get_bv_type( self ) . unwrap( ) ) ;
313327 self . add_expr ( Expr :: BVShiftLeft ( a, b, b. get_bv_type ( self ) . unwrap ( ) ) )
@@ -512,6 +526,12 @@ impl<'a> Builder<'a> {
512526 pub fn xor ( & self , a : ExprRef , b : ExprRef ) -> ExprRef {
513527 self . ctx . borrow_mut ( ) . xor ( a, b)
514528 }
529+ pub fn xor3 ( & mut self , a : ExprRef , b : ExprRef , c : ExprRef ) -> ExprRef {
530+ self . ctx . borrow_mut ( ) . xor3 ( a, b, c)
531+ }
532+ pub fn majority ( & mut self , a : ExprRef , b : ExprRef , c : ExprRef ) -> ExprRef {
533+ self . ctx . borrow_mut ( ) . majority ( a, b, c)
534+ }
515535 pub fn shift_left ( & self , a : ExprRef , b : ExprRef ) -> ExprRef {
516536 self . ctx . borrow_mut ( ) . shift_left ( a, b)
517537 }
0 commit comments