sig
  module type InputDomain =
    sig
      type t
      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 top : t
      val join : t -> t -> t
    end
  module type S =
    sig
      type t
      val register_global_state :
        bool -> Domain_store.S.t Eval.or_bottom -> unit
      val register_initial_state :
        Value_types.callstack -> Domain_store.S.t -> unit
      val register_state_before_stmt :
        Value_types.callstack -> Cil_types.stmt -> Domain_store.S.t -> unit
      val register_state_after_stmt :
        Value_types.callstack -> Cil_types.stmt -> Domain_store.S.t -> unit
      val get_global_state : unit -> Domain_store.S.t Eval.or_bottom
      val get_initial_state :
        Cil_types.kernel_function -> Domain_store.S.t Eval.or_bottom
      val get_initial_state_by_callstack :
        ?selection:Eval.callstack list ->
        Cil_types.kernel_function ->
        Domain_store.S.t Value_types.Callstack.Hashtbl.t Eval.or_top_bottom
      val get_stmt_state :
        after:bool -> Cil_types.stmt -> Domain_store.S.t Eval.or_bottom
      val get_stmt_state_by_callstack :
        ?selection:Eval.callstack list ->
        after:bool ->
        Cil_types.stmt ->
        Domain_store.S.t Value_types.Callstack.Hashtbl.t Eval.or_top_bottom
      val mark_as_computed : unit -> unit
      val is_computed : unit -> bool
    end
  module Make :
    functor (Domain : InputDomain->
      sig
        val register_global_state : bool -> Domain.t Eval.or_bottom -> unit
        val register_initial_state :
          Value_types.callstack -> Domain.t -> unit
        val register_state_before_stmt :
          Value_types.callstack -> Cil_types.stmt -> Domain.t -> unit
        val register_state_after_stmt :
          Value_types.callstack -> Cil_types.stmt -> Domain.t -> unit
        val get_global_state : unit -> Domain.t Eval.or_bottom
        val get_initial_state :
          Cil_types.kernel_function -> Domain.t Eval.or_bottom
        val get_initial_state_by_callstack :
          ?selection:Eval.callstack list ->
          Cil_types.kernel_function ->
          Domain.t Value_types.Callstack.Hashtbl.t Eval.or_top_bottom
        val get_stmt_state :
          after:bool -> Cil_types.stmt -> Domain.t Eval.or_bottom
        val get_stmt_state_by_callstack :
          ?selection:Eval.callstack list ->
          after:bool ->
          Cil_types.stmt ->
          Domain.t Value_types.Callstack.Hashtbl.t Eval.or_top_bottom
        val mark_as_computed : unit -> unit
        val is_computed : unit -> bool
      end
end