sig
  type simple_argument = {
    formal : Cil_types.varinfo;
    concrete : Cil_types.exp;
  }
  type simple_call = {
    kf : Cil_types.kernel_function;
    arguments : Simpler_domains.simple_argument list;
    rest : Cil_types.exp list;
    return : Cil_types.varinfo option;
  }
  module type Minimal =
    sig
      type t
      val name : string
      val compare :
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t -> int
      val hash : Simpler_domains.Minimal.t -> int
      val top : Simpler_domains.Minimal.t
      val is_included :
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t -> bool
      val join :
        Simpler_domains.Minimal.t ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t
      val widen :
        Cil_types.kernel_function ->
        Cil_types.stmt ->
        Simpler_domains.Minimal.t ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t
      val assign :
        Cil_types.kinstr ->
        Cil_types.lval ->
        Cil_types.exp ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t Eval.or_bottom
      val assume :
        Cil_types.stmt ->
        Cil_types.exp ->
        bool ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t Eval.or_bottom
      val start_call :
        Cil_types.stmt ->
        Simpler_domains.simple_call ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t
      val finalize_call :
        Cil_types.stmt ->
        Simpler_domains.simple_call ->
        pre:Simpler_domains.Minimal.t ->
        post:Simpler_domains.Minimal.t ->
        Simpler_domains.Minimal.t Eval.or_bottom
      val empty : unit -> Simpler_domains.Minimal.t
      val initialize_variable :
        Cil_types.lval ->
        initialized:bool ->
        Abstract_domain.init_value ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t
      val enter_scope :
        Abstract_domain.variable_kind ->
        Cil_types.varinfo list ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t
      val leave_scope :
        Cil_types.kernel_function ->
        Cil_types.varinfo list ->
        Simpler_domains.Minimal.t -> Simpler_domains.Minimal.t
      val pretty :
        Stdlib.Format.formatter -> Simpler_domains.Minimal.t -> unit
    end
  module type Minimal_with_datatype =
    sig
      type t
      val top : t
      val is_included : t -> t -> bool
      val join : t -> t -> t
      val widen : Cil_types.kernel_function -> Cil_types.stmt -> t -> t -> t
      val assign :
        Cil_types.kinstr ->
        Cil_types.lval -> Cil_types.exp -> t -> t Eval.or_bottom
      val assume :
        Cil_types.stmt -> Cil_types.exp -> bool -> t -> t Eval.or_bottom
      val start_call : Cil_types.stmt -> simple_call -> t -> t
      val finalize_call :
        Cil_types.stmt -> simple_call -> pre:t -> post:t -> t Eval.or_bottom
      val empty : unit -> t
      val initialize_variable :
        Cil_types.lval ->
        initialized:bool -> Abstract_domain.init_value -> t -> t
      val enter_scope :
        Abstract_domain.variable_kind -> Cil_types.varinfo list -> t -> t
      val leave_scope :
        Cil_types.kernel_function -> Cil_types.varinfo list -> t -> 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
    end
  type cvalue_valuation = {
    find : Cil_types.exp -> Cvalue.V.t Eval.flagged_value Eval.or_top;
    find_loc : Cil_types.lval -> Precise_locs.precise_location Eval.or_top;
  }
  type precise_loc = Precise_locs.precise_location
  type cvalue = Cvalue.V.t
  module type Simple_Cvalue =
    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 is_included : t -> t -> bool
      val join : t -> t -> t
      val widen : Cil_types.kernel_function -> Cil_types.stmt -> t -> t -> t
      val extract_expr :
        t -> Cil_types.exp -> Simpler_domains.cvalue Eval.or_bottom
      val extract_lval :
        t ->
        Cil_types.lval ->
        Cil_types.typ ->
        Simpler_domains.precise_loc -> Simpler_domains.cvalue Eval.or_bottom
      val assign :
        Cil_types.kinstr ->
        Precise_locs.precise_location Eval.left_value ->
        Cil_types.exp ->
        (Simpler_domains.precise_loc, Simpler_domains.cvalue) Eval.assigned ->
        Simpler_domains.cvalue_valuation -> t -> t Eval.or_bottom
      val assume :
        Cil_types.stmt ->
        Cil_types.exp ->
        bool -> Simpler_domains.cvalue_valuation -> t -> t Eval.or_bottom
      val start_call :
        Cil_types.stmt ->
        (Simpler_domains.precise_loc, Simpler_domains.cvalue) Eval.call ->
        Simpler_domains.cvalue_valuation -> t -> t
      val finalize_call :
        Cil_types.stmt ->
        (Simpler_domains.precise_loc, Simpler_domains.cvalue) Eval.call ->
        pre:t -> post:t -> t Eval.or_bottom
      val empty : unit -> t
      val initialize_variable :
        Cil_types.lval ->
        initialized:bool -> Abstract_domain.init_value -> t -> t
      val enter_scope :
        Abstract_domain.variable_kind -> Cil_types.varinfo list -> t -> t
      val leave_scope :
        Cil_types.kernel_function -> Cil_types.varinfo list -> t -> t
    end
end