From e7cc51860b11daad1cc545754434b4f17b4f9539 Mon Sep 17 00:00:00 2001
From: ploc <ploc@garoche.net>
Date: Mon, 17 Jul 2017 15:03:08 -0700
Subject: [PATCH] Refactor error printing.

---
 src/backends/C/c_backend.ml      |  8 ++--
 src/backends/C/c_backend_main.ml |  4 +-
 src/causality.ml                 | 64 +++++++++++++++++++-------------
 src/compiler_common.ml           | 18 ++++-----
 src/corelang.ml                  | 50 ++++++++++++-------------
 src/corelang.mli                 |  8 ++--
 src/lusic.ml                     |  2 +-
 src/lustreSpec.ml                |  9 -----
 src/main_lustre_compiler.ml      | 16 +++++---
 src/modules.ml                   | 30 +++++++--------
 src/options.ml                   |  6 +--
 src/scheduling.ml                | 38 ++++++++-----------
 12 files changed, 127 insertions(+), 126 deletions(-)

diff --git a/src/backends/C/c_backend.ml b/src/backends/C/c_backend.ml
index 3a9f1e91..b8c3664c 100644
--- a/src/backends/C/c_backend.ml
+++ b/src/backends/C/c_backend.ml
@@ -51,8 +51,8 @@ let gen_files funs basename prog machines dependencies =
     match Machine_code.get_machine_opt main_node machines with
     | None -> begin
       Global.main_node := main_node;
-      Format.eprintf "Code generation error: %a@." Corelang.pp_error LustreSpec.Main_not_found;
-      raise (Corelang.Error (Location.dummy_loc, LustreSpec.Main_not_found))
+      Format.eprintf "Code generation error: %a@." Error.pp_error_msg Error.Main_not_found;
+      raise (Corelang.Error (Location.dummy_loc, Error.Main_not_found))
     end
     | Some m -> begin
       let source_main_file = (if !Options.cpp then destname ^ "_main.cpp" else destname ^ "_main.c") in (* Could be changed *)
@@ -73,8 +73,8 @@ let gen_files funs basename prog machines dependencies =
     match Machine_code.get_machine_opt mauve machines with
     | None -> begin
       Global.main_node := mauve;
-      Format.eprintf "Code generation error: %a@." Corelang.pp_error LustreSpec.Main_not_found;
-      raise (Corelang.Error (Location.dummy_loc, LustreSpec.Main_not_found))
+      Format.eprintf "Code generation error: %a@." Error.pp_error_msg Error.Main_not_found;
+      raise (Corelang.Error (Location.dummy_loc, Error.Main_not_found))
     end
     | Some m -> begin
       let source_mauve_file = destname ^ "_mauve.hpp" in
diff --git a/src/backends/C/c_backend_main.ml b/src/backends/C/c_backend_main.ml
index 426cb24d..d6521734 100644
--- a/src/backends/C/c_backend_main.ml
+++ b/src/backends/C/c_backend_main.ml
@@ -42,9 +42,9 @@ let print_get_inputs fmt m =
       begin
 	Global.main_node := !Options.main_node;
 	Format.eprintf "Code generation error: %a%a@."
-	  pp_error Main_wrong_kind
+	  Error.pp_error_msg Error.Main_wrong_kind
 	  Location.pp_loc v'.var_loc;
