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 : 'a 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 -> '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 -> 'a -> 'b -> ('b -> 'b -> 'b) -> ('a * 'b) list
  val add_loc :
    (Locations.Zone.t * 'a) list ->
    Locations.Zone.t ->
    'a -> ('a -> 'a -> 'a) -> (Locations.Zone.t * 'a) list
  val add_replace : bool -> 'a -> 'b -> 'b
  val add_input :
    'a PdgIndex.Signature.t ->
    int -> 'a -> replace:bool -> 'a PdgIndex.Signature.t
  val add_impl_input :
    'a PdgIndex.Signature.t ->
    Locations.Zone.t -> 'a -> replace:bool -> 'a PdgIndex.Signature.t
  val add_output :
    'a PdgIndex.Signature.t ->
    Locations.Zone.t -> 'a -> replace:bool -> 'a PdgIndex.Signature.t
  val add_in_ctrl :
    'a PdgIndex.Signature.t -> 'a -> replace:bool -> 'a PdgIndex.Signature.t
  val add_out_ret :
    'a PdgIndex.Signature.t -> 'a -> replace:bool -> 'a PdgIndex.Signature.t
  val add_info :
    'a PdgIndex.Signature.t ->
    PdgIndex.Signature.key -> 'a -> replace:bool -> 'a PdgIndex.Signature.t
  val find_input : 'a PdgIndex.Signature.t -> int -> 'a
  val find_output : 'a PdgIndex.Signature.t -> Locations.Zone.t -> 'a
  val find_out_ret : 'a PdgIndex.Signature.t -> 'a
  val find_in_ctrl : 'a PdgIndex.Signature.t -> 'a
  val find_implicit_input : 'a PdgIndex.Signature.t -> Locations.Zone.t -> 'a
  val find_in_top : 'a PdgIndex.Signature.t -> 'a
  val find_in_info :
    'a PdgIndex.Signature.t -> PdgIndex.Signature.in_key -> 'a
  val find_out_info :
    'a PdgIndex.Signature.t -> PdgIndex.Signature.out_key -> 'a
  val find_info : 'a PdgIndex.Signature.t -> PdgIndex.Signature.key -> 'a
  val fold_outputs :
    ('a -> Locations.Zone.t * 'b -> 'a) ->
    'a -> 'b PdgIndex.Signature.t -> 'a
  val fold_all_outputs :
    ('a -> PdgIndex.Signature.out_key * 'b -> 'a) ->
    'a -> 'b PdgIndex.Signature.t -> 'a
  val fold_num_inputs :
    ('a -> int * 'b -> 'a) -> 'a -> 'b PdgIndex.Signature.t -> 'a
  val fold_impl_inputs :
    ('a -> Locations.Zone.t * 'b -> 'a) ->
    'a -> 'b PdgIndex.Signature.t -> 'a
  val fold_matching_impl_inputs :
    Locations.Zone.t ->
    ('a -> Locations.Zone.t * 'b -> 'a) ->
    'a -> 'b PdgIndex.Signature.t -> 'a
  val fold_all_inputs :
    ('a -> PdgIndex.Signature.in_key * 'b -> 'a) ->
    'a -> 'b PdgIndex.Signature.t -> 'a
  val fold :
    ('a -> PdgIndex.Signature.key * 'b -> 'a) ->
    'a -> 'b PdgIndex.Signature.t -> 'a
  val merge :
    'a PdgIndex.Signature.t ->
    'a PdgIndex.Signature.t -> ('a -> 'a -> 'a) -> '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 -> 'a -> unit) ->
    Format.formatter -> 'a PdgIndex.Signature.t -> unit
end