Project

General

Profile

Revision a1daa793 src/automata.ml

View differences:

src/automata.ml
68 68
  mkexpr loc (Expr_when (List.fold_right add_branch conds (mkidentpair loc restart state), state, tag))
69 69

  
70 70
let rec unless_read reads handler =
71
  let res =
71 72
  List.fold_left (fun read (_, c, _, _) -> get_expr_vars read c) reads handler.hand_unless
73
  in
74
(
75
(*
76
Format.eprintf "unless_reads %s = %a@." handler.hand_state (fprintf_list ~sep:" , " (fun fmt v -> Format.fprintf fmt "%s" v)) (ISet.elements reads);
77
Format.eprintf "unless_reads' %s = %a@." handler.hand_state (fprintf_list ~sep:" , " (fun fmt v -> Format.fprintf fmt "%s" v)) (ISet.elements res);
78
*)
79
res
80
)
72 81

  
73 82
let rec until_read reads handler =
74 83
  List.fold_left (fun read (_, c, _, _) -> get_expr_vars read c) reads handler.hand_until
......
79 88
    List.fold_left (fun read stmt ->
80 89
      match stmt with
81 90
      | Eq eq -> get_expr_vars read eq.eq_rhs
82
      | Aut aut -> List.fold_left handler_read read aut.aut_handlers ) reads handler.hand_stmts
83
  in ISet.diff allvars locals
91
      | Aut aut -> automata_read read aut) reads handler.hand_stmts
92
  in let res = ISet.diff allvars locals
93
     in
94
(
95
(*
96
Format.eprintf "handler_allvars %s = %a@." handler.hand_state (fprintf_list ~sep:" , " (fun fmt v -> Format.fprintf fmt "%s" v)) (ISet.elements allvars);
97
Format.eprintf "handler_read %s = %a@." handler.hand_state (fprintf_list ~sep:" , " (fun fmt v -> Format.fprintf fmt "%s" v)) (ISet.elements res);
98
*)
99
res
100
)
101

  
102
and automata_read reads aut =
103
  List.fold_left (fun read handler -> until_read (handler_read (unless_read read handler) handler) handler) reads aut.aut_handlers
84 104

  
85 105
let rec handler_write writes handler =
86 106
  let locals = List.fold_left (fun locals v -> ISet.add v.var_id locals) ISet.empty handler.hand_locals in
......
117 137
  [aut_state.incoming_r'; aut_state.incoming_r; aut_state.actual_r; aut_state.incoming_s'; as_clock aut_state.incoming_s; as_clock aut_state.actual_s]
118 138

  
119 139
let node_of_unless nused used node aut_id aut_state handler =
140
(*Format.eprintf "node_of_unless %s@." node.node_id;*)
120 141
  let inputs = unless_read ISet.empty handler in
121 142
  let var_inputs = aut_state.incoming_r :: aut_state.incoming_s :: (node_vars_of_idents node inputs) in
122 143
  let var_outputs = aut_state.actual_r :: aut_state.actual_s :: [] in
......
160 181
  (fun name -> try IMap.find name table with Not_found -> name)
161 182

  
162 183
let node_of_assign_until nused used node aut_id aut_state handler =
184
(*Format.eprintf "node_of_assign_until %s@." node.node_id;*)
163 185
  let writes = handler_write ISet.empty handler in
164 186
  let inputs = ISet.diff (handler_read (until_read ISet.empty handler) handler) writes in
165 187
  let frename = mk_frename used writes in
166 188
  let var_inputs = node_vars_of_idents node inputs in
167 189
  let new_var_locals = node_vars_of_idents node writes in
168
  let var_outputs = node_vars_of_idents node writes in
190
  let var_outputs = List.sort IdentModule.compare (node_vars_of_idents node writes) in
169 191
  let new_var_outputs = List.map (fun vdecl -> { vdecl with var_id = frename vdecl.var_id }) var_outputs in
170 192
  let new_output_eqs = List.map2 (fun o o' -> Eq (mkeq handler.hand_loc ([o'.var_id], mkident handler.hand_loc o.var_id))) var_outputs new_var_outputs in
171 193
  let until_expr = List.fold_right add_branch handler.hand_until (mkidentpair handler.hand_loc aut_state.actual_r.var_id aut_state.actual_s.var_id) in

Also available in: Unified diff