Project

General

Profile

« Previous | Next » 

Revision 333e3a25

Added by Pierre-Loïc Garoche over 5 years ago

[general] Refactor get_node_eqs to produce (eqs, auts) with automatons

View differences:

src/access.ml
80 80
  let checks =
81 81
    List.fold_left check_var_decl checks (get_node_vars nd) in
82 82
  let checks =
83
    List.fold_left (fun checks eq -> check_expr checks eq.eq_rhs) checks (get_node_eqs nd) in
83
    let eqs, auts = get_node_eqs nd in
84
    assert (auts = []); (* Not checking automata yet . *)
85
    List.fold_left (fun checks eq -> check_expr checks eq.eq_rhs) checks eqs in
84 86
  nd.node_checks <- CSet.elements checks
85 87

  
86 88
let check_top_decl decl =
src/algebraicLoop.ml
43 43
  let resolve node partition : call list =
44 44
    let partition = ISet.of_list partition in
45 45
    (* Preprocessing calls: associate to each of them the eq.lhs associated *)
46
    let eqs = get_node_eqs node in
47
    let calls_expr = Causality.NodeDep.get_calls (fun _ -> true) eqs in
46
    let calls_expr = Causality.NodeDep.get_calls (fun _ -> true) node in
47
    let eqs, auts = get_node_eqs node in
48
    assert (auts = []); (* TODO voir si on peut acceder directement aux eqs qui font les calls *)
