let compute_pdg kf =
  if not (Db.Value.is_computed ()) then !Db.Value.compute ();

  Pdg_parameters.feedback "computing for function %a" Kernel_function.pretty kf;

  try

    if is_variadic kf then
      Extlib.not_yet_implemented "variadic function";

    let pdg = compute_pdg_for_f kf in

    Pdg_parameters.feedback "done for function %a" Kernel_function.pretty kf;

    pdg

  with
    | Err_Bot what ->
        Pdg_parameters.warning "%s" what ;
        degenerated false kf

    | Log.AbortFatal what ->
        Pdg_parameters.warning "internal error: %s" what ;
        degenerated true kf

    | Log.AbortError what ->
        Pdg_parameters.warning "user error: %s" what ;
        degenerated true kf

    | Pdg_state.Cannot_fold ->
        Pdg_parameters.warning "too imprecise value analysis : abort" ;
        degenerated true kf

    | Extlib.NotYetImplemented what ->
        Pdg_parameters.warning "not implemented by PDG yet: %s" what ;
        degenerated true kf

    | Log.FeatureRequest (who, what) ->
        Pdg_parameters.warning "not implemented by [%s] yet: %s" who what ;
        degenerated true kf