You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.5 KiB
55 lines
1.5 KiB
(*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*)
|
|
|
|
open! IStd
|
|
module F = Format
|
|
module AbductiveDomain = PulseAbductiveDomain
|
|
|
|
type t =
|
|
| AbortProgram of AbductiveDomain.t
|
|
| ContinueProgram of AbductiveDomain.t
|
|
| ExitProgram of AbductiveDomain.t
|
|
|
|
let continue astate = ContinueProgram astate
|
|
|
|
let mk_initial pdesc = ContinueProgram (AbductiveDomain.mk_initial pdesc)
|
|
|
|
let leq ~lhs ~rhs =
|
|
match (lhs, rhs) with
|
|
| AbortProgram astate1, AbortProgram astate2
|
|
| ContinueProgram astate1, ContinueProgram astate2
|
|
| ExitProgram astate1, ExitProgram astate2 ->
|
|
AbductiveDomain.leq ~lhs:astate1 ~rhs:astate2
|
|
| _ ->
|
|
false
|
|
|
|
|
|
let pp fmt = function
|
|
| ContinueProgram astate ->
|
|
AbductiveDomain.pp fmt astate
|
|
| ExitProgram astate ->
|
|
F.fprintf fmt "{ExitProgram %a}" AbductiveDomain.pp astate
|
|
| AbortProgram astate ->
|
|
F.fprintf fmt "{AbortProgram %a}" AbductiveDomain.pp astate
|
|
|
|
|
|
let map ~f exec_state =
|
|
match exec_state with
|
|
| AbortProgram astate ->
|
|
AbortProgram (f astate)
|
|
| ContinueProgram astate ->
|
|
ContinueProgram (f astate)
|
|
| ExitProgram astate ->
|
|
ExitProgram (f astate)
|
|
|
|
|
|
let of_posts pdesc posts =
|
|
List.filter_map posts ~f:(fun exec_state ->
|
|
let (AbortProgram astate | ContinueProgram astate | ExitProgram astate) = exec_state in
|
|
if PulseArithmetic.is_unsat_expensive astate then None
|
|
else Some (map exec_state ~f:(AbductiveDomain.of_post pdesc)) )
|