sig
  type expr = [ `Benum of Bddenum.t | `Bint of Bddint.t | `Bool of Bdd.t ]
  type typdef = [ `Benum of Var.t array | `Bint of bool * int ]
  type typ = [ `Benum of Var.t | `Bint of bool * int | `Bool ]
  type info = { tid : int array; var : Bddvar.expr; }
  class type ['a, 'b] db =
    object
      constraint 'a = [> Bddvar.typ ]
      constraint 'b = [> typdef ]
      val mutable v_bddincr : int
      val mutable v_bddindex : int
      val mutable v_idcondvar : Var.t MappeI.t
      val v_manager : Manager.t
      val mutable v_print_external_idcondb :
        Format.formatter -> int * bool -> unit
      val mutable v_typdef : 'Var.Map.t
      val mutable v_varinfo : Bddvar.info Var.Map.t
      val mutable v_varset : Bdd.t Var.Map.t
      val mutable v_vartyp : 'Var.Map.t
      method private add_label : Var.t -> '-> unit
      method add_typ : Var.t -> '-> unit
      method add_var : Var.t -> '-> unit
      method bddincr : int
      method bddindex : int
      method idcondvar : Var.t MappeI.t
      method manager : Manager.t
      method mem_typ : Var.t -> bool
      method mem_var : Var.t -> bool
      method print_external_idcondb : Format.formatter -> int * bool -> unit
      method print_order : Format.formatter -> unit
      method set_bddincr : int -> unit
      method set_bddindex : int -> unit
      method set_idcondvar : Var.t MappeI.t -> unit
      method set_print_external_idcondb :
        (Format.formatter -> int * bool -> unit) -> unit
      method set_typdef : 'Var.Map.t -> unit
      method set_varinfo : Bddvar.info Var.Map.t -> unit
      method set_varset : Bdd.t Var.Map.t -> unit
      method set_vartyp : 'Var.Map.t -> unit
      method typ_of_var : Var.t -> 'a
      method typdef : 'Var.Map.t
      method typdef_of_typ : Var.t -> 'b
      method var_of_idcond : int -> Var.t
      method varinfo : Bddvar.info Var.Map.t
      method varset : Bdd.t Var.Map.t
      method vartyp : 'Var.Map.t
    end
  class ['a, 'b] make_db :
    Manager.t ->
    object
      constraint 'a = [> Bddvar.typ ]
      constraint 'b = [> Bddvar.typdef ]
      val mutable v_bddincr : int
      val mutable v_bddindex : int
      val mutable v_idcondvar : Var.t MappeI.t
      val v_manager : Manager.t
      val mutable v_print_external_idcondb :
        Format.formatter -> int * bool -> unit
      val mutable v_typdef : 'Var.Map.t
      val mutable v_varinfo : info Var.Map.t
      val mutable v_varset : Bdd.t Var.Map.t
      val mutable v_vartyp : 'Var.Map.t
      method private add_label : Var.t -> '-> unit
      method add_typ : Var.t -> '-> unit
      method add_var : Var.t -> '-> unit
      method bddincr : int
      method bddindex : int
      method idcondvar : Var.t MappeI.t
      method manager : Manager.t
      method mem_typ : Var.t -> bool
      method mem_var : Var.t -> bool
      method print_external_idcondb : Format.formatter -> int * bool -> unit
      method print_order : Format.formatter -> unit
      method set_bddincr : int -> unit
      method set_bddindex : int -> unit
      method set_idcondvar : Var.t MappeI.t -> unit
      method set_print_external_idcondb :
        (Format.formatter -> int * bool -> unit) -> unit
      method set_typdef : 'Var.Map.t -> unit
      method set_varinfo : info Var.Map.t -> unit
      method set_varset : Bdd.t Var.Map.t -> unit
      method set_vartyp : 'Var.Map.t -> unit
      method typ_of_var : Var.t -> 'a
      method typdef : 'Var.Map.t
      method typdef_of_typ : Var.t -> 'b
      method var_of_idcond : int -> Var.t
      method varinfo : info Var.Map.t
      method varset : Bdd.t Var.Map.t
      method vartyp : 'Var.Map.t
    end
  val typ_of_expr : Bddvar.expr -> [> Bddvar.typ ]
  val var :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> Var.t -> Bddvar.expr
  val ite : Bdd.t -> Bddvar.expr -> Bddvar.expr -> Bddvar.expr
  val rename :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Bddvar.expr -> (Var.t * Var.t) list -> Bddvar.expr
  val substitute :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Bddvar.expr -> (Var.t * Bddvar.expr) list -> Bddvar.expr
  val exist :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Bddvar.expr -> Var.t list -> Bddvar.expr
  val forall :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Bddvar.expr -> Var.t list -> Bddvar.expr
  val cofactor : Bddvar.expr -> Bdd.t -> Bddvar.expr
  val tdrestrict : Bddvar.expr -> Bdd.t -> Bddvar.expr
  val support_cond :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> Bddvar.expr -> Bdd.t
  val vectorsupport_cond :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Bddvar.expr array -> Bdd.t
  val cube_of_bdd :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> Bdd.t -> Bdd.t
  val iter_ordered :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    (Var.t -> Bddvar.info -> unit) -> unit
  val print_db :
    Format.formatter ->
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> unit
  val print_typ : Format.formatter -> Bddvar.typ -> unit
  val print_typdef : Format.formatter -> Bddvar.typdef -> unit
  val print_expr :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Format.formatter -> Bddvar.expr -> unit
  val print_minterm :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Format.formatter -> Manager.tbool array -> unit
  val print_bdd :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Format.formatter -> Bdd.t -> unit
  val print_idd :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    (Format.formatter -> int -> unit) -> Format.formatter -> Idd.t -> unit
  val print_idcondb :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Format.formatter -> int * bool -> unit
  val print_idcond :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Format.formatter -> int -> unit
  val print_info : Format.formatter -> Bddvar.info -> unit
  val permutation_of_rename :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    (Var.t * Var.t) list -> int array
  val composition_of_substitution :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    (Var.t * Bddvar.expr) list -> Bdd.t array
  val bddsupport :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> Var.t list -> Bdd.t
  val permute : Bddvar.expr -> int array -> Bddvar.expr
  val compose : Bddvar.expr -> Bdd.t array -> Bddvar.expr
  val mem_id :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> int -> bool
  val varinfo_of_id :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    int -> Var.t * Bddvar.info
  val print_id :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
    Format.formatter -> int -> unit
  val info_of_var :
    ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db -> Var.t -> Bddvar.info
  val reg_of_expr : Bddvar.expr -> Bdd.t array
  module Expr :
    sig
      type atom =
          Tbool of Var.t * bool
        | Tint of Var.t * int list
        | Tenum of Var.t * Var.t list
      type term =
          Tatom of Bddvar.Expr.atom
        | Texternal of int * bool
        | Tcst of bool
      type conjunction = Conjunction of Bddvar.Expr.term list | Cfalse
      type disjunction = Disjunction of Bddvar.Expr.conjunction list | Dtrue
      val term_of_vint :
        Var.t -> Bddint.t -> Bddreg.Minterm.t -> Bddvar.Expr.term
      val term_of_venum :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        Var.t -> Bddenum.t -> Bddreg.Minterm.t -> Bddvar.Expr.term
      val term_of_idcondb :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        MappeI.key * bool -> Bddvar.Expr.term
      val bool_of_tbool : Manager.tbool -> bool
      val mand :
        Bddvar.Expr.term list Pervasives.ref -> Bddvar.Expr.term -> unit
      val conjunction_of_minterm :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        Manager.tbool array -> Bddvar.Expr.conjunction
      val disjunction_of_bdd :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        Bdd.t -> Bddvar.Expr.disjunction
      val print_term :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        Format.formatter -> Bddvar.Expr.term -> unit
      val print_conjunction :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        Format.formatter -> Bddvar.Expr.conjunction -> unit
      val print_disjunction :
        ([> Bddvar.typ ], [> Bddvar.typdef ]) #Bddvar.db ->
        Format.formatter -> Bddvar.Expr.disjunction -> unit
    end
end