let create kf =
  let kf_name = Kernel_function.get_name kf in
  Wp_parameters.feedback ~level:3 "create cfg for function '%s'@." kf_name;
  let f = Kernel_function.get_definition kf in
  let cfg, fct_in, fct_out = init_cfg kf in
  let in_b = cfg_block cfg Bfct f.sbody fct_out in
  let _ = add_edge cfg fct_in Enone in_b in
  let graph = cfg_graph cfg in
    Wp_parameters.debug ~level:3
      "[cfg] for function '%s': %d vertex - %d edges@."
      kf_name (CFG.nb_edges graph) (CFG.nb_vertex graph);
    Wp_parameters.feedback ~level:3
      "[cfg] start removing unreachable in %s@." kf_name;
  !Db.progress ();
  let cfg, unreached = clean_graph cfg in
    Wp_parameters.debug ~level:3
      "[cfg] for function '%s': %d vertex - %d edges@."
      kf_name (CFG.nb_edges graph) (CFG.nb_vertex graph);
  !Db.progress ();
    Wp_parameters.feedback ~level:3
      "[cfg] start loop analysis for %s@." kf_name;
  let _ = mark_loops cfg in
    Wp_parameters.feedback ~level:3 "[cfg] done for %s@." kf_name;
  !Db.progress ();
    cfg, unreached