let main () =

  (* Memoization of context free functions *)
  let mem_functions = Value_parameters.MemFunctions.get () in
  if Value_parameters.MemExecAll.get ()
    || not (Datatype.String.Set.is_empty mem_functions)
  then begin
    Value_parameters.feedback "====== MEMOIZING FUNCTIONS ======";
    Ast.compute ();
    Globals.Functions.iter
      (fun kf ->
         let name = Kernel_function.get_name kf in
         if Kernel_function.is_definition kf &&
           (Value_parameters.MemExecAll.get ()
            || Datatype.String.Set.mem name mem_functions)
         then begin
           Value_parameters.feedback "== function %a"
             Kernel_function.pretty_name kf;
           try
             !Db.Value.memoize kf
           with Db.Value.Aborted ->
             Value_parameters.fatal "Cannot memoize %a: Analysis degenerated@."
               Kernel_function.pretty_name kf
         end)
  end;

  (* Value computations *)
  if Value_parameters.ForceValues.get () then begin
    !Db.Value.compute ();
    Value_parameters.result "====== VALUES COMPUTED ======";
  end;

  (* Val display and Inout compute/display *)

  let display_val =
    Value_parameters.verbose_atleast 1 && Value_parameters.ForceValues.get ()
  in

  (* Iteration *)

  if display_val  then
    begin
      !Db.Semantic_Callgraph.topologically_iter_on_functions
        (fun kf ->
           if Kernel_function.is_definition kf then
             begin
               Value_parameters.result "%a" Db.Value.display kf ;
             end)
    end