sig
  type bnode = BIte of int * int * bool * int | BTrue
  type 'a bdd = {
    cond : int PSette.t Pervasives.ref;
    mutable bdef : (int, Bdd.Output.bnode) PMappe.t;
    bhash : ('a Cudd.Bdd.t, int) Hashhe.t;
    mutable blastid : int;
  }
  type 'a vnode = VIte of int * int * int | VCst of 'a
  type 'a vdd = {
    cond : int PSette.t Pervasives.ref;
    mutable vdef : (int, 'a Bdd.Output.vnode) PMappe.t;
    lhash : ('a, unit) PHashhe.t;
    vhash : ('a Cudd.Vdd.t, int) Hashhe.t;
    mutable vlastid : int;
  }
  type anode = AIte of int * int * int | ACst of float
  type add = {
    cond : int PSette.t Pervasives.ref;
    mutable adef : (int, Bdd.Output.anode) PMappe.t;
    mutable lset : float Sette.t;
    ahash : (Cudd.Add.t, int) Hashhe.t;
    mutable alastid : int;
  }
  val make_bdd : cond:int PSette.t Pervasives.ref -> 'a Bdd.Output.bdd
  val signid_of_bdd : 'a Bdd.Output.bdd -> 'a Cudd.Bdd.t -> bool * int
  val make_vdd :
    compare:'a Cudd.PWeakke.compare ->
    cond:int PSette.t Pervasives.ref -> 'a Bdd.Output.vdd
  val make_mtbdd :
    table:'a Cudd.Mtbdd.table ->
    cond:int PSette.t Pervasives.ref -> 'a Cudd.Mtbdd.unique Bdd.Output.vdd
  val make_mtbddc :
    table:'a Cudd.Mtbddc.table ->
    cond:int PSette.t Pervasives.ref -> 'a Cudd.Mtbddc.unique Bdd.Output.vdd
  val id_of_vdd : 'a Bdd.Output.vdd -> 'a Cudd.Vdd.t -> int
  val iter_cond_ordered :
    int PSette.t -> 'a Cudd.Man.t -> (int -> unit) -> unit
  val iter_bdef_ordered :
    'a Bdd.Output.bdd -> (int -> Bdd.Output.bnode -> unit) -> unit
  val iter_vdef_ordered :
    'a Bdd.Output.vdd -> (int -> 'a Bdd.Output.vnode -> unit) -> unit
end