sig
  exception AddError
  exception CallStatement
  exception Not_equal
  module Signature :
    sig
      type 'a t
      type in_key = private
          InCtrl
        | InNum of int
        | InImpl of Locations.Zone.t
      type out_key = private OutRet | OutLoc of Locations.Zone.t
      type key = private
          In of PdgIndex.Signature.in_key
        | Out of PdgIndex.Signature.out_key
      val empty : 'PdgIndex.Signature.t
      val mk_undef_in_key : Locations.Zone.t -> PdgIndex.Signature.in_key
      val cmp_in_key :
        PdgIndex.Signature.in_key -> PdgIndex.Signature.in_key -> int
      val cmp_out_key :
        PdgIndex.Signature.out_key -> PdgIndex.Signature.out_key -> int
      val equal_out_key :
        PdgIndex.Signature.out_key -> PdgIndex.Signature.out_key -> bool
      val find_info : 'PdgIndex.Signature.t -> PdgIndex.Signature.key -> 'a
      val find_input : 'PdgIndex.Signature.t -> int -> 'a
      val find_in_ctrl : 'info PdgIndex.Signature.t -> 'info
      val find_in_top : 'info PdgIndex.Signature.t -> 'info
      val find_in_info :
        'info PdgIndex.Signature.t -> PdgIndex.Signature.in_key -> 'info
      val find_out_ret : 'PdgIndex.Signature.t -> 'a
      val find_out_info :
        'info PdgIndex.Signature.t -> PdgIndex.Signature.out_key -> 'info
      val fold :
        ('-> PdgIndex.Signature.key * '-> 'a) ->
        '-> 'PdgIndex.Signature.t -> 'a
      val fold_num_inputs :
        ('-> int * '-> 'a) -> '-> 'PdgIndex.Signature.t -> 'a
      val fold_impl_inputs :
        ('-> Locations.Zone.t * '-> 'a) ->
        '-> 'PdgIndex.Signature.t -> 'a
      val fold_matching_impl_inputs :
        Locations.Zone.t ->
        ('-> Locations.Zone.t * '-> 'a) ->
        '-> 'PdgIndex.Signature.t -> 'a
      val fold_all_inputs :
        ('-> PdgIndex.Signature.in_key * '-> 'a) ->
        '-> 'PdgIndex.Signature.t -> 'a
      val fold_all_outputs :
        ('-> PdgIndex.Signature.out_key * '-> 'a) ->
        '-> 'PdgIndex.Signature.t -> 'a
      val pretty :
        (Stdlib.Format.formatter -> '-> unit) ->
        Stdlib.Format.formatter -> 'PdgIndex.Signature.t -> unit
      val pretty_key :
        Stdlib.Format.formatter -> PdgIndex.Signature.key -> unit
      val pretty_in_key :
        Stdlib.Format.formatter -> PdgIndex.Signature.in_key -> unit
      val pretty_out_key :
        Stdlib.Format.formatter -> PdgIndex.Signature.out_key -> unit
    end
  module Key :
    sig
      type key = private
          SigKey of PdgIndex.Signature.key
        | VarDecl of Cil_types.varinfo
        | Stmt of Cil_types.stmt
        | CallStmt of Cil_types.stmt
        | Label of Cil_types.stmt * Cil_types.label
        | SigCallKey of Cil_types.stmt * PdgIndex.Signature.key
      type t = key
      val ty : t Type.t
      val name : string
      val descr : t Descr.t
      val packed_descr : Structural_descr.pack
      val reprs : t list
      val equal : t -> t -> bool
      val compare : t -> t -> int
      val hash : t -> int
      val pretty_code : Format.formatter -> t -> unit
      val internal_pretty_code :
        Type.precedence -> Format.formatter -> t -> unit
      val pretty : Format.formatter -> t -> unit
      val varname : t -> string
      val mem_project : (Project_skeleton.t -> bool) -> t -> bool
      val copy : t -> t
      val param_key : int -> t
      val implicit_in_key : Locations.Zone.t -> t
      val entry_point : t
      val top_input : t
      val output_key : t
      val out_from_key : Locations.Zone.t -> t
      val decl_var_key : Cil_types.varinfo -> t
      val label_key : Cil_types.stmt -> Cil_types.label -> t
      val stmt_key : Cil_types.stmt -> t
      val call_key : Cil_types.stmt -> t
      val call_input_key : Cil_types.stmt -> int -> t
      val call_output_key : Cil_types.stmt -> Locations.Zone.t -> t
      val call_outret_key : Cil_types.stmt -> t
      val call_ctrl_key : Cil_types.stmt -> t
      val call_topin_key : Cil_types.stmt -> t
      val stmt : t -> Cil_types.stmt option
      val call_from_id : Cil_types.stmt -> Cil_types.stmt
    end
  module FctIndex :
    sig
      type ('ni, 'ci) t
      val create : int -> ('ni, 'ci) PdgIndex.FctIndex.t
      val length : ('ni, 'ci) PdgIndex.FctIndex.t -> int
      val copy :
        ('ni, 'ci) PdgIndex.FctIndex.t -> ('ni, 'ci) PdgIndex.FctIndex.t
      val merge :
        ('ni, 'ci) PdgIndex.FctIndex.t ->
        ('ni, 'ci) PdgIndex.FctIndex.t ->
        ('ni -> 'ni -> 'ni) ->
        ('ci -> 'ci -> 'ci) -> ('ni, 'ci) PdgIndex.FctIndex.t
      val sgn : ('ni, 'ci) PdgIndex.FctIndex.t -> 'ni PdgIndex.Signature.t
      val find_info : ('ni, 'ci) PdgIndex.FctIndex.t -> PdgIndex.Key.t -> 'ni
      val find_all :
        ('ni, 'ci) PdgIndex.FctIndex.t -> PdgIndex.Key.t -> 'ni list
      val find_label :
        ('ni, 'ci) PdgIndex.FctIndex.t -> Cil_types.label -> 'ni
      val find_call :
        ('ni, 'ci) PdgIndex.FctIndex.t ->
        Cil_types.stmt -> 'ci option * 'ni PdgIndex.Signature.t
      val find_call_key :
        ('ni, 'ci) PdgIndex.FctIndex.t ->
        PdgIndex.Key.t -> 'ci option * 'ni PdgIndex.Signature.t
      val find_info_call :
        ('ni, 'ci) PdgIndex.FctIndex.t -> Cil_types.stmt -> 'ci
      val find_info_call_key :
        ('ni, 'ci) PdgIndex.FctIndex.t -> PdgIndex.Key.t -> 'ci
      val fold_calls :
        (Cil_types.stmt -> 'ci option * 'ni PdgIndex.Signature.t -> '-> 'c) ->
        ('ni, 'ci) PdgIndex.FctIndex.t -> '-> 'c
      val fold :
        (PdgIndex.Key.key -> 'ni -> '-> 'a) ->
        ('ni, 'ci) PdgIndex.FctIndex.t -> '-> 'a
      val add :
        ('ni, 'ci) PdgIndex.FctIndex.t -> PdgIndex.Key.t -> 'ni -> unit
      val add_or_replace :
        ('ni, 'ci) PdgIndex.FctIndex.t -> PdgIndex.Key.t -> 'ni -> unit
      val add_info_call :
        ('ni, 'ci) PdgIndex.FctIndex.t ->
        Cil_types.stmt -> 'ci -> replace:bool -> unit
      val add_info_call_key :
        ('ni, 'ci) PdgIndex.FctIndex.t ->
        PdgIndex.Key.t -> 'ci -> replace:bool -> unit
      val t_descr :
        ni:Structural_descr.t -> ci:Structural_descr.t -> Structural_descr.t
    end
end