let finalize_pdg pdg from_opt =
    P.debug ~level:2 "try to finalize_pdg";
    let last_state =
      try Some (State.get_last_state (get_states pdg))
      with Not_found ->
        CilE.warn_once "no final state. Probably unreachable..."None
    in
    let _ = match from_opt with
      | None -> () (* defined function : retres already processed. *)
      | Some froms -> (* undefined function : add output 0 *)
          (* TODO : also add the nodes for the other from ! *)
          let in_state =
            match last_state with Some s -> s | None -> assert false in
          let state = in_state in
          let process_out out  (default, from_out) state =
            add_from pdg in_state state out (default, from_out)
          in
          let from_table = froms.Function_Froms.deps_table in
          let new_state =
            try Lmap_bitwise.From_Model.fold process_out from_table state
            with Lmap_bitwise.From_Model.Cannot_fold -> (* TOP in from_table *)
              process_out Locations.Zone.top (falseLocations.Zone.top) state
          in
          let new_state =
            if (not (Kernel_function.returns_void pdg.fct)) then
              let from0 = froms.Function_Froms.deps_return in
              let _ = create_fun_output_node pdg (Some new_state)
                        (Lmap_bitwise.From_Model.LOffset.collapse from0)
              in new_state
            else new_state
          in
          store_last_state pdg new_state
    in
    let init_state = process_other_inputs pdg in
      store_init_state pdg init_state;
    add_ctrl_dpds pdg ;
    P.debug ~level:2 "finalize_pdg ok";
    let states = get_states pdg in
    let pdg = PdgTypes.Pdg.make pdg.fct pdg.graph states pdg.index 
    in
    pdg