sig
  type in_key = InCtrl | InNum of int | InImpl of Locations.Zone.t
  type out_key = OutRet | OutLoc of Locations.Zone.t
  type key =
      In of PdgIndex.Signature.in_key
    | Out of PdgIndex.Signature.out_key
  type 'info t = {
    in_ctrl : 'info option;
    in_params : (int * 'info) list;
    in_implicits : (Locations.Zone.t * 'info) list;
    out_ret : 'info option;
    outputs : (Locations.Zone.t * 'info) list;
  }
  module Str_descr :
    sig
      val in_key : Structural_descr.t
      val out_key : Structural_descr.t
      val key : Structural_descr.t
      val t : Structural_descr.t -> Structural_descr.t
    end
  val empty : 'PdgIndex.Signature.t
  val in_key : int -> PdgIndex.Signature.key
  val in_impl_key : Locations.Zone.t -> PdgIndex.Signature.key
  val in_top_key : PdgIndex.Signature.key
  val in_ctrl_key : PdgIndex.Signature.key
  val out_ret_key : PdgIndex.Signature.key
  val out_key : Locations.Zone.t -> PdgIndex.Signature.key
  val mk_undef_in_key : Locations.Zone.t -> PdgIndex.Signature.in_key
  val copy : '-> 'a
  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 add_in_list :
    ('a * 'b) list -> '-> '-> ('-> '-> 'b) -> ('a * 'b) list
  val add_loc :
    (Locations.Zone.t * 'a) list ->
    Locations.Zone.t ->
    '-> ('-> '-> 'a) -> (Locations.Zone.t * 'a) list
  val add_replace : bool -> '-> '-> 'b
  val add_input :
    'PdgIndex.Signature.t ->
    int -> '-> replace:bool -> 'PdgIndex.Signature.t
  val add_impl_input :
    'PdgIndex.Signature.t ->
    Locations.Zone.t -> '-> replace:bool -> 'PdgIndex.Signature.t
  val add_output :
    'PdgIndex.Signature.t ->
    Locations.Zone.t -> '-> replace:bool -> 'PdgIndex.Signature.t
  val add_in_ctrl :
    'PdgIndex.Signature.t -> '-> replace:bool -> 'PdgIndex.Signature.t
  val add_out_ret :
    'PdgIndex.Signature.t -> '-> replace:bool -> 'PdgIndex.Signature.t
  val add_info :
    'PdgIndex.Signature.t ->
    PdgIndex.Signature.key -> '-> replace:bool -> 'PdgIndex.Signature.t
  val find_input : 'PdgIndex.Signature.t -> int -> 'a
  val find_output : 'PdgIndex.Signature.t -> Locations.Zone.t -> 'a
  val find_out_ret : 'PdgIndex.Signature.t -> 'a
  val find_in_ctrl : 'PdgIndex.Signature.t -> 'a
  val find_implicit_input : 'PdgIndex.Signature.t -> Locations.Zone.t -> 'a
  val find_in_top : 'PdgIndex.Signature.t -> 'a
  val find_in_info :
    'PdgIndex.Signature.t -> PdgIndex.Signature.in_key -> 'a
  val find_out_info :
    'PdgIndex.Signature.t -> PdgIndex.Signature.out_key -> 'a
  val find_info : 'PdgIndex.Signature.t -> PdgIndex.Signature.key -> 'a
  val fold_outputs :
    ('-> Locations.Zone.t * '-> 'a) ->
    '-> 'PdgIndex.Signature.t -> 'a
  val fold_all_outputs :
    ('-> PdgIndex.Signature.out_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 :
    ('-> PdgIndex.Signature.key * '-> 'a) ->
    '-> 'PdgIndex.Signature.t -> 'a
  val iter :
    (PdgIndex.Signature.key * '-> unit) -> 'PdgIndex.Signature.t -> unit
  val merge :
    'PdgIndex.Signature.t ->
    'PdgIndex.Signature.t -> ('-> '-> 'a) -> 'PdgIndex.Signature.t
  val pretty_in_key : Format.formatter -> PdgIndex.Signature.in_key -> unit
  val pretty_out_key : Format.formatter -> PdgIndex.Signature.out_key -> unit
  val pretty_key : Format.formatter -> PdgIndex.Signature.key -> unit
  val pretty :
    (Format.formatter -> '-> unit) ->
    Format.formatter -> 'PdgIndex.Signature.t -> unit
end