sig
  type vdd = bool Cudd.Vdd.t
  val vdd_of_bdd : Cudd.Bdd.vt -> bool Cudd.Vdd.t
  val bdd_of_vdd : bool Cudd.Vdd.t -> Cudd.Bdd.vt
  type typ = Bool | Cond | Other
  type info = {
    mutable minlevelbool : int;
    mutable maxlevelbool : int;
    mutable minlevelcond : int;
    mutable maxlevelcond : int;
    varlevel : int array;
    levelvar : int array;
    vartyp : Bdd.Decompose.typ array;
    leveltyp : Bdd.Decompose.typ array;
  }
  val make_info :
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, 'i) Bdd.Cond.t -> Bdd.Decompose.info
  val split_level : Cudd.Bdd.vt -> int -> (Cudd.Bdd.vt * Cudd.Bdd.vt) list
  val splitpermutation_of_envcond :
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, 'i) Bdd.Cond.t ->
    [ `BoolCond | `CondBool ] -> int * (int array * int array) option
  val split_bdd :
    ?memo1:Cudd.Memo.t ->
    ?memo2:Cudd.Memo.t ->
    int * (int array * int array) option ->
    Cudd.Bdd.vt -> (Cudd.Bdd.vt * Cudd.Bdd.vt) list
  val cube_split :
    ('a, 'b, 'c, 'd) Bdd.Cond.t ->
    'Cudd.Bdd.t -> 'Cudd.Bdd.t * 'Cudd.Bdd.t
  val decompose_bdd_boolcond :
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, 'i) Bdd.Cond.t ->
    Cudd.Bdd.vt -> (Cudd.Bdd.vt * Cudd.Bdd.vt) list
  val decompose_bdd_condbool :
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, 'i) Bdd.Cond.t ->
    Cudd.Bdd.vt -> (Cudd.Bdd.vt * Cudd.Bdd.vt) list
  val decompose_dd_treecondbool :
    ?careset:'Cudd.Bdd.t ->
    topvar:('-> int) ->
    support:('-> 'Cudd.Bdd.t) ->
    cofactor:('-> 'Cudd.Bdd.t -> 'b) ->
    ('d, 'e, 'f, 'g, 'h) Bdd.Env.t0 ->
    ('i, 'j, 'k, 'a) Bdd.Cond.t -> '-> (int, 'b) Bdd.Normalform.tree
  val decompose_bdd_treecondbool :
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, 'i) Bdd.Cond.t ->
    'Cudd.Bdd.t -> (int, 'Cudd.Bdd.t) Bdd.Normalform.tree
  val decompose_vdd_treecondbool :
    ?careset:Cudd.Bdd.vt ->
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, Cudd.Man.v) Bdd.Cond.t ->
    'Cudd.Vdd.t -> (int, 'Cudd.Vdd.t) Bdd.Normalform.tree
  val decompose_tbdd_tvdd_treecondbool :
    ?careset:Cudd.Bdd.vt ->
    ('a, 'b, 'c, 'd, 'e) Bdd.Env.t0 ->
    ('f, 'g, 'h, Cudd.Man.v) Bdd.Cond.t ->
    Cudd.Bdd.vt array * 'Cudd.Vdd.t array ->
    (int, Cudd.Bdd.vt array * 'Cudd.Vdd.t array) Bdd.Normalform.tree
  val conjunction_of_minterm :
    ?first:int ->
    ?last:int ->
    (int * bool -> 'a) ->
    Cudd.Man.tbool array -> 'Bdd.Normalform.conjunction
  val dnf_of_bdd :
    ?first:int ->
    ?last:int -> (int * bool -> 'a) -> 'Cudd.Bdd.t -> 'Bdd.Normalform.dnf
  val descend :
    cudd:'Cudd.Man.t ->
    maxdepth:int ->
    nocare:('-> bool) ->
    cube_of_down:('-> 'Cudd.Bdd.t) ->
    cofactor:('-> 'Cudd.Bdd.t -> 'a) ->
    select:('-> int) ->
    terminal:(depth:int ->
              newcube:'Cudd.Bdd.t ->
              cube:'Cudd.Bdd.t -> down:'-> 'b option) ->
    ite:(depth:int ->
         newcube:'Cudd.Bdd.t ->
         cond:int -> dthen:'b option -> delse:'b option -> 'b option) ->
    down:'-> 'b option
  val select_cond : 'Cudd.Bdd.t -> int
  val select_cond_bdd : ('a, 'b, 'c, 'd) Bdd.Cond.t -> 'Cudd.Bdd.t -> int
  val bdd_support_cond :
    ('a, 'b, 'c, 'd) Bdd.Cond.t -> 'Cudd.Bdd.t -> 'Cudd.Bdd.t
  val vdd_support_cond :
    ('a, 'b, 'c, Cudd.Man.v) Bdd.Cond.t -> 'Cudd.Vdd.t -> Cudd.Bdd.vt
  val tbdd_tvdd_support_cond :
    ('a, 'b, 'c, Cudd.Man.v) Bdd.Cond.t ->
    Cudd.Bdd.vt array * 'Cudd.Vdd.t array -> Cudd.Bdd.vt
  val tbdd_tvdd_cofactor :
    Cudd.Bdd.vt array * 'Cudd.Vdd.t array ->
    Cudd.Bdd.vt -> Cudd.Bdd.vt array * 'Cudd.Vdd.t array
end