sig
  type label = Var.t
  type typ = [ `Benum of Var.t ]
  type typdef = [ `Benum of Var.t array ]
  type t = { typ : Var.t; reg : Bddreg.t; }
  class type ['a, 'b] db =
    object
      constraint 'a = [> Bddenum.typ ]
      constraint 'b = [> Bddenum.typdef ]
      val v_manager : Manager.t
      val mutable v_typdef : 'Var.Map.t
      val mutable v_vartyp : 'Var.Map.t
      method private add_label : Var.t -> '-> unit
      method add_typ : Var.t -> '-> unit
      method manager : Manager.t
      method mem_typ : Var.t -> bool
      method mem_var : Var.t -> bool
      method set_typdef : '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 vartyp : 'Var.Map.t
    end
  class ['a, 'b] make_db :
    Manager.t ->
    object
      constraint 'a = [> Bddenum.typ ]
      constraint 'b = [> Bddenum.typdef ]
      val v_manager : Manager.t
      val mutable v_typdef : 'Var.Map.t
      val mutable v_vartyp : 'Var.Map.t
      method private add_label : Var.t -> '-> unit
      method add_typ : Var.t -> '-> unit
      method manager : Manager.t
      method mem_typ : Var.t -> bool
      method mem_var : Var.t -> bool
      method set_typdef : '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 vartyp : 'Var.Map.t
    end
  val of_label :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.label -> Bddenum.t
  val is_cst : Bddenum.t -> bool
  val to_code : Bddenum.t -> int
  val to_label :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.t -> Bddenum.label
  val equal_label :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.t -> Bddenum.label -> Bdd.t
  val equal :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.t -> Bddenum.t -> Bdd.t
  val ite : Bdd.t -> Bddenum.t -> Bddenum.t -> Bddenum.t
  val guard_of_label :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.t -> Bddenum.label -> Bdd.t
  val guardlabels :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.t -> (Bdd.t * Bddenum.label) list
  val print_db :
    Format.formatter ->
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db -> unit
  val print : (int -> string) -> Format.formatter -> Bddenum.t -> unit
  val print_minterm :
    (Format.formatter -> Bdd.t -> unit) ->
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Format.formatter -> Bddenum.t -> unit
  val size_of_typ :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db -> Var.t -> int
  val maxcode_of_typ :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db -> Var.t -> int
  val mem_typcode :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Var.t -> int -> bool
  val labels_of_typ :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Var.t -> Bddenum.label array
  val code_of_label :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Bddenum.label -> int
  val label_of_typcode :
    ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
    Var.t -> int -> Bddenum.label
  module Minterm :
    sig
      val iter :
        ([> Bddenum.typ ], [> Bddenum.typdef ]) #Bddenum.db ->
        Var.t -> (Bddenum.label -> unit) -> Bddreg.Minterm.t -> unit
      val map :
        ([> Bddenum.typ ] as 'a, [> Bddenum.typdef ]) #Bddenum.db ->
        Var.t -> (Bddenum.label -> 'a) -> Bddreg.Minterm.t -> 'a list
    end
end