diff options
author | Alex Auvolat <alex.auvolat@ansys.com> | 2014-07-09 09:40:37 +0200 |
---|---|---|
committer | Alex Auvolat <alex.auvolat@ansys.com> | 2014-07-09 09:40:37 +0200 |
commit | 26846118dc8038e12d46800e89b6fab5fecef948 (patch) | |
tree | 23089831c0ccf5bff220c9436a159fd888878838 /abstract/varenv.ml | |
parent | 4ecc11528b3490df5e2b8ea2c602d291b19c6bf0 (diff) | |
download | scade-analyzer-26846118dc8038e12d46800e89b6fab5fecef948.tar.gz scade-analyzer-26846118dc8038e12d46800e89b6fab5fecef948.zip |
Add simplification pass && better heuristic for BDDs based on ternaries.
Diffstat (limited to 'abstract/varenv.ml')
-rw-r--r-- | abstract/varenv.ml | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/abstract/varenv.ml b/abstract/varenv.ml index 1aa17b4..5d51837 100644 --- a/abstract/varenv.ml +++ b/abstract/varenv.ml @@ -49,6 +49,26 @@ let rec extract_const_vars_root (ecl, _, _) = [] ecl +let extract_choice_groups f = + let rec aux w = function + | BNot n -> aux w n + | BRel _ | BConst _ -> [], [] + | BEnumCons(_, x, EItem _) -> [], [x] + | BEnumCons(_, x, EIdent y) -> [], [y] + | BAnd(a, b) | BOr(a, b) -> + let ga, va = aux w a in + let gb, vb = aux w b in + ga@gb, va@vb + | BTernary(c, a, b) -> + let gc, vc = aux (w /. 3.) c in + let ga, va = aux (w /. 2.) a in + let gb, vb = aux (w /. 2.) b in + let v = uniq_sorted (List.sort compare (vc@va@vb)) in + (w, v)::(gc@ga@gb), v + in + fst (aux 0.6 f) + + (* scope_constrict : id list -> (id * id) list -> id list @@ -215,6 +235,7 @@ let mk_varenv (rp : rooted_prog) f cl = let lv_f = lv_f @ (List.map (fun v -> (0.7, [v; "L"^v])) (List.filter (fun n -> List.mem ("L"^n) evars) evars)) in + let lv_f = lv_f @ (extract_choice_groups f) in let evars_ord = if true then time "FORCE" (fun () -> force_ordering evars lv_f) |