|
|
|
@ -30,6 +30,7 @@ |
|
|
|
#include "dd_basics.h"
|
|
|
|
#include "dd_term.h"
|
|
|
|
#include "dd_export.h"
|
|
|
|
#include "dd_cudd.h"
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
@ -43,6 +44,7 @@ double threshold |
|
|
|
DdNode *tmp, *tmp2; |
|
|
|
|
|
|
|
tmp = Cudd_addBddThreshold(ddman, dd, threshold); |
|
|
|
if (tmp == NULL) return NULL; |
|
|
|
Cudd_Ref(tmp); |
|
|
|
Cudd_RecursiveDeref(ddman, dd); |
|
|
|
tmp2 = Cudd_BddToAdd(ddman, tmp); |
|
|
|
@ -64,6 +66,7 @@ double threshold |
|
|
|
DdNode *tmp, *tmp2; |
|
|
|
|
|
|
|
tmp = Cudd_addBddStrictThreshold(ddman, dd, threshold); |
|
|
|
if (tmp == NULL) return NULL; |
|
|
|
Cudd_Ref(tmp); |
|
|
|
Cudd_RecursiveDeref(ddman, dd); |
|
|
|
tmp2 = Cudd_BddToAdd(ddman, tmp); |
|
|
|
@ -106,7 +109,10 @@ DdNode *dd, |
|
|
|
double threshold |
|
|
|
) |
|
|
|
{ |
|
|
|
return DD_Not(ddman, DD_Threshold(ddman, dd, threshold)); |
|
|
|
DdNode* res; |
|
|
|
res = DD_Threshold(ddman, dd, threshold); |
|
|
|
if (res == NULL) return NULL; |
|
|
|
return DD_Not(ddman, res); |
|
|
|
} |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
@ -118,7 +124,10 @@ DdNode *dd, |
|
|
|
double threshold |
|
|
|
) |
|
|
|
{ |
|
|
|
return DD_Not(ddman, DD_StrictThreshold(ddman, dd, threshold)); |
|
|
|
DdNode* res; |
|
|
|
res = DD_StrictThreshold(ddman, dd, threshold); |
|
|
|
if (res == NULL) return NULL; |
|
|
|
return DD_Not(ddman, res); |
|
|
|
} |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
@ -144,14 +153,16 @@ double upper |
|
|
|
) |
|
|
|
{ |
|
|
|
DdNode *tmp, *tmp2; |
|
|
|
|
|
|
|
|
|
|
|
tmp = Cudd_addBddInterval(ddman, dd, lower, upper); |
|
|
|
if (tmp == NULL) return NULL; |
|
|
|
Cudd_Ref(tmp); |
|
|
|
Cudd_RecursiveDeref(ddman, dd); |
|
|
|
tmp2 = Cudd_BddToAdd(ddman, tmp); |
|
|
|
Cudd_Ref(tmp2); |
|
|
|
tmp2 = Cudd_BddToAdd(ddman, tmp); |
|
|
|
if (tmp2 == NULL) return NULL; |
|
|
|
Cudd_Ref(tmp2); |
|
|
|
Cudd_RecursiveDeref(ddman, tmp); |
|
|
|
|
|
|
|
|
|
|
|
return tmp2; |
|
|
|
} |
|
|
|
|
|
|
|
@ -167,6 +178,7 @@ int places |
|
|
|
DdNode *res; |
|
|
|
|
|
|
|
res = Cudd_addRoundOff(ddman, dd, places); |
|
|
|
if (res == NULL) return NULL; |
|
|
|
Cudd_Ref(res); |
|
|
|
Cudd_RecursiveDeref(ddman, dd); |
|
|
|
|
|
|
|
@ -213,7 +225,12 @@ DdManager *ddman, |
|
|
|
DdNode *dd |
|
|
|
) |
|
|
|
{ |
|
|
|
return Cudd_V(Cudd_addFindMin(ddman, dd)); |
|
|
|
DdNode *v = Cudd_addFindMin(ddman, dd); |
|
|
|
if (v == NULL) { |
|
|
|
DD_SetErrorFlag(); |
|
|
|
return 0.0; |
|
|
|
} |
|
|
|
return Cudd_V(v); |
|
|
|
} |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
@ -224,7 +241,12 @@ DdManager *ddman, |
|
|
|
DdNode *dd |
|
|
|
) |
|
|
|
{ |
|
|
|
return Cudd_V(Cudd_addFindMax(ddman, dd)); |
|
|
|
DdNode *v = Cudd_addFindMax(ddman, dd); |
|
|
|
if (v == NULL) { |
|
|
|
DD_SetErrorFlag(); |
|
|
|
return 0.0; |
|
|
|
} |
|
|
|
return Cudd_V(v); |
|
|
|
} |
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
@ -243,16 +265,19 @@ int num_vars |
|
|
|
// construct filter to get first non-zero element
|
|
|
|
ptr = dd; |
|
|
|
filter = DD_Constant(ddman, 1); |
|
|
|
if (filter == NULL) return NULL; |
|
|
|
for (i = 0; i < num_vars; i++) { |
|
|
|
next_ptr = (ptr->index > vars[i]->index) ? ptr : Cudd_E(ptr); |
|
|
|
if (next_ptr != Cudd_ReadZero(ddman)) { |
|
|
|
Cudd_Ref(vars[i]); |
|
|
|
filter = DD_And(ddman, filter, DD_Not(ddman, vars[i])); |
|
|
|
if (filter == NULL) return NULL; |
|
|
|
} |
|
|
|
else { |
|
|
|
next_ptr = (ptr->index > vars[i]->index) ? ptr : Cudd_T(ptr); |
|
|
|
Cudd_Ref(vars[i]); |
|
|
|
filter = DD_And(ddman, filter, vars[i]); |
|
|
|
if (filter == NULL) return NULL; |
|
|
|
} |
|
|
|
ptr = next_ptr; |
|
|
|
} |
|
|
|
|