-	raise (Error (v'.var_loc, Main_wrong_kind))
+	raise (Error (v'.var_loc, Error.Main_wrong_kind))
       end
   in
   List.iteri2 (fun idx v' v ->
diff --git a/src/causality.ml b/src/causality.ml
index ac28345b..447b464e 100644
--- a/src/causality.ml
+++ b/src/causality.ml
@@ -18,10 +18,11 @@ open Utils
 open LustreSpec
 open Corelang
 open Graph
-open Format
 
+
+type identified_call = eq * tag
 type error =
-  | DataCycle of ident list
+  | DataCycle of ident list list (* multiple failed partitions at once *) 
   | NodeCycle of ident list
 
 exception Error of error
@@ -97,14 +98,14 @@ module ExprDep = struct
    but used to compute useless inputs/mems.
    a mem read var represents a mem at the beginning of a cycle  *)
   let mk_read_var id =
-    sprintf "#%s" id
+    Format.sprintf "#%s" id
 
 (* instance vars represent node instance calls,
    they are not part of the program/schedule,
    but used to simplify causality analysis
 *)
   let mk_instance_var id =
-    incr instance_var_cpt; sprintf "!%s_%d" id !instance_var_cpt
+    incr instance_var_cpt; Format.sprintf "!%s_%d" id !instance_var_cpt
 
   let is_read_var v = v.[0] = '#'
 
@@ -215,7 +216,7 @@ module ExprDep = struct
     (* Add mashup dependencies for a user-defined node instance [lhs] = [f]([e]) *)
     (* i.e every input is connected to every output, through a ghost var *)
       let mashup_appl_dependencies f e g =
-	let f_var = mk_instance_var (sprintf "%s_%d" f eq.eq_loc.Location.loc_start.Lexing.pos_lnum) in
+	let f_var = mk_instance_var (Format.sprintf "%s_%d" f eq.eq_loc.Location.loc_start.Lexing.pos_lnum) in
 	List.fold_right (fun rhs -> add_dep lhs_is_mem (adjust_tuple f_var rhs) rhs)
 	  (expr_list_of_expr e) (add_var lhs_is_mem lhs f_var g) 
       in
@@ -384,6 +385,7 @@ module NodeDep = struct
 
 end
 
+
 module CycleDetection = struct
 
   (* ---- Look for cycles in a dependency graph *)
@@ -420,11 +422,12 @@ module CycleDetection = struct
      [Cycle partition] if the succession of dependencies [partition] forms a cycle *)
   let check_cycles g =
     let scc_l = Cycles.scc_list g in
-    List.iter (fun partition ->
-      if wrong_partition g partition then
-	raise (Error (DataCycle partition))
-      else ()
-    ) scc_l
+    let algebraic_loops = List.filter (wrong_partition g) scc_l in
+    if List.length algebraic_loops > 0 then
+      raise (Error (DataCycle algebraic_loops))
+	(* We extract a hint to resolve the cycle: for each variable in the cycle
+	   which is defined by a call, we return the name of the node call and
+	   its specific id *)
 
   (* Creates the sub-graph of [g] restricted to vertices and edges in partition *)
   let copy_partition g partition =
@@ -562,6 +565,7 @@ struct
     end
 end
 
+  
 let pp_dep_graph fmt g =
   begin
     Format.fprintf fmt "{ /* graph */@.";
@@ -571,13 +575,19 @@ let pp_dep_graph fmt g =
 
 let pp_error fmt err =
   match err with
-  | DataCycle trace ->
-     fprintf fmt "@.Causality error, cyclic data dependencies: %a@."
-       (fprintf_list ~sep:", " pp_print_string) trace
   | NodeCycle trace ->
-     fprintf fmt "@.Causality error, cyclic node calls: %a@."
-       (fprintf_list ~sep:", " pp_print_string) trace
-
+     Format.fprintf fmt "Causality error, cyclic node calls:@   @[<v 0>%a@]@ "
+       (fprintf_list ~sep:",@ " Format.pp_print_string) trace
+  | DataCycle traces -> (
+     Format.fprintf fmt "Causality error, cyclic data dependencies:@   @[<v 0>%a@]@ "
+       (fprintf_list ~sep:";@ "
+       (fun fmt trace ->
+	 Format.fprintf fmt "@[<v 0>{%a}@]"
+	   (fprintf_list ~sep:",@ " Format.pp_print_string)
+	   trace
+       )) traces
+  )
+     
 (* Merges elements of graph [g2] into graph [g1] *)
 let merge_with g1 g2 =
   begin
@@ -605,15 +615,19 @@ let global_dependency node =
   let (g_non_mems, g_mems) = ExprDep.dependence_graph mems inputs node_vars node in
   (*Format.eprintf "g_non_mems: %a" pp_dep_graph g_non_mems;
     Format.eprintf "g_mems: %a" pp_dep_graph g_mems;*)
-  CycleDetection.check_cycles g_non_mems;
-  let (vdecls', eqs', g_mems') = CycleDetection.break_cycles node mems g_mems in
-  (*Format.eprintf "g_mems': %a" pp_dep_graph g_mems';*)
-  begin
-    merge_with g_non_mems g_mems';
-    add_external_dependency outputs mems g_non_mems;
-    { node with node_stmts = List.map (fun eq -> Eq eq) eqs'; node_locals = vdecls'@node.node_locals }, 
-    g_non_mems
-  end
+  try
+    CycleDetection.check_cycles g_non_mems;
+    let (vdecls', eqs', g_mems') = CycleDetection.break_cycles node mems g_mems in
+    (*Format.eprintf "g_mems': %a" pp_dep_graph g_mems';*)
+    begin
+      merge_with g_non_mems g_mems';
+      add_external_dependency outputs mems g_non_mems;
+      { node with node_stmts = List.map (fun eq -> Eq eq) eqs'; node_locals = vdecls'@node.node_locals }, 
+      g_non_mems
+    end
+  with Error (DataCycle _ as exc) -> (
+      raise (Error (exc))
+  )
 
 (* Local Variables: *)
 (* compile-command:"make -C .." *)
diff --git a/src/compiler_common.ml b/src/compiler_common.ml
index 8dbf81c3..4eeb238c 100644
--- a/src/compiler_common.ml
+++ b/src/compiler_common.ml
@@ -17,8 +17,8 @@ open Corelang
 let check_main () =
   if !Options.main_node = "" then
     begin
-      eprintf "Code generation error: %a@." pp_error No_main_specified;
-      raise (Error (Location.dummy_loc, No_main_specified))
+      eprintf "Code generation error: %a@." Error.pp_error_msg Error.No_main_specified;
+      raise (Error (Location.dummy_loc, Error.No_main_specified))
     end
 
 let create_dest_dir () =
@@ -55,7 +55,7 @@ let parse_header own filename =
       raise exc
     | Corelang.Error (loc, err) as exc -> (
       eprintf "Parsing error: %a%a@."
-	Corelang.pp_error err
+	Error.pp_error_msg err
 	Location.pp_loc loc;
       raise exc
     )
@@ -81,7 +81,7 @@ let parse_source source_name =
     raise exc
   | Corelang.Error (loc, err) as exc ->
     eprintf "Parsing error: %a%a@."
-      Corelang.pp_error err
+      Error.pp_error_msg err
       Location.pp_loc loc;
     raise exc
 
@@ -91,7 +91,7 @@ let expand_automata decls =
     Automata.expand_decls decls
   with (Corelang.Error (loc, err)) as exc ->
     eprintf "Automata error: %a%a@."
-      Corelang.pp_error err
+      Error.pp_error_msg err
       Location.pp_loc loc;
     raise exc
 
@@ -128,7 +128,7 @@ let type_decls env decls =
 	raise exc
     end 
   in
-  if !Options.print_types then
+  if !Options.print_types || !Options.verbose_level > 2 then
     Log.report ~level:1 (fun fmt -> fprintf fmt "@[<v 2>  %a@]@ " Corelang.pp_prog_type decls);
   new_env
       
@@ -143,7 +143,7 @@ let clock_decls env decls =
 	raise exc
     end
   in
-  if !Options.print_clocks then
+  if !Options.print_clocks  || !Options.verbose_level > 2 then
     Log.report ~level:1 (fun fmt -> fprintf fmt "@[<v 2>  %a@]@ " Corelang.pp_prog_clock decls);
   new_env
 
@@ -233,14 +233,14 @@ let is_stateful topdecl =
 
 
 let import_dependencies prog =
-  Log.report ~level:1 (fun fmt -> fprintf fmt "@[<v 0>.. extracting dependencies@ ");
+  Log.report ~level:1 (fun fmt -> fprintf fmt "@[<v 4>.. extracting dependencies");
   let dependencies = Corelang.get_dependencies prog in
   let deps =
   List.fold_left
     (fun (compilation_dep, type_env, clock_env) dep ->
       let (local, s) = Corelang.dependency_of_top dep in
       let basename = Options_management.name_dependency (local, s) in
-      Log.report ~level:1 (fun fmt -> Format.fprintf fmt "  Library %s@ " basename);
+      Log.report ~level:1 (fun fmt -> Format.fprintf fmt "@ Library %s" basename);
       let lusic = Modules.import_dependency dep.top_decl_loc (local, s) in
       (*Log.report ~level:1 (fun fmt -> Format.fprintf fmt "");*)
       let (lusi_type_env, lusi_clock_env) = get_envs_from_top_decls lusic.Lusic.contents in
diff --git a/src/corelang.ml b/src/corelang.ml
index 00cd8f48..67c7030a 100755
--- a/src/corelang.ml
+++ b/src/corelang.ml
@@ -14,7 +14,7 @@ open LustreSpec
 (*open Dimension*)
 
 
-exception Error of Location.t * error
+exception Error of Location.t * Error.error_kind
 
 module VDeclModule =
 struct (* Node module *)
@@ -823,32 +823,6 @@ let pp_decl_clock fmt cdecl =
 let pp_prog_clock fmt prog =
   Utils.fprintf_list ~sep:"" pp_decl_clock fmt prog
 
-let pp_error fmt = function
-    Main_not_found ->
-      fprintf fmt "Could not find the definition of main node %s.@."
-	!Global.main_node
-  | Main_wrong_kind ->
-    fprintf fmt
-      "Node %s does not correspond to a valid main node definition.@." 
-      !Global.main_node 
-  | No_main_specified ->
-    fprintf fmt "No main node specified (use -node option)@."
-  | Unbound_symbol sym ->
-    fprintf fmt
-      "%s is undefined.@."
-      sym
-  | Already_bound_symbol sym -> 
-    fprintf fmt
-      "%s is already defined.@."
-      sym
-  | Unknown_library sym ->
-    fprintf fmt
-      "impossible to load library %s.lusic.@.Please compile the corresponding interface or source file.@."
-      sym
-  | Wrong_number sym ->
-    fprintf fmt
-      "library %s.lusic has a different version number and may crash compiler.@.Please recompile the corresponding interface or source file.@."
-      sym
 
 (* filling node table with internal functions *)
 let vdecls_of_typ_ck cpt ty =
@@ -1065,6 +1039,28 @@ let copy_top top =
 let copy_prog top_list =
   List.map copy_top top_list
 
+
+let rec expr_contains_expr expr_tag expr  =
+  let search = expr_contains_expr expr_tag in
+  expr.expr_tag = expr_tag ||
+      (
+	match expr.expr_desc with
+	| Expr_const _ -> false
+	| Expr_array el -> List.exists search el
+	| Expr_access (e1, _) 
+	| Expr_power (e1, _) -> search e1
+	| Expr_tuple el -> List.exists search el
+	| Expr_ite (c, t, e) -> List.exists search [c;t;e]
+	| Expr_arrow (e1, e2)
+	| Expr_fby (e1, e2) -> List.exists search [e1; e2]
+	| Expr_pre e' 
+	| Expr_when (e', _, _) -> search e'
+	| Expr_merge (_, hl) -> List.exists (fun (_, h) -> search h) hl
+	| Expr_appl (_, e', None) -> search e' 
+	| Expr_appl (_, e', Some e'') -> List.exists search [e'; e''] 
+	| Expr_ident _ -> false
+      )
+
 (* Local Variables: *)
 (* compile-command:"make -C .." *)
 (* End: *)
diff --git a/src/corelang.mli b/src/corelang.mli
index 73bef972..20bb6786 100755
--- a/src/corelang.mli
+++ b/src/corelang.mli
@@ -12,8 +12,9 @@
 
 open LustreSpec
 
-exception Error of Location.t * error
-
+exception Error of Location.t * Error.error_kind
+module VSet: Set.S
+  
 val dummy_type_dec: type_dec
 val dummy_clock_dec: clock_dec
 
@@ -84,7 +85,7 @@ val sort_handlers : (label * 'a) list -> (label * 'a) list
 
 val is_eq_expr: expr -> expr -> bool
 
-val pp_error :  Format.formatter -> error -> unit
+(* val pp_error :  Format.formatter -> error -> unit *)
 
 (* Caution, returns an untyped, unclocked, etc, expression *)
 val is_tuple_expr : expr -> bool
@@ -144,6 +145,7 @@ val extend_eexpr: (quantifier_type * var_decl list) list -> eexpr -> eexpr
 val update_expr_annot: ident -> expr -> expr_annot -> expr
 (* val mkpredef_call: Location.t -> ident -> eexpr list -> eexpr*)
 
+val expr_contains_expr: tag -> expr -> bool
 (* Local Variables: *)
 (* compile-command:"make -C .." *)
 (* End: *)
diff --git a/src/lusic.ml b/src/lusic.ml
index 72506aec..1859333b 100644
--- a/src/lusic.ml
+++ b/src/lusic.ml
@@ -44,7 +44,7 @@ let extract_header dirname basename prog =
     prog []
 
 let check_obsolete lusic basename =
-  if lusic.obsolete then raise (Error (Location.dummy_loc, Wrong_number basename))
+  if lusic.obsolete then raise (Error (Location.dummy_loc, Error.Wrong_number basename))
 
 (* encode and write a header in a file *)
 let write_lusic lusi (header : top_decl list) basename extension =
diff --git a/src/lustreSpec.ml b/src/lustreSpec.ml
index 445b8831..3051b4d0 100644
--- a/src/lustreSpec.ml
+++ b/src/lustreSpec.ml
@@ -251,15 +251,6 @@ and instr_t_desc =
   | MComment of string
 
 
-type error =
-    Main_not_found
-  | Main_wrong_kind
-  | No_main_specified
-  | Unbound_symbol of ident
-  | Already_bound_symbol of ident
-  | Unknown_library of ident
-  | Wrong_number of ident
-
 (* Local Variables: *)
 (* compile-command:"make -C .." *)
 (* End: *)
diff --git a/src/main_lustre_compiler.ml b/src/main_lustre_compiler.ml
index f9176183..3b78406e 100644
--- a/src/main_lustre_compiler.ml
+++ b/src/main_lustre_compiler.ml
@@ -242,7 +242,13 @@ let stage2 prog =
   (* Computation of node equation scheduling. It also breaks dependency cycles
      and warns about unused input or memory variables *)
   Log.report ~level:1 (fun fmt -> fprintf fmt ".. scheduling@,");
-  let prog, node_schs = Scheduling.schedule_prog prog in
+  let prog, node_schs =
+    try 
+      Scheduling.schedule_prog prog
+    with Causality.Error _ -> (* Error is not kept. It is recomputed in a more
+				 systemtic way in AlgebraicLoop module *)
+      AlgebraicLoop.analyze prog
+  in
   Log.report ~level:1 (fun fmt -> fprintf fmt "%a"              Scheduling.pp_warning_unused node_schs);
   Log.report ~level:3 (fun fmt -> fprintf fmt "@[<v 2>@ %a@]@," Scheduling.pp_schedule node_schs);
   Log.report ~level:3 (fun fmt -> fprintf fmt "@[<v 2>@ %a@]@," Scheduling.pp_fanin_table node_schs);
@@ -421,11 +427,11 @@ let _ =
     Arg.parse options anonymous usage
   with
   | Parse.Error _
-  | Types.Error (_,_) | Clocks.Error (_,_)
-  | Corelang.Error _ (*| Task_set.Error _*)
-  | Causality.Error _ -> exit 1
+  | Types.Error (_,_) | Clocks.Error (_,_) -> exit 1
+  | Corelang.Error (_ (* loc *), kind) (*| Task_set.Error _*) -> exit (Error.return_code kind)
+  (* | Causality.Error _  -> exit (Error.return_code Error.AlgebraicLoop) *)
   | Sys_error msg -> (eprintf "Failure: %s@." msg)
-  | exc -> (track_exception (); raise exc)
+  | exc -> (track_exception (); raise exc) 
 
 (* Local Variables: *)
 (* compile-command:"make -C .." *)
diff --git a/src/modules.ml b/src/modules.ml
index 59c60aee..eee6a26b 100644
--- a/src/modules.ml
+++ b/src/modules.ml
@@ -15,12 +15,12 @@ open Corelang
 
 let add_symbol loc msg hashtbl name value =
  if Hashtbl.mem hashtbl name
- then raise (Error (loc, Already_bound_symbol msg))
+ then raise (Error (loc, Error.Already_bound_symbol msg))
  else Hashtbl.add hashtbl name value
 
 let check_symbol loc msg hashtbl name =
  if not (Hashtbl.mem hashtbl name)
- then raise (Error (loc, Unbound_symbol msg))
+ then raise (Error (loc, Error.Unbound_symbol msg))
  else ()
 
 let add_imported_node name value =
@@ -33,7 +33,7 @@ let add_imported_node name value =
     let itf = value.top_decl_itf in
     match value'.top_decl_desc, value.top_decl_desc with
     | Node _        , ImportedNode _  when owner = owner' && itf' && (not itf) -> Hashtbl.add node_table name value
-    | ImportedNode _, ImportedNode _            -> raise (Error (value.top_decl_loc, Already_bound_symbol ("node " ^ name)))
+    | ImportedNode _, ImportedNode _            -> raise (Error (value.top_decl_loc, Error.Already_bound_symbol ("node " ^ name)))
     | _                                         -> assert false
   with
     Not_found                                   -> Hashtbl.add node_table name value
@@ -48,7 +48,7 @@ let add_node name value =
     let itf = value.top_decl_itf in
     match value'.top_decl_desc, value.top_decl_desc with
     | ImportedNode _, Node _          when owner = owner' && itf' && (not itf) -> ()
-    | Node _        , Node _                    -> raise (Error (value.top_decl_loc, Already_bound_symbol ("node " ^ name)))
+    | Node _        , Node _                    -> raise (Error (value.top_decl_loc, Error.Already_bound_symbol ("node " ^ name)))
     | _                                         -> assert false
   with
     Not_found                                   -> Hashtbl.add node_table name value
@@ -56,12 +56,12 @@ let add_node name value =
 
 let add_tag loc name typ =
   if Hashtbl.mem tag_table name then
-    raise (Error (loc, Already_bound_symbol ("enum tag " ^ name)))
+    raise (Error (loc, Error.Already_bound_symbol ("enum tag " ^ name)))
   else Hashtbl.add tag_table name typ
 
 let add_field loc name typ =
   if Hashtbl.mem field_table name then
-    raise (Error (loc, Already_bound_symbol ("struct field " ^ name)))
+    raise (Error (loc, Error.Already_bound_symbol ("struct field " ^ name)))
   else Hashtbl.add field_table name typ
 
 let import_typedef name tydef =
@@ -75,7 +75,7 @@ let import_typedef name tydef =
     | Tydec_clock ty      -> import ty
     | Tydec_const c       ->
        if not (Hashtbl.mem type_table (Tydec_const c))
-       then raise (Error (loc, Unbound_symbol ("type " ^ c)))
+       then raise (Error (loc, Error.Unbound_symbol ("type " ^ c)))
        else ()
     | Tydec_array (c, ty) -> import ty
     | _                   -> ()
@@ -91,13 +91,13 @@ let add_type itf name value =
     let itf = value.top_decl_itf in
     match value'.top_decl_desc, value.top_decl_desc with
     | TypeDef ty', TypeDef ty when coretype_equal ty'.tydef_desc ty.tydef_desc && owner' = owner && itf' && (not itf) -> ()
-    | TypeDef ty', TypeDef ty -> raise (Error (value.top_decl_loc, Already_bound_symbol ("type " ^ name)))
+    | TypeDef ty', TypeDef ty -> raise (Error (value.top_decl_loc, Error.Already_bound_symbol ("type " ^ name)))
     | _       -> assert false
   with Not_found -> (import_typedef name value; Hashtbl.add type_table (Tydec_const name) value)
 
 let check_type loc name =
  if not (Hashtbl.mem type_table (Tydec_const name))
- then raise (Error (loc, Unbound_symbol ("type " ^ name)))
+ then raise (Error (loc, Error.Unbound_symbol ("type " ^ name)))
  else ()
 
 let add_const itf name value =
@@ -109,7 +109,7 @@ let add_const itf name value =
     let itf = value.top_decl_itf in
     match value'.top_decl_desc, value.top_decl_desc with
     | Const c', Const c when c.const_value = c'.const_value && owner' = owner && itf' && (not itf) -> ()
-    | Const c', Const c -> raise (Error (value.top_decl_loc, Already_bound_symbol ("const " ^ name)))
+    | Const c', Const c -> raise (Error (value.top_decl_loc, Error.Already_bound_symbol ("const " ^ name)))
     | _       -> assert false
   with Not_found -> Hashtbl.add consts_table name value
 
@@ -124,7 +124,7 @@ let import_dependency_aux loc (local, dep) =
   | Sys_error msg ->
     begin
       (*Format.eprintf "Error: %s@." msg;*)
-      raise (Error (loc, Unknown_library basename))
+      raise (Error (loc, Error.Unknown_library basename))
     end
   | Corelang.Error (_, msg) -> raise (Corelang.Error (loc, msg))
 
@@ -134,7 +134,7 @@ let import_dependency loc (local, dep) =
   with
   | Corelang.Error (_, err) as exc -> (
     Format.eprintf "Import error: %a%a@."
-      Corelang.pp_error err
+      Error.pp_error_msg err
       Location.pp_loc loc;
     raise exc
   )
@@ -145,7 +145,7 @@ let check_dependency lusic basename =
   with
   | Corelang.Error (loc, err) as exc -> (
     Format.eprintf "Import error: %a%a@."
-      Corelang.pp_error err
+      Error.pp_error_msg err
       Location.pp_loc loc;
     raise exc
   )
@@ -170,7 +170,7 @@ let load_header imported header =
   with
     Corelang.Error (loc, err) as exc -> (
       Format.eprintf "Import error: %a%a@."
-	Corelang.pp_error err
+	Error.pp_error_msg err
 	Location.pp_loc loc;
       raise exc
     );;
@@ -195,7 +195,7 @@ let load_program imported program =
   with
     Corelang.Error (loc, err) as exc -> (
       Format.eprintf "Import error: %a%a@."
-	Corelang.pp_error err
+	Error.pp_error_msg err
 	Location.pp_loc loc;
       raise exc
     );;
diff --git a/src/options.ml b/src/options.ml
index 6893bcc6..91a2261f 100755
--- a/src/options.ml
+++ b/src/options.ml
@@ -15,8 +15,8 @@ let include_dirs = ref ["."]
 
 let main_node = ref ""
 let static_mem = ref true
-let print_types = ref true
-let print_clocks = ref true
+let print_types = ref false
+let print_clocks = ref false
 let delay_calculus = ref true
 let track_exceptions = ref true
 let ansi = ref false
@@ -52,7 +52,7 @@ let nb_mutants = ref 1000
 let gen_mcdc = ref false
 let no_mutation_suffix = ref false
 
-
+let solve_al = ref false
 
 (* Local Variables: *)
 (* compile-command:"make -C .." *)
diff --git a/src/scheduling.ml b/src/scheduling.ml
index 3ecc950c..c6263f73 100644
--- a/src/scheduling.ml
+++ b/src/scheduling.ml
@@ -130,34 +130,26 @@ let filter_original n vl =
 
 let schedule_node n =
   (* let node_vars = get_node_vars n in *)
-  try
-    let eq_equiv = ExprDep.node_eq_equiv n in
-    let eq_equiv v1 v2 =
-      try
-	Hashtbl.find eq_equiv v1 = Hashtbl.find eq_equiv v2
-      with Not_found -> false in
+  let eq_equiv = ExprDep.node_eq_equiv n in
+  let eq_equiv v1 v2 =
+    try
+      Hashtbl.find eq_equiv v1 = Hashtbl.find eq_equiv v2
+    with Not_found -> false in
 
-    let n', g = global_dependency n in
-    
-    (* TODO X: extend the graph with inputs (adapt the causality analysis to deal with inputs
+  let n', g = global_dependency n in
+  
+  (* TODO X: extend the graph with inputs (adapt the causality analysis to deal with inputs
      compute: coi predecessors of outputs
      warning (no modification) when memories are non used (do not impact output) or when inputs are not used (do not impact output)
-       DONE !
-     *)
+     DONE !
+  *)
 
-    let gg = IdentDepGraph.copy g in
-    let sort = topological_sort eq_equiv g in
-    let unused = Liveness.compute_unused_variables n gg in
-    let fanin = Liveness.compute_fanin n gg in
-    { node = n'; schedule = sort; unused_vars = unused; fanin_table = fanin; dep_graph = gg; }
+  let gg = IdentDepGraph.copy g in
+  let sort = topological_sort eq_equiv g in
+  let unused = Liveness.compute_unused_variables n gg in
+  let fanin = Liveness.compute_fanin n gg in
+  { node = n'; schedule = sort; unused_vars = unused; fanin_table = fanin; dep_graph = gg; }
 
-  with (Causality.Error err) as exc ->
-    match err with
-    | DataCycle vl ->
-       let _ (*vl*) = filter_original n vl in
-       Causality.pp_error Format.err_formatter err;
-       raise exc
-    | _ -> raise exc
 
 let compute_node_reuse_table report =
   let disjoint = Disjunction.clock_disjoint_map (get_node_vars report.node) in
-- 
GitLab