55use clap:: Parser ;
66use patronus:: expr:: * ;
77use patronus:: smt:: { SmtCommand , read_command, serialize_cmd} ;
8+ use patronus_sca:: * ;
89use rustc_hash:: FxHashMap ;
910use std:: io:: { BufReader , BufWriter } ;
1011use std:: path:: PathBuf ;
@@ -17,6 +18,8 @@ use std::path::PathBuf;
1718struct Args {
1819 #[ arg( long) ]
1920 do_not_simplify : bool ,
21+ #[ arg( long) ]
22+ skip_sca : bool ,
2023 #[ arg( value_name = "INPUT" , index = 1 ) ]
2124 input_file : PathBuf ,
2225 #[ arg( value_name = "OUTPUT" , index = 2 ) ]
@@ -45,22 +48,44 @@ fn main() {
4548 let cmd = if args. do_not_simplify {
4649 cmd
4750 } else {
48- simplify ( & mut ctx, & mut simplifier, cmd)
51+ simplify_cmd ( cmd, |e| {
52+ let e_after_sca = if args. skip_sca {
53+ e
54+ } else {
55+ let p = find_sca_simplification_candidates ( & ctx, e) ;
56+ let subs: FxHashMap < _ , _ > = p
57+ . into_iter ( )
58+ . flat_map ( |p| match verify_word_level_equality ( & mut ctx, p) {
59+ ScaVerifyResult :: Equal => Some ( ( p. equality_expr ( ) , ctx. get_true ( ) ) ) ,
60+ ScaVerifyResult :: Unknown => None ,
61+ ScaVerifyResult :: Unequal ( _) => {
62+ Some ( ( p. equality_expr ( ) , ctx. get_false ( ) ) )
63+ }
64+ } )
65+ . collect ( ) ;
66+ substitute ( & mut ctx, e, subs)
67+ } ;
68+ simplifier. simplify ( & mut ctx, e_after_sca)
69+ } )
4970 } ;
5071 serialize_cmd ( & mut out, Some ( & ctx) , & cmd) . expect ( "failed to write command" ) ;
5172 }
5273}
5374
54- fn simplify < T : ExprMap < Option < ExprRef > > > (
55- ctx : & mut Context ,
56- s : & mut Simplifier < T > ,
57- cmd : SmtCommand ,
58- ) -> SmtCommand {
75+ fn substitute ( ctx : & mut Context , e : ExprRef , subs : FxHashMap < ExprRef , ExprRef > ) -> ExprRef {
76+ if subs. is_empty ( ) {
77+ e
78+ } else {
79+ simple_transform_expr ( ctx, e, |_, e, _| subs. get ( & e) . cloned ( ) )
80+ }
81+ }
82+
83+ fn simplify_cmd ( cmd : SmtCommand , mut simplify : impl FnMut ( ExprRef ) -> ExprRef ) -> SmtCommand {
5984 match cmd {
60- SmtCommand :: Assert ( e) => SmtCommand :: Assert ( s . simplify ( ctx , e) ) ,
61- SmtCommand :: DefineConst ( sym, value) => SmtCommand :: DefineConst ( sym, s . simplify ( ctx , value) ) ,
85+ SmtCommand :: Assert ( e) => SmtCommand :: Assert ( simplify ( e) ) ,
86+ SmtCommand :: DefineConst ( sym, value) => SmtCommand :: DefineConst ( sym, simplify ( value) ) ,
6287 SmtCommand :: CheckSatAssuming ( e) => {
63- SmtCommand :: CheckSatAssuming ( e. into_iter ( ) . map ( |e| s . simplify ( ctx , e) ) . collect ( ) )
88+ SmtCommand :: CheckSatAssuming ( e. into_iter ( ) . map ( |e| simplify ( e) ) . collect ( ) )
6489 }
6590 other => other,
6691 }
0 commit comments