48 49
    let calls = List.map (
49 50
      fun expr ->
50 51
	let eq = List.find (fun eq ->
src/causality.ml
88 88
let new_graph () =
89 89
  IdentDepGraph.create ()
90 90

  
91
    
91 92
module ExprDep = struct
92

  
93
  let get_node_eqs nd =
94
    let eqs, auts = get_node_eqs nd in
95
    if auts != [] then assert false (* No call on causality on a Lustre model
96
				       with automaton. They should be expanded by now. *);
97
    eqs
98
      
93 99
  let instance_var_cpt = ref 0
94 100

  
95 101
(* read vars represent input/mem read-only vars,
......
317 323
    | Expr_appl (id, args, _) -> Some (id, expr_list_of_expr args)
318 324
    | _ -> None
319 325

  
320
  let get_calls prednode eqs =
321
    let deps =
322
      List.fold_left 
323
	(fun accu eq -> ESet.union accu (get_expr_calls prednode eq.eq_rhs))
324
	ESet.empty
325
	eqs in
326
  let get_calls prednode nd =
327
    let accu f init objl = List.fold_left (fun accu o -> ESet.union accu (f o)) init objl in
328
    let get_eq_calls eq = get_expr_calls prednode eq.eq_rhs in
329
    let rec get_stmt_calls s =
330
      match s with Eq eq -> get_eq_calls eq | Aut aut -> get_aut_calls aut 
331
    and get_aut_calls aut =
332
      let get_handler_calls h =
333
	let get_cond_calls c = accu (fun (_,e,_,_) -> get_expr_calls prednode e) ESet.empty c in
334
	let until = get_cond_calls h.hand_until in
335
	let unless = get_cond_calls h.hand_unless in
336
	let calls = ESet.union until unless in 
337
	let calls = accu get_stmt_calls calls h.hand_stmts in
338
	let calls = accu (fun a -> get_expr_calls prednode a.assert_expr) calls h.hand_asserts in
339
	(* let calls = accu xx calls h.hand_annots in *) (* TODO: search for calls in eexpr *)
340
	calls
341
      in
342
      accu get_handler_calls ESet.empty aut.aut_handlers
343
    in
344
    let eqs, auts = get_node_eqs nd in
345
    let deps = accu get_eq_calls ESet.empty eqs in
346
    let deps = accu get_aut_calls deps auts in
326 347
    ESet.elements deps
327 348

  
328 349
  let dependence_graph prog =
......
335 356
	   let accu = add_vertices [nd.node_id] accu in
336 357
	   let deps = List.map
337 358
	     (fun e -> fst (desome (get_callee e)))
338
	     (get_calls (fun _ -> true) (get_node_eqs nd)) 
359
	     (get_calls (fun _ -> true) nd) 
339 360
	   in
340 361
	     (* Adding assert expressions deps *)
341 362
	   let deps_asserts =
......
378 399
	match td.top_decl_desc with 
379 400
	| Node nd ->
380 401
	   let prednode n = is_generic_node (Hashtbl.find node_table n) in
381
	   nd.node_gencalls <- get_calls prednode (get_node_eqs nd)
402
	   nd.node_gencalls <- get_calls prednode nd
382 403
	| _ -> ()
383 404
	   
384 405
      ) prog
......
459 480
     - a modified acyclic version of [g]
460 481
  *)
461 482
  let break_cycles node mems g =
462
    let (mem_eqs, non_mem_eqs) = List.partition (fun eq -> List.exists (fun v -> ISet.mem v mems) eq.eq_lhs) (get_node_eqs node) in
483
    let eqs , auts = get_node_eqs node in
484
    assert (auts = []); (* TODO: check: For the moment we assume that auts are expanded by now *)
485
    let (mem_eqs, non_mem_eqs) = List.partition (fun eq -> List.exists (fun v -> ISet.mem v mems) eq.eq_lhs) eqs in
463 486
    let rec break vdecls mem_eqs g =
464 487
      let scc_l = Cycles.scc_list g in
465 488
      let wrong = List.filter (wrong_partition g) scc_l in
src/clock_calculus.ml
681 681
  let new_env = clock_var_decl_list env false nd.node_inputs in
682 682
  let new_env = clock_var_decl_list new_env true nd.node_outputs in
683 683
  let new_env = clock_var_decl_list new_env true nd.node_locals in
684
  List.iter (clock_eq new_env) (get_node_eqs nd);
684
  let eqs, auts = get_node_eqs nd in (* TODO XXX: perform the clocking on auts.
685
					For the moment, it is ignored *)
686
  List.iter (clock_eq new_env) eqs;
685 687
  let ck_ins = clock_of_vlist nd.node_inputs in
686 688
  let ck_outs = clock_of_vlist nd.node_outputs in
687 689
  let ck_node = new_ck (Carrow (ck_ins,ck_outs)) false in
......
690 692
  (* Local variables may contain first-order carrier variables that should be generalized.
691 693
     That's not the case for types. *)
692 694
  try_generalize ck_node loc;
693
(*
694
  List.iter (fun vdecl -> try_generalize vdecl.var_clock vdecl.var_loc) nd.node_inputs;
695
  List.iter (fun vdecl -> try_generalize vdecl.var_clock vdecl.var_loc) nd.node_outputs;*)
695
  (*
696
    List.iter (fun vdecl -> try_generalize vdecl.var_clock vdecl.var_loc) nd.node_inputs;
697
    List.iter (fun vdecl -> try_generalize vdecl.var_clock vdecl.var_loc) nd.node_outputs;*)
696 698
  (*List.iter (fun vdecl -> try_generalize vdecl.var_clock vdecl.var_loc) nd.node_locals;*)
697 699
  (* TODO : Xavier pourquoi ai je cette erreur ? *)
698
(*  if (is_main && is_polymorphic ck_node) then
699
    raise (Error (loc,(Cannot_be_polymorphic ck_node)));
700
*)
700
  (*  if (is_main && is_polymorphic ck_node) then
701
      raise (Error (loc,(Cannot_be_polymorphic ck_node)));
702
  *)
701 703
  Log.report ~level:3 (fun fmt -> print_ck fmt ck_node);
702 704
  nd.node_clock <- ck_node;
703 705
  Env.add_value env nd.node_id ck_node
src/clocks.ml
33 33
    {mutable carrier_desc: carrier_desc;
34 34
     mutable carrier_scoped: bool;
35 35
     carrier_id: int}
36

  
36
     
37 37
type clock_expr =
38 38
    {mutable cdesc: clock_desc;
39 39
     mutable cscoped: bool;
......
422 422
  | Carry_name -> cr.carrier_desc <- Carry_const const
423 423
  | _         -> assert false
424 424

  
425

  
426
(* Used in rename functions in Corelang. We have to propagate the renaming to
427
   ids of variables clocking the signals *)
428

  
429
(* Carrier are not renamed. They corresponds to enumerated type constants *)
430
(*
431
let rec rename_carrier f c =
432
  { c with carrier_desc = rename_carrier_desc fvar c.carrier_desc }
433
and rename_carrier_desc f 
434
let re = rename_carrier f
435
  match cd with
436
  | Carry_const id -> Carry_const (f id)
437
  | Carry_link ce -> Carry_link (re ce)
438
  | _ -> cd
439
*)
440

  
441
     
442
let rec rename_clock_expr fvar c =
443
  { c with cdesc = rename_clock_desc fvar c.cdesc }
444
and rename_clock_desc fvar cd =
445
  let re = rename_clock_expr fvar in
446
  match cd with
447
  | Carrow (c1, c2) -> Carrow (re c1, re c2)
448
  | Ctuple cl -> Ctuple (List.map re cl)
449
  | Con (c1, car, id) -> Con (re c1, car, fvar id)
450
  | Cvar 
451
  | Cunivar -> cd
452
  | Clink c -> Clink (re c)
453
  | Ccarrying (car, c) -> Ccarrying (car, re c)
454
    
425 455
(* Local Variables: *)
426 456
(* compile-command:"make -C .." *)
427 457
(* End: *)
src/corelang.ml
130 130
  match top_decl.top_decl_desc with
131 131
  | TypeDef tdef ->
132 132
    (match tdef.tydef_desc with
133
     | Tydec_enum tags -> List.map (fun tag -> let cdecl = { const_id = tag; const_loc = top_decl.top_decl_loc; const_value = Const_tag tag; const_type = Type_predef.type_const tdef.tydef_id } in { top_decl with top_decl_desc = Const cdecl }) tags
133
    | Tydec_enum tags ->
134
       List.map
135
	 (fun tag ->
136
	   let cdecl = {
137
	     const_id = tag;
138
	     const_loc = top_decl.top_decl_loc;
139
	     const_value = Const_tag tag;
140
	     const_type = Type_predef.type_const tdef.tydef_id
141
	   } in
142
	   { top_decl with top_decl_desc = Const cdecl })
143
	 tags
134 144
     | _               -> [])
135 145
  | _ -> assert false
136 146

  
......
538 548
    (* Format.eprintf "Unable to find variable %s in node %s@.@?" id node.node_id; *)
539 549
    raise Not_found
540 550
  end
541
    
551

  
552

  
542 553
let get_node_eqs =
543 554
  let get_eqs stmts =
544 555
    List.fold_right
545
      (fun stmt res ->
556
      (fun stmt (res_eq, res_aut) ->
546 557
	match stmt with
547
	| Eq eq -> eq :: res
548
	| Aut _ -> assert false)
558
	| Eq eq -> eq :: res_eq, res_aut
559
	| Aut aut -> res_eq, aut::res_aut)
549 560
      stmts
550
      [] in
561
      ([], []) in
551 562
  let table_eqs = Hashtbl.create 23 in
552 563
  (fun nd ->
553 564
    try
......
561 572
      end)
562 573

  
563 574
let get_node_eq id node =
564
 List.find (fun eq -> List.mem id eq.eq_lhs) (get_node_eqs node)
565

  
575
  let eqs, auts = get_node_eqs node in
576
  try
577
    List.find (fun eq -> List.mem id eq.eq_lhs) eqs
578
  with
579
    Not_found -> (* Shall be defined in automata auts *) raise Not_found
580
      
566 581
let get_nodes prog = 
567 582
  List.fold_left (
568 583
    fun nodes decl ->
......
630 645
 | Ckdec_bool cl -> Ckdec_bool (List.map (fun (c, l) -> rename c, l) cl)
631 646
 | _             -> cck
632 647

  
633
(*Format.eprintf "Types.rename_static %a = %a@." print_ty ty print_ty res; res*)
648
 (*Format.eprintf "Types.rename_static %a = %a@." print_ty ty print_ty res; res*)
634 649

  
635 650
(* applies the renaming function [fvar] to all variables of expression [expr] *)
636
 let rec expr_replace_var fvar expr =
637
  { expr with expr_desc = expr_desc_replace_var fvar expr.expr_desc }
638

  
639
 and expr_desc_replace_var fvar expr_desc =
640
   match expr_desc with
641
   | Expr_const _ -> expr_desc
642
   | Expr_ident i -> Expr_ident (fvar i)
643
   | Expr_array el -> Expr_array (List.map (expr_replace_var fvar) el)
644
   | Expr_access (e1, d) -> Expr_access (expr_replace_var fvar e1, d)
645
   | Expr_power (e1, d) -> Expr_power (expr_replace_var fvar e1, d)
646
   | Expr_tuple el -> Expr_tuple (List.map (expr_replace_var fvar) el)
647
   | Expr_ite (c, t, e) -> Expr_ite (expr_replace_var fvar c, expr_replace_var fvar t, expr_replace_var fvar e)
648
   | Expr_arrow (e1, e2)-> Expr_arrow (expr_replace_var fvar e1, expr_replace_var fvar e2) 
649
   | Expr_fby (e1, e2) -> Expr_fby (expr_replace_var fvar e1, expr_replace_var fvar e2)
650
   | Expr_pre e' -> Expr_pre (expr_replace_var fvar e')
651
   | Expr_when (e', i, l)-> Expr_when (expr_replace_var fvar e', fvar i, l)
652
   | Expr_merge (i, hl) -> Expr_merge (fvar i, List.map (fun (t, h) -> (t, expr_replace_var fvar h)) hl)
653
   | Expr_appl (i, e', i') -> Expr_appl (i, expr_replace_var fvar e', Utils.option_map (expr_replace_var fvar) i')
654

  
655
(* Applies the renaming function [fvar] to every rhs
656
   only when the corresponding lhs satisfies predicate [pvar] *)
657
 let eq_replace_rhs_var pvar fvar eq =
658
   let pvar l = List.exists pvar l in
659
   let rec replace lhs rhs =
660
     { rhs with expr_desc =
661
     match lhs with
662
     | []  -> assert false
663
     | [_] -> if pvar lhs then expr_desc_replace_var fvar rhs.expr_desc else rhs.expr_desc
664
     | _   ->
665
       (match rhs.expr_desc with
666
       | Expr_tuple tl ->
667
	 Expr_tuple (List.map2 (fun v e -> replace [v] e) lhs tl)
668
       | Expr_appl (f, arg, None) when Basic_library.is_expr_internal_fun rhs ->
669
	 let args = expr_list_of_expr arg in
670
	 Expr_appl (f, expr_of_expr_list arg.expr_loc (List.map (replace lhs) args), None)
671
       | Expr_array _
672
       | Expr_access _
673
       | Expr_power _
674
       | Expr_const _
675
       | Expr_ident _
676
       | Expr_appl _   ->
677
	 if pvar lhs
678
	 then expr_desc_replace_var fvar rhs.expr_desc
679
	 else rhs.expr_desc
680
       | Expr_ite (c, t, e)   -> Expr_ite (replace lhs c, replace lhs t, replace lhs e)
681
       | Expr_arrow (e1, e2)  -> Expr_arrow (replace lhs e1, replace lhs e2) 
682
       | Expr_fby (e1, e2)    -> Expr_fby (replace lhs e1, replace lhs e2)
683
       | Expr_pre e'          -> Expr_pre (replace lhs e')
684
       | Expr_when (e', i, l) -> let i' = if pvar lhs then fvar i else i
685
				 in Expr_when (replace lhs e', i', l)
686
       | Expr_merge (i, hl)   -> let i' = if pvar lhs then fvar i else i
687
				 in Expr_merge (i', List.map (fun (t, h) -> (t, replace lhs h)) hl)
688
       )
689
     }
690
   in { eq with eq_rhs = replace eq.eq_lhs eq.eq_rhs }
651
 (* let rec expr_replace_var fvar expr = *)
652
 (*  { expr with expr_desc = expr_desc_replace_var fvar expr.expr_desc } *)
691 653

  
692

  
693
 let rec rename_expr  f_node f_var f_const expr =
694
   { expr with expr_desc = rename_expr_desc f_node f_var f_const expr.expr_desc }
695
 and rename_expr_desc f_node f_var f_const expr_desc =
696
   let re = rename_expr  f_node f_var f_const in
654
 (* and expr_desc_replace_var fvar expr_desc = *)
655
 (*   match expr_desc with *)
656
 (*   | Expr_const _ -> expr_desc *)
657
 (*   | Expr_ident i -> Expr_ident (fvar i) *)
658
 (*   | Expr_array el -> Expr_array (List.map (expr_replace_var fvar) el) *)
659
 (*   | Expr_access (e1, d) -> Expr_access (expr_replace_var fvar e1, d) *)
660
 (*   | Expr_power (e1, d) -> Expr_power (expr_replace_var fvar e1, d) *)
661
 (*   | Expr_tuple el -> Expr_tuple (List.map (expr_replace_var fvar) el) *)
662
 (*   | Expr_ite (c, t, e) -> Expr_ite (expr_replace_var fvar c, expr_replace_var fvar t, expr_replace_var fvar e) *)
663
 (*   | Expr_arrow (e1, e2)-> Expr_arrow (expr_replace_var fvar e1, expr_replace_var fvar e2)  *)
664
 (*   | Expr_fby (e1, e2) -> Expr_fby (expr_replace_var fvar e1, expr_replace_var fvar e2) *)
665
 (*   | Expr_pre e' -> Expr_pre (expr_replace_var fvar e') *)
666
 (*   | Expr_when (e', i, l)-> Expr_when (expr_replace_var fvar e', fvar i, l) *)
667
 (*   | Expr_merge (i, hl) -> Expr_merge (fvar i, List.map (fun (t, h) -> (t, expr_replace_var fvar h)) hl) *)
668
 (*   | Expr_appl (i, e', i') -> Expr_appl (i, expr_replace_var fvar e', Utils.option_map (expr_replace_var fvar) i') *)
669

  
670

  
671

  
672
 let rec rename_expr  f_node f_var expr =
673
   { expr with expr_desc = rename_expr_desc f_node f_var expr.expr_desc }
674
 and rename_expr_desc f_node f_var expr_desc =
675
   let re = rename_expr  f_node f_var in
697 676
   match expr_desc with
698 677
   | Expr_const _ -> expr_desc
699 678
   | Expr_ident i -> Expr_ident (f_var i)
......
710 689
     Expr_merge (f_var i, List.map (fun (t, h) -> (t, re h)) hl)
711 690
   | Expr_appl (i, e', i') -> 
712 691
     Expr_appl (f_node i, re e', Utils.option_map re i')
713
  
714
 let rename_node_annot f_node f_var f_const expr  =
715
   expr
716
 (* TODO assert false *)
717

  
718
 let rename_expr_annot f_node f_var f_const annot =
719
   annot
720
 (* TODO assert false *)
721

  
722
let rename_node f_node f_var f_const nd =
723
  let rename_var v = { v with var_id = f_var v.var_id } in
724
  let rename_eq eq = { eq with
725
      eq_lhs = List.map f_var eq.eq_lhs; 
726
      eq_rhs = rename_expr f_node f_var f_const eq.eq_rhs
727
    } 
728
  in
729
  let inputs = List.map rename_var nd.node_inputs in
730
  let outputs = List.map rename_var nd.node_outputs in
731
  let locals = List.map rename_var nd.node_locals in
732
  let gen_calls = List.map (rename_expr f_node f_var f_const) nd.node_gencalls in
733
  let node_checks = List.map (Dimension.expr_replace_var f_var)  nd.node_checks in
734
  let node_asserts = List.map 
735
    (fun a -> 
736
      {a with assert_expr = 
737
	  let expr = a.assert_expr in
738
	  rename_expr f_node f_var f_const expr})
739
    nd.node_asserts
740
  in
741
  let node_stmts = List.map (fun eq -> Eq (rename_eq eq)) (get_node_eqs nd) in
742
  let spec = 
743
    Utils.option_map 
744
      (fun s -> rename_node_annot f_node f_var f_const s) 
745
      nd.node_spec 
746
  in
747
  let annot =
748
    List.map 
749
      (fun s -> rename_expr_annot f_node f_var f_const s) 
750
      nd.node_annot
751
  in
752
  {
753
    node_id = f_node nd.node_id;
754
    node_type = nd.node_type;
755
    node_clock = nd.node_clock;
756
    node_inputs = inputs;
757
    node_outputs = outputs;
758
    node_locals = locals;
759
    node_gencalls = gen_calls;
760
    node_checks = node_checks;
761
    node_asserts = node_asserts;
762
    node_stmts = node_stmts;
763
    node_dec_stateless = nd.node_dec_stateless;
764
    node_stateless = nd.node_stateless;
765
    node_spec = spec;
766
    node_annot = annot;
767
  }
692

  
693
 let rename_dec_type f_node f_var t = assert false (*
694
						     Types.rename_dim_type (Dimension.rename f_node f_var) t*)
695

  
696
 let rename_dec_clock f_node f_var c = assert false (* 
697
					  Clocks.rename_clock_expr f_var c*)
698
   
699
 let rename_var f_node f_var v = {
700
   v with
701
     var_id = f_var v.var_id;
702
     var_dec_type = rename_dec_type f_node f_var v.var_type;
703
     var_dec_clock = rename_dec_clock f_node f_var v.var_clock
704
 } 
705

  
706
 let rename_vars f_node f_var = List.map (rename_var f_node f_var) 
707

  
708
 let rec rename_eq f_node f_var eq = { eq with
709
   eq_lhs = List.map f_var eq.eq_lhs; 
710
   eq_rhs = rename_expr f_node f_var eq.eq_rhs
711
 } 
712
 and rename_handler f_node f_var  h = {h with
713
   hand_state = f_var h.hand_state;
714
   hand_unless = List.map (
715
     fun (l,e,b,id) -> l, rename_expr f_node f_var e, b, f_var id
716
   ) h.hand_unless;
717
   hand_until = List.map (
718
     fun (l,e,b,id) -> l, rename_expr f_node f_var e, b, f_var id
719
   ) h.hand_until;
720
   hand_locals = rename_vars f_node f_var h.hand_locals;
721
   hand_stmts = rename_stmts f_node f_var h.hand_stmts;
722
   hand_annots = rename_annots f_node f_var h.hand_annots;
723
   
724
 } 
725
 and rename_aut f_node f_var  aut = { aut with
726
   aut_id = f_var aut.aut_id;
727
   aut_handlers = List.map (rename_handler f_node f_var) aut.aut_handlers;
728
 }
729
 and rename_stmts f_node f_var stmts = List.map (fun stmt -> match stmt with
730
   | Eq eq -> Eq (rename_eq f_node f_var eq)
731
   | Aut at -> Aut (rename_aut f_node f_var at))
732
   stmts
733
 and rename_annotl f_node f_var  annots = 
734
   List.map 
735
     (fun (key, value) -> key, rename_eexpr f_node f_var value) 
736
     annots
737
 and rename_annot f_node f_var annot =
738
   { annot with annots = rename_annotl f_node f_var annot.annots }
739
 and rename_annots f_node f_var annots =
740
   List.map (rename_annot f_node f_var) annots
741
and rename_eexpr f_node f_var ee =
742
   { ee with
743
     eexpr_tag = Utils.new_tag ();
744
     eexpr_qfexpr = rename_expr f_node f_var ee.eexpr_qfexpr;
745
     eexpr_quantifiers = List.map (fun (typ,vdecls) -> typ, rename_vars f_node f_var vdecls) ee.eexpr_quantifiers;
746
     eexpr_normalized = Utils.option_map 
747
       (fun (vdecl, eqs, vdecls) ->
748
	 rename_var f_node f_var vdecl,
749
	 List.map (rename_eq f_node f_var) eqs,
750
	 rename_vars f_node f_var vdecls
751
       ) ee.eexpr_normalized;
752
     
753
   }
754
 
755
     
756
     
757
   
758
 let rename_node f_node f_var nd =
759
   let rename_var = rename_var f_node f_var in
760
   let rename_expr = rename_expr f_node f_var in
761
   let rename_stmts = rename_stmts f_node f_var in
762
   let inputs = List.map rename_var nd.node_inputs in
763
   let outputs = List.map rename_var nd.node_outputs in
764
   let locals = List.map rename_var nd.node_locals in
765
   let gen_calls = List.map rename_expr nd.node_gencalls in
766
   let node_checks = List.map (Dimension.rename f_node f_var)  nd.node_checks in
767
   let node_asserts = List.map 
768
     (fun a -> 
769
       {a with assert_expr = 
770
	   let expr = a.assert_expr in
771
	   rename_expr expr})
772
     nd.node_asserts
773
   in
774
   let node_stmts = rename_stmts nd.node_stmts
775

  
776
     
777
   in
778
   let spec = 
779
     Utils.option_map 
780
       (fun s -> assert false; (*rename_node_annot f_node f_var s*) ) (* TODO: implement! *) 
781
       nd.node_spec 
782
   in
783
   let annot = rename_annots f_node f_var nd.node_annot in
784
   {
785
     node_id = f_node nd.node_id;
786
     node_type = nd.node_type;
787
     node_clock = nd.node_clock;
788
     node_inputs = inputs;
789
     node_outputs = outputs;
790
     node_locals = locals;
791
     node_gencalls = gen_calls;
792
     node_checks = node_checks;
793
     node_asserts = node_asserts;
794
     node_stmts = node_stmts;
795
     node_dec_stateless = nd.node_dec_stateless;
796
     node_stateless = nd.node_stateless;
797
     node_spec = spec;
798
     node_annot = annot;
799
   }
768 800

  
769 801

  
770 802
let rename_const f_const c =
......
780 812
    List.fold_left (fun accu top ->
781 813
      (match top.top_decl_desc with
782 814
      | Node nd -> 
783
	 { top with top_decl_desc = Node (rename_node f_node f_var f_const nd) }
815
	 { top with top_decl_desc = Node (rename_node f_node f_var nd) }
784 816
      | Const c -> 
785 817
	 { top with top_decl_desc = Const (rename_const f_const c) }
786 818
      | TypeDef tdef ->
......
791 823
) [] prog
792 824
		   )
793 825

  
826
(* Applies the renaming function [fvar] to every rhs
827
   only when the corresponding lhs satisfies predicate [pvar] *)
828
 let eq_replace_rhs_var pvar fvar eq =
829
   let pvar l = List.exists pvar l in
830
   let rec replace lhs rhs =
831
     { rhs with expr_desc =
832
     match lhs with
833
     | []  -> assert false
834
     | [_] -> if pvar lhs then rename_expr_desc (fun x -> x) fvar rhs.expr_desc else rhs.expr_desc
835
     | _   ->
836
       (match rhs.expr_desc with
837
       | Expr_tuple tl ->
838
	 Expr_tuple (List.map2 (fun v e -> replace [v] e) lhs tl)
839
       | Expr_appl (f, arg, None) when Basic_library.is_expr_internal_fun rhs ->
840
	 let args = expr_list_of_expr arg in
841
	 Expr_appl (f, expr_of_expr_list arg.expr_loc (List.map (replace lhs) args), None)
842
       | Expr_array _
843
       | Expr_access _
844
       | Expr_power _
845
       | Expr_const _
846
       | Expr_ident _
847
       | Expr_appl _   ->
848
	 if pvar lhs
849
	 then rename_expr_desc (fun x -> x) fvar rhs.expr_desc
850
	 else rhs.expr_desc
851
       | Expr_ite (c, t, e)   -> Expr_ite (replace lhs c, replace lhs t, replace lhs e)
852
       | Expr_arrow (e1, e2)  -> Expr_arrow (replace lhs e1, replace lhs e2) 
853
       | Expr_fby (e1, e2)    -> Expr_fby (replace lhs e1, replace lhs e2)
854
       | Expr_pre e'          -> Expr_pre (replace lhs e')
855
       | Expr_when (e', i, l) -> let i' = if pvar lhs then fvar i else i
856
				 in Expr_when (replace lhs e', i', l)
857
       | Expr_merge (i, hl)   -> let i' = if pvar lhs then fvar i else i
858
				 in Expr_merge (i', List.map (fun (t, h) -> (t, replace lhs h)) hl)
859
       )
860
     }
861
   in { eq with eq_rhs = replace eq.eq_lhs eq.eq_rhs }
862

  
863
    
794 864
(**********************************************************************)
795 865
(* Pretty printers *)
796 866

  
......
964 1034

  
965 1035
and get_eq_calls nodes eq =
966 1036
  get_expr_calls nodes eq.eq_rhs
1037
and get_aut_handler_calls nodes h =
1038
  List.fold_left (fun accu stmt -> match stmt with
1039
  | Eq eq -> Utils.ISet.union (get_eq_calls nodes eq) accu
1040
  | Aut aut' ->  Utils.ISet.union (get_aut_calls nodes aut') accu
1041
  ) Utils.ISet.empty h.hand_stmts 
1042
and get_aut_calls nodes aut =
1043
  List.fold_left (fun accu h -> Utils.ISet.union (get_aut_handler_calls nodes h) accu)
1044
    Utils.ISet.empty aut.aut_handlers
967 1045
and get_node_calls nodes node =
968
  List.fold_left (fun accu eq -> Utils.ISet.union (get_eq_calls nodes eq) accu) Utils.ISet.empty (get_node_eqs node)
1046
  let eqs, auts = get_node_eqs node in
1047
  let aut_calls =
1048
    List.fold_left
1049
      (fun accu aut -> Utils.ISet.union (get_aut_calls nodes aut) accu)
1050
      Utils.ISet.empty auts
1051
  in
1052
  List.fold_left
1053
    (fun accu eq -> Utils.ISet.union (get_eq_calls nodes eq) accu)
1054
    aut_calls eqs
969 1055

  
970 1056
let get_expr_vars e =
971 1057
  let rec get_expr_vars vars e =
......
1010 1096

  
1011 1097
and eq_has_arrows eq =
1012 1098
  expr_has_arrows eq.eq_rhs
1099
and aut_has_arrows aut = List.exists (fun h -> List.exists (fun stmt -> match stmt with Eq eq -> eq_has_arrows eq | Aut aut' -> aut_has_arrows aut') h.hand_stmts ) aut.aut_handlers 
1013 1100
and node_has_arrows node =
1014
  List.exists (fun eq -> eq_has_arrows eq) (get_node_eqs node)
1101
  let eqs, auts = get_node_eqs node in
1102
  List.exists (fun eq -> eq_has_arrows eq) eqs || List.exists (fun aut -> aut_has_arrows aut) auts
1103

  
1015 1104

  
1016 1105

  
1017 1106
let copy_var_decl vdecl =
src/corelang.mli
75 75

  
76 76
val get_node_vars: node_desc -> var_decl list
77 77
val get_node_var: ident -> node_desc -> var_decl
78
val get_node_eqs: node_desc -> eq list
78
val get_node_eqs: node_desc -> eq list * automata_desc list
79 79
val get_node_eq: ident -> node_desc -> eq
80 80
val get_node_interface: node_desc -> imported_node_desc
81 81

  
......
124 124
val rename_carrier: (ident -> ident) -> clock_dec_desc -> clock_dec_desc
125 125

  
126 126
val get_expr_vars: expr -> Utils.ISet.t
127
val expr_replace_var: (ident -> ident) -> expr -> expr
127
(*val expr_replace_var: (ident -> ident) -> expr -> expr*)
128

  
128 129
val eq_replace_rhs_var: (ident -> bool) -> (ident -> ident) -> eq -> eq
129 130

  
130
(** rename_prog f_node f_var f_const prog *)
131
(** val rename_expr f_node f_var expr *)
132
val rename_expr : (ident -> ident) -> (ident -> ident) -> expr -> expr
133
(** val rename_eq f_node f_var eq *)
134
val rename_eq : (ident -> ident) -> (ident -> ident) -> eq -> eq
135
(** val rename_aut f_node f_var aut *)
136
val rename_aut : (ident -> ident) -> (ident -> ident) -> automata_desc -> automata_desc
137
(** rename_prog f_node f_var prog *)
131 138
val rename_prog: (ident -> ident) -> (ident -> ident) -> (ident -> ident) -> program -> program
132 139

  
133 140
val substitute_expr: var_decl list -> eq list -> expr -> expr
src/dimension.ml
338 338
      | _ -> raise (Unify (dim1, dim2))
339 339
  in unif dim1 dim2
340 340

  
341
let rec expr_replace_var fvar e = 
342
 { e with dim_desc = expr_replace_var_desc fvar e.dim_desc }
343
and expr_replace_var_desc fvar e =
344
  let re = expr_replace_var fvar in
341
let rec rename fnode fvar e = 
342
 { e with dim_desc = expr_replace_var_desc fnode fvar e.dim_desc }
343
and expr_replace_var_desc fnode fvar e =
344
  let re = rename fnode fvar in
345 345
  match e with
346 346
  | Dvar
347 347
  | Dunivar
348 348
  | Dbool _
349 349
  | Dint _ -> e
350 350
  | Dident v -> Dident (fvar v)
351
  | Dappl (id, el) -> Dappl (id, List.map re el)
351
  | Dappl (id, el) -> Dappl (fnode id, List.map re el)
352 352
  | Dite (g,t,e) -> Dite (re g, re t, re e)
353 353
  | Dlink e -> Dlink (re e)
354 354

  
src/inliner.ml
32 32
   ignore (Corelang.get_node_var v node); true
33 33
 with Not_found -> false
34 34

  
35
let rename_expr rename expr = expr_replace_var rename expr
36

  
35
(* let rename_expr rename expr = expr_replace_var rename expr *)
36
(*
37 37
let rename_eq rename eq = 
38 38
  { eq with
39 39
    eq_lhs = List.map rename eq.eq_lhs; 
40 40
    eq_rhs = rename_expr rename eq.eq_rhs
41 41
  }
42

  
42
*)
43
   
43 44
let rec add_expr_reset_cond cond expr =
44 45
  let aux = add_expr_reset_cond cond in
45 46
  let new_desc = 
......
113 114
    if v = tag_true || v = tag_false || not (is_node_var node v) then v else
114 115
      Corelang.mk_new_node_name caller (Format.sprintf "%s_%i_%s" node.node_id uid v)
115 116
  in
116
  let eqs' = List.map (rename_eq rename) (get_node_eqs node) in
117
  let eqs, auts = get_node_eqs node in
118
  let eqs' = List.map (rename_eq (fun x -> x) rename) eqs in
119
  let auts' = List.map (rename_aut (fun x -> x) rename) auts in
117 120
  let input_arg_list = List.combine node.node_inputs (Corelang.expr_list_of_expr args) in
118 121
  let static_inputs, dynamic_inputs = List.partition (fun (vdecl, arg) -> vdecl.var_dec_const) input_arg_list in
119 122
  let static_inputs = List.map (fun (vdecl, arg) -> vdecl, Corelang.dimension_of_expr arg) static_inputs in
......
134 137
	 { v.var_dec_type  with ty_dec_desc = Corelang.rename_static rename_static v.var_dec_type.ty_dec_desc },
135 138
	 { v.var_dec_clock with ck_dec_desc = Corelang.rename_carrier rename_carrier v.var_dec_clock.ck_dec_desc },
136 139
	 v.var_dec_const,
137
	 Utils.option_map (rename_expr rename) v.var_dec_value) in
140
	 Utils.option_map (rename_expr (fun x -> x) rename) v.var_dec_value) in
138 141
    begin
139 142
      (*
140 143
	(try
......
162 165
  assert (node.node_gencalls = []);
163 166

  
164 167
  (* Expressing reset locally in equations *)
165
  let eqs_r' =
168
  let eqs_r' = 
169
    let all_eqs = (List.map (fun eq -> Eq eq) eqs') @ (List.map (fun aut -> Aut aut) auts') in
166 170
    match reset with
167
      None -> eqs'
168
    | Some cond -> List.map (add_eq_reset_cond cond) eqs'
171
      None -> all_eqs
172
    | Some cond -> (
173
      assert (auts' = []); (* TODO: we do not handle properly automaton in case of reset call *)
174
      List.map (fun eq -> Eq (add_eq_reset_cond cond eq)) eqs'
175
    )
169 176
  in
170
  let assign_inputs = mkeq loc (List.map (fun v -> v.var_id) inputs',
171
                                expr_of_expr_list args.expr_loc (List.map snd dynamic_inputs)) in
177
  let assign_inputs = Eq (mkeq loc (List.map (fun v -> v.var_id) inputs',
178
                                expr_of_expr_list args.expr_loc (List.map snd dynamic_inputs))) in
172 179
  let expr = expr_of_expr_list loc (List.map expr_of_vdecl outputs')
173 180
  in
174 181
  let asserts' = (* We rename variables in assert expressions *)
......
176 183
      (fun a -> 
177 184
	{a with assert_expr = 
178 185
	    let expr = a.assert_expr in
179
	    rename_expr rename expr
186
	    rename_expr (fun x -> x) rename expr
180 187
	})
181 188
      node.node_asserts 
182 189
  in
......
224 231
  
225 232
  match expr.expr_desc with
226 233
  | Expr_appl (id, args, reset) ->
227
    let args', locals', eqs', asserts', annots' = inline_expr args locals node nodes in 
228
    if List.exists (check_node_name id) nodes && (* the current node call is provided
229
						    as arguments nodes *)
230
      (not selection_on_annotation || is_inline_expr expr) (* and if selection on annotation is activated, 
231
							      it is explicitely inlined here *)
232
    then (
233
      (* Format.eprintf "Inlining call to %s in expression %a@." id Printers.pp_expr expr; *)
234
      (* The node should be inlined *)
235
      (* let _ =     Format.eprintf "Inlining call to %s@." id in *)
236
      let called = try List.find (check_node_name id) nodes 
237
	with Not_found -> (assert false) in
238
      let called = node_of_top called in
239
      let called' = inline_node called nodes in
240
      let expr, locals', eqs'', asserts'', annots'' = 
241
	inline_call called' expr.expr_loc expr.expr_tag args' reset locals' node in
242
      expr, locals', eqs'@eqs'', asserts'@asserts'', annots'@annots''
243
    )
244
    else 
245
      (* let _ =     Format.eprintf "Not inlining call to %s@." id in *)
246
      { expr with expr_desc = Expr_appl(id, args', reset)}, 
247
      locals', 
248
      eqs', 
249
      asserts',
250
      annots'
234
     let args', locals', eqs', asserts', annots' = inline_expr args locals node nodes in 
235
     if List.exists (check_node_name id) nodes && (* the current node call is provided
236
						     as arguments nodes *)
237
       (not selection_on_annotation || is_inline_expr expr) (* and if selection on annotation is activated, 
238
							       it is explicitely inlined here *)
239
     then (
240
       (* Format.eprintf "Inlining call to %s in expression %a@." id Printers.pp_expr expr; *)
241
       (* The node should be inlined *)
242
       (* let _ =     Format.eprintf "Inlining call to %s@." id in *)
243
       let called = try List.find (check_node_name id) nodes 
244
	 with Not_found -> (assert false) in
245
       let called = node_of_top called in
246
       let called' = inline_node called nodes in
247
       let expr, locals', eqs'', asserts'', annots'' = 
248
	 inline_call called' expr.expr_loc expr.expr_tag args' reset locals' node in
249
       expr, locals', eqs'@eqs'', asserts'@asserts'', annots'@annots''
250
     )
251
     else 
252
       (* let _ =     Format.eprintf "Not inlining call to %s@." id in *)
253
       { expr with expr_desc = Expr_appl(id, args', reset)}, 
254
       locals', 
255
       eqs', 
256
       asserts',
257
       annots'
251 258

  
252 259
  (* For other cases, we just keep the structure, but convert sub-expressions *)
253 260
  | Expr_const _ 
254 261
  | Expr_ident _ -> expr, locals, [], [], []
255 262
  | Expr_tuple el -> 
256
    let el', l', eqs', asserts', annots' = inline_tuple el in
257
    { expr with expr_desc = Expr_tuple el' }, l', eqs', asserts', annots'
263
     let el', l', eqs', asserts', annots' = inline_tuple el in
264
     { expr with expr_desc = Expr_tuple el' }, l', eqs', asserts', annots'
258 265
  | Expr_ite (g, t, e) ->
259
    let g', t', e', l', eqs', asserts', annots' = inline_triple g t e in
260
    { expr with expr_desc = Expr_ite (g', t', e') }, l', eqs', asserts', annots'
266
     let g', t', e', l', eqs', asserts', annots' = inline_triple g t e in
267
     { expr with expr_desc = Expr_ite (g', t', e') }, l', eqs', asserts', annots'
261 268
  | Expr_arrow (e1, e2) ->
262
    let e1', e2', l', eqs', asserts', annots' = inline_pair e1 e2 in
263
    { expr with expr_desc = Expr_arrow (e1', e2') } , l', eqs', asserts', annots'
269
     let e1', e2', l', eqs', asserts', annots' = inline_pair e1 e2 in
270
     { expr with expr_desc = Expr_arrow (e1', e2') } , l', eqs', asserts', annots'
264 271
  | Expr_fby (e1, e2) ->
265
    let e1', e2', l', eqs', asserts', annots' = inline_pair e1 e2 in
266
    { expr with expr_desc = Expr_fby (e1', e2') }, l', eqs', asserts', annots'
272
     let e1', e2', l', eqs', asserts', annots' = inline_pair e1 e2 in
273
     { expr with expr_desc = Expr_fby (e1', e2') }, l', eqs', asserts', annots'
267 274
  | Expr_array el ->
268
    let el', l', eqs', asserts', annots' = inline_tuple el in
269
    { expr with expr_desc = Expr_array el' }, l', eqs', asserts', annots'
275
     let el', l', eqs', asserts', annots' = inline_tuple el in
276
     { expr with expr_desc = Expr_array el' }, l', eqs', asserts', annots'
270 277
  | Expr_access (e, dim) ->
271
    let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
272
    { expr with expr_desc = Expr_access (e', dim) }, l', eqs', asserts', annots'
278
     let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
279
     { expr with expr_desc = Expr_access (e', dim) }, l', eqs', asserts', annots'
273 280
  | Expr_power (e, dim) ->
274
    let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
275
    { expr with expr_desc = Expr_power (e', dim) }, l', eqs', asserts', annots'
281
     let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
282
     { expr with expr_desc = Expr_power (e', dim) }, l', eqs', asserts', annots'
276 283
  | Expr_pre e ->
277
    let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
278
    { expr with expr_desc = Expr_pre e' }, l', eqs', asserts', annots'
284
     let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
285
     { expr with expr_desc = Expr_pre e' }, l', eqs', asserts', annots'
279 286
  | Expr_when (e, id, label) ->
280
    let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
281
    { expr with expr_desc = Expr_when (e', id, label) }, l', eqs', asserts', annots'
287
     let e', l', eqs', asserts', annots' = inline_expr e locals node nodes in 
288
     { expr with expr_desc = Expr_when (e', id, label) }, l', eqs', asserts', annots'
282 289
  | Expr_merge (id, branches) ->
283
    let el, l', eqs', asserts', annots' = inline_tuple (List.map snd branches) in
284
    let branches' = List.map2 (fun (label, _) v -> label, v) branches el in
285
    { expr with expr_desc = Expr_merge (id, branches') }, l', eqs', asserts', annots'
290
     let el, l', eqs', asserts', annots' = inline_tuple (List.map snd branches) in
291
     let branches' = List.map2 (fun (label, _) v -> label, v) branches el in
292
     { expr with expr_desc = Expr_merge (id, branches') }, l', eqs', asserts', annots'
286 293

  
287 294
and inline_node ?(selection_on_annotation=false) node nodes =
288 295
  try copy_node (Hashtbl.find inline_table node.node_id)
289 296
  with Not_found ->
290
  let inline_expr = inline_expr ~selection_on_annotation:selection_on_annotation in
291
  let new_locals, eqs, asserts, annots = 
292
    List.fold_left (fun (locals, eqs, asserts, annots) eq ->
293
      let eq_rhs', locals', new_eqs', asserts', annots' = 
294
	inline_expr eq.eq_rhs locals node nodes 
295
      in
296
      locals', { eq with eq_rhs = eq_rhs' }::new_eqs'@eqs, asserts'@asserts, annots'@annots
297
    ) (node.node_locals, [], node.node_asserts, node.node_annot) (get_node_eqs node)
298
  in
299
  let inlined = 
300
  { node with
301
    node_locals = new_locals;
302
    node_stmts = List.map (fun eq -> Eq eq) eqs;
303
    node_asserts = asserts;
304
    node_annot = annots;
305
  }
306
  in
307
  begin
308
    (*Format.eprintf "inline node:<< %a@.>>@." Printers.pp_node inlined;*)
309
    Hashtbl.add inline_table node.node_id inlined;
310
    inlined
311
  end
297
    let inline_expr = inline_expr ~selection_on_annotation:selection_on_annotation in
298
    let eqs, auts = get_node_eqs node in
299
    assert (auts = []); (* No inlining of automaton yet. One should visit each
300
			   handler eqs and perform similar computation *)
301
    let new_locals, stmts, asserts, annots = 
302
      List.fold_left (fun (locals, stmts, asserts, annots) eq ->
303
	let eq_rhs', locals', new_stmts', asserts', annots' = 
304
	  inline_expr eq.eq_rhs locals node nodes 
305
	in
306
	locals', Eq { eq with eq_rhs = eq_rhs' }::new_stmts'@stmts, asserts'@asserts, annots'@annots
307
      ) (node.node_locals, [], node.node_asserts, node.node_annot) eqs
308
    in
309
    let inlined = 
310
      { node with
311
	node_locals = new_locals;
312
	node_stmts = stmts;
313
	node_asserts = asserts;
314
	node_annot = annots;
315
      }
316
    in
317
    begin
318
      (*Format.eprintf "inline node:<< %a@.>>@." Printers.pp_node inlined;*)
319
      Hashtbl.add inline_table node.node_id inlined;
320
      inlined
321
    end
312 322

  
313 323
let inline_all_calls node nodes =
314 324
  let nd = match node.top_decl_desc with Node nd -> nd | _ -> assert false in
......
333 343
  let inlined_rename = rename_local_node inlined "inlined_" in
334 344
  let identity = (fun x -> x) in
335 345
  let is_node top = match top.top_decl_desc with Node _ -> true | _ -> false in
336
  let orig = rename_prog orig_rename identity identity orig in
346
  let orig = rename_prog orig_rename (* f_node *) identity (* f_var *) identity (* f_const *) orig in
337 347
  let inlined = rename_prog inlined_rename identity identity inlined in
338 348
  let nodes_origs, others = List.partition is_node orig in
339 349
  let nodes_inlined, _ = List.partition is_node inlined in
src/machine_code.ml
555 555
  (* Format.eprintf "%s schedule: %a@." *)
556 556
  (* 		 nd.node_id *)
557 557
  (* 		 (Utils.fprintf_list ~sep:" ; " Scheduling.pp_eq_schedule) sch; *)
558
  let split_eqs = Splitting.tuple_split_eq_list (get_node_eqs nd) in
558
  let eqs, auts = get_node_eqs nd in
559
  assert (auts = []); (* Automata should be expanded by now *)
560
  let split_eqs = Splitting.tuple_split_eq_list eqs in
559 561
  let eqs_rev, remainder =
560 562
    List.fold_left
561 563
      (fun (accu, node_eqs_remainder) vl ->
......
571 573
  in
572 574
  begin
573 575
    if List.length remainder > 0 then (
576
      let eqs, auts = get_node_eqs nd in
577
      assert (auts = []); (* Automata should be expanded by now *)
574 578
      Format.eprintf "Equations not used are@.%a@.Full equation set is:@.%a@.@?"
575 579
		     Printers.pp_node_eqs remainder
576
      		     Printers.pp_node_eqs (get_node_eqs nd);
580
      		     Printers.pp_node_eqs eqs;
577 581
      assert false);
578 582
    List.rev eqs_rev
579 583
  end
src/mpfr.ml
221 221
  let is_local v =
222 222
    List.for_all ((!=) v) inputs_outputs in
223 223
  let orig_vars = inputs_outputs@node.node_locals in
224
  let defs, vars = 
225
    List.fold_left (inject_eq node) ([], orig_vars) (get_node_eqs node) in
224
  let defs, vars =
225
    let eqs, auts = get_node_eqs node in
226
    if auts != [] then assert false; (* Automata should be expanded by now. *)
227
    List.fold_left (inject_eq node) ([], orig_vars) eqs in
226 228
  (* Normalize the asserts *)
227 229
  let vars, assert_defs, asserts = 
228 230
    List.fold_left (
src/mutation.ml
103 103

  
104 104
let compute_records_eq eq = compute_records_expr eq.eq_rhs
105 105

  
106
let compute_records_node nd = 
107
  merge_records (List.map compute_records_eq (get_node_eqs nd))
106
let compute_records_node nd =
107
  let eqs, auts = get_node_eqs nd in
108
  assert (auts=[]); (* Automaton should be expanded by now *)
109
  merge_records (List.map compute_records_eq eqs)
108 110

  
109 111
let compute_records_top_decl td =
110 112
  match td.top_decl_desc with
src/normalization.ml
399 399
    List.for_all ((!=) v) inputs_outputs in
400 400
  let orig_vars = inputs_outputs@node.node_locals in
401 401
  let defs, vars =
402
    List.fold_left (normalize_eq node) ([], orig_vars) (get_node_eqs node) in
402
    let eqs, auts = get_node_eqs node in
403
    if auts != [] then assert false; (* Automata should be expanded by now. *)
404
    List.fold_left (normalize_eq node) ([], orig_vars) eqs in
403 405
  (* Normalize the asserts *)
404 406
  let vars, assert_defs, asserts =
405 407
    List.fold_left (
src/printers.ml
332 332
  | TypeDef tdef -> fprintf fmt "%a@ " pp_typedef tdef
333 333

  
334 334
let pp_prog fmt prog =
335
  (* we first print types *)
335
  (* we first print types: the function SortProg.sort could do the job but ut
336
     introduces a cyclic dependance *)
336 337
  let type_decl, others =
337 338
    List.partition (fun decl -> match decl.top_decl_desc with TypeDef _ -> true | _ -> false) prog
338 339
  in
src/stateless.ml
36 36
  | Expr_appl (i, e', i') ->
37 37
    check_expr e' &&
38 38
      (Basic_library.is_stateless_fun i || check_node (node_from_name i))
39
and compute_node nd =
40
 List.for_all (fun eq -> check_expr eq.eq_rhs) (get_node_eqs nd)
39
and compute_node nd = (* returns true iff the node is stateless.*)
40
  let eqs, aut = get_node_eqs nd in
41
  aut = [] && (* A node containinig an automaton will be stateful *)
42
      List.for_all (fun eq -> check_expr eq.eq_rhs) eqs
41 43
and check_node td =
42 44
  match td.top_decl_desc with 
43 45
  | Node nd         -> (
src/types.ml
355 355
let mktyptuple nb typ =
356 356
  let array = Array.make nb typ in
357 357
  Ttuple (Array.to_list array)
358
    
358 359

  
359 360

  
360 361
(* Local Variables: *)
src/typing.ml
562 562
 | Tydec_clock ty
563 563
 | Tydec_array (_, ty) -> check_type_declaration loc ty
564 564
 | Tydec_const tname   ->
565
    Format.printf "TABLE: %a@." print_type_table ();
566
   (* TODO REMOVE *)
565 567
   if not (Hashtbl.mem type_table cty)
566 568
   then raise (Error (loc, Unbound_type tname));
567 569
 | _                   -> ()
......
622 624
      (fun uvs v -> ISet.add v.var_id uvs)
623 625
      ISet.empty vd_env_ol in
624 626
  let undefined_vars =
625
    List.fold_left (type_eq (new_env, vd_env) is_main) undefined_vars_init (get_node_eqs nd)
627
    let eqs, auts = get_node_eqs nd in
628
    (* TODO XXX: il faut typer les handlers de l'automate *)
629
    List.fold_left (type_eq (new_env, vd_env) is_main) undefined_vars_init eqs
626 630
  in
627 631
  (* Typing asserts *)
628 632
  List.iter (fun assert_ ->

Also available in: Unified diff