(* Time-stamp: <modified the 03/04/2013 (at 14:41) by Erwan Jahier> *)

open Lxm
open Errors
open AstV6
open AstCore

(* get the first package in the package/model list *)

let (doit : AstV6.pack_or_model list -> Ident.idref option -> LicPrg.t) = 
  fun srclist main_node ->
    let syntax_tab = AstTab.create srclist in
    (* Pour chaque package, on a un solveur de r�f�rences
       globales, pour les types, const et node :
       - les r�f�rences point�es (p::n) sont recherch�es
       directement dans la syntax_tab puisqu'il n'y a pas 
       d'ambiguit�
       - les r�f�rences simples sont recherch�es :
       . dans le pack lui-m�me
       . dans un des packs d�clar�s "uses", avec
       priorit� dans l'ordre
    *)
    let lic_tab = LicTab.create syntax_tab in
    Verbose.exe ~level:2 (fun () -> AstTab.dump syntax_tab);

    let lic_tab = match main_node with
      | None -> LicTab.compile_all lic_tab
      | Some main_node -> 
        if !Global.compile_all_items then
          LicTab.compile_all lic_tab
        else 
          LicTab.compile_node lic_tab main_node
    in
    let zelic = LicTab.to_lic_prg lic_tab in
    (* �limination polymorphisme  surcharge *)
    let zelic = L2lRmPoly.doit zelic in
    (* alias des types array *)
    (*     let zelic = L2lAliasType.doit zelic in *)
    let zelic = if not !Global.inline_iterator then zelic else
        (* to be done before array expansion otherwise they won't be expanded *)
        L2lExpandMetaOp.doit zelic 
    in
    let zelic = 
      if 
        !Global.one_op_per_equation 
        || !Global.expand_nodes (* expand performs no fixpoint, so it will work
                                   only if we have one op per equation...*)
      then 
        (* Split des equations (1 eq = 1 op) *)
        L2lSplit.doit zelic 
      else 
        zelic
    in
    (* Array and struct expansion: to do after polymorphism elimination *)
    let zelic = if not !Global.expand_nodes then zelic else 
        L2lExpandNodes.doit zelic 
    in
    let zelic = if not !Global.expand_arrays then zelic else
        L2lExpandArrays.doit zelic 
    in    

    (* Currently only works in this mode *)
    if  !Global.ec then L2lCheckLoops.doit zelic;
    L2lCheckOutputs.doit zelic;

    zelic