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