diff options
Diffstat (limited to 'src/bdd/cudd/cuddAddApply.c')
-rw-r--r-- | src/bdd/cudd/cuddAddApply.c | 271 |
1 files changed, 149 insertions, 122 deletions
diff --git a/src/bdd/cudd/cuddAddApply.c b/src/bdd/cudd/cuddAddApply.c index 5bdc5773..7bea5871 100644 --- a/src/bdd/cudd/cuddAddApply.c +++ b/src/bdd/cudd/cuddAddApply.c @@ -7,47 +7,75 @@ Synopsis [Apply functions for ADDs and their operators.] Description [External procedures included in this module: - <ul> - <li> Cudd_addApply() - <li> Cudd_addMonadicApply() - <li> Cudd_addPlus() - <li> Cudd_addTimes() - <li> Cudd_addThreshold() - <li> Cudd_addSetNZ() - <li> Cudd_addDivide() - <li> Cudd_addMinus() - <li> Cudd_addMinimum() - <li> Cudd_addMaximum() - <li> Cudd_addOneZeroMaximum() - <li> Cudd_addDiff() - <li> Cudd_addAgreement() - <li> Cudd_addOr() - <li> Cudd_addNand() - <li> Cudd_addNor() - <li> Cudd_addXor() - <li> Cudd_addXnor() - </ul> - Internal procedures included in this module: - <ul> - <li> cuddAddApplyRecur() - <li> cuddAddMonadicApplyRecur() - </ul>] + <ul> + <li> Cudd_addApply() + <li> Cudd_addMonadicApply() + <li> Cudd_addPlus() + <li> Cudd_addTimes() + <li> Cudd_addThreshold() + <li> Cudd_addSetNZ() + <li> Cudd_addDivide() + <li> Cudd_addMinus() + <li> Cudd_addMinimum() + <li> Cudd_addMaximum() + <li> Cudd_addOneZeroMaximum() + <li> Cudd_addDiff() + <li> Cudd_addAgreement() + <li> Cudd_addOr() + <li> Cudd_addNand() + <li> Cudd_addNor() + <li> Cudd_addXor() + <li> Cudd_addXnor() + </ul> + Internal procedures included in this module: + <ul> + <li> cuddAddApplyRecur() + <li> cuddAddMonadicApplyRecur() + </ul>] Author [Fabio Somenzi] - Copyright [This file was created at the University of Colorado at Boulder. - The University of Colorado at Boulder makes no warranty about the - suitability of this software for any purpose. It is presented on an - AS IS basis.] + Copyright [Copyright (c) 1995-2004, Regents of the University of Colorado + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + Neither the name of the University of Colorado nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE.] ******************************************************************************/ -#include "util_hack.h" -#include "cuddInt.h" +#include "util_hack.h" +#include "cuddInt.h" ABC_NAMESPACE_IMPL_START + /*---------------------------------------------------------------------------*/ /* Constant declarations */ /*---------------------------------------------------------------------------*/ @@ -68,7 +96,7 @@ ABC_NAMESPACE_IMPL_START /*---------------------------------------------------------------------------*/ #ifndef lint -static char rcsid[] DD_UNUSED = "$Id: cuddAddApply.c,v 1.1.1.1 2003/02/24 22:23:50 wjiang Exp $"; +static char rcsid[] DD_UNUSED = "$Id: cuddAddApply.c,v 1.18 2009/02/19 16:15:26 fabio Exp $"; #endif @@ -109,15 +137,15 @@ static char rcsid[] DD_UNUSED = "$Id: cuddAddApply.c,v 1.1.1.1 2003/02/24 22:23: DdNode * Cudd_addApply( DdManager * dd, - DdNode * (*op)(DdManager *, DdNode **, DdNode **), + DD_AOP op, DdNode * f, DdNode * g) { DdNode *res; do { - dd->reordered = 0; - res = cuddAddApplyRecur(dd,op,f,g); + dd->reordered = 0; + res = cuddAddApplyRecur(dd,op,f,g); } while (dd->reordered == 1); return(res); @@ -150,13 +178,13 @@ Cudd_addPlus( if (F == DD_ZERO(dd)) return(G); if (G == DD_ZERO(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { - value = cuddV(F)+cuddV(G); - res = cuddUniqueConst(dd,value); - return(res); + value = cuddV(F)+cuddV(G); + res = cuddUniqueConst(dd,value); + return(res); } if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -191,13 +219,13 @@ Cudd_addTimes( if (F == DD_ONE(dd)) return(G); if (G == DD_ONE(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { - value = cuddV(F)*cuddV(G); - res = cuddUniqueConst(dd,value); - return(res); + value = cuddV(F)*cuddV(G); + res = cuddUniqueConst(dd,value); + return(res); } if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -227,11 +255,11 @@ Cudd_addThreshold( F = *f; G = *g; if (F == G || F == DD_PLUS_INFINITY(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { - if (cuddV(F) >= cuddV(G)) { - return(F); - } else { - return(DD_ZERO(dd)); - } + if (cuddV(F) >= cuddV(G)) { + return(F); + } else { + return(DD_ZERO(dd)); + } } return(NULL); @@ -296,9 +324,9 @@ Cudd_addDivide( if (F == DD_ZERO(dd)) return(DD_ZERO(dd)); if (G == DD_ONE(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { - value = cuddV(F)/cuddV(G); - res = cuddUniqueConst(dd,value); - return(res); + value = cuddV(F)/cuddV(G); + res = cuddUniqueConst(dd,value); + return(res); } return(NULL); @@ -332,9 +360,9 @@ Cudd_addMinus( if (F == DD_ZERO(dd)) return(cuddAddNegateRecur(dd,G)); if (G == DD_ZERO(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { - value = cuddV(F)-cuddV(G); - res = cuddUniqueConst(dd,value); - return(res); + value = cuddV(F)-cuddV(G); + res = cuddUniqueConst(dd,value); + return(res); } return(NULL); @@ -371,15 +399,15 @@ Cudd_addMinimum( if (G == DD_MINUS_INFINITY(dd)) return(G); #endif if (cuddIsConstant(F) && cuddIsConstant(G)) { - if (cuddV(F) <= cuddV(G)) { - return(F); - } else { - return(G); - } + if (cuddV(F) <= cuddV(G)) { + return(F); + } else { + return(G); + } } if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -416,15 +444,15 @@ Cudd_addMaximum( if (G == DD_PLUS_INFINITY(dd)) return(G); #endif if (cuddIsConstant(F) && cuddIsConstant(G)) { - if (cuddV(F) >= cuddV(G)) { - return(F); - } else { - return(G); - } + if (cuddV(F) >= cuddV(G)) { + return(F); + } else { + return(G); + } } if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -453,13 +481,13 @@ Cudd_addOneZeroMaximum( if (*f == *g) return(DD_ZERO(dd)); if (*g == DD_PLUS_INFINITY(dd)) - return DD_ZERO(dd); + return DD_ZERO(dd); if (cuddIsConstant(*f) && cuddIsConstant(*g)) { - if (cuddV(*f) > cuddV(*g)) { - return(DD_ONE(dd)); - } else { - return(DD_ZERO(dd)); - } + if (cuddV(*f) > cuddV(*g)) { + return(DD_ONE(dd)); + } else { + return(DD_ZERO(dd)); + } } return(NULL); @@ -492,15 +520,15 @@ Cudd_addDiff( if (F == DD_PLUS_INFINITY(dd)) return(G); if (G == DD_PLUS_INFINITY(dd)) return(F); if (cuddIsConstant(F) && cuddIsConstant(G)) { - if (cuddV(F) != cuddV(G)) { + if (cuddV(F) != cuddV(G)) { if (cuddV(F) < cuddV(G)) { return(F); } else { return(G); } - } else { - return(DD_PLUS_INFINITY(dd)); - } + } else { + return(DD_PLUS_INFINITY(dd)); + } } return(NULL); @@ -563,8 +591,8 @@ Cudd_addOr( if (cuddIsConstant(G)) return(F); if (F == G) return(F); if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -595,8 +623,8 @@ Cudd_addNand( if (F == DD_ZERO(dd) || G == DD_ZERO(dd)) return(DD_ONE(dd)); if (cuddIsConstant(F) && cuddIsConstant(G)) return(DD_ZERO(dd)); if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -627,8 +655,8 @@ Cudd_addNor( if (F == DD_ONE(dd) || G == DD_ONE(dd)) return(DD_ZERO(dd)); if (cuddIsConstant(F) && cuddIsConstant(G)) return(DD_ONE(dd)); if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -661,8 +689,8 @@ Cudd_addXor( if (G == DD_ONE(dd) && F == DD_ZERO(dd)) return(DD_ONE(dd)); if (cuddIsConstant(F) && cuddIsConstant(G)) return(DD_ZERO(dd)); if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -695,8 +723,8 @@ Cudd_addXnor( if (G == DD_ZERO(dd) && F == DD_ZERO(dd)) return(DD_ONE(dd)); if (cuddIsConstant(F) && cuddIsConstant(G)) return(DD_ZERO(dd)); if (F > G) { /* swap f and g */ - *f = G; - *g = F; + *f = G; + *g = F; } return(NULL); @@ -718,14 +746,14 @@ Cudd_addXnor( DdNode * Cudd_addMonadicApply( DdManager * dd, - DdNode * (*op)(DdManager *, DdNode *), + DD_MAOP op, DdNode * f) { DdNode *res; do { - dd->reordered = 0; - res = cuddAddMonadicApplyRecur(dd,op,f); + dd->reordered = 0; + res = cuddAddMonadicApplyRecur(dd,op,f); } while (dd->reordered == 1); return(res); @@ -751,9 +779,9 @@ Cudd_addLog( DdNode * f) { if (cuddIsConstant(f)) { - CUDD_VALUE_TYPE value = log(cuddV(f)); - DdNode *res = cuddUniqueConst(dd,value); - return(res); + CUDD_VALUE_TYPE value = log(cuddV(f)); + DdNode *res = cuddUniqueConst(dd,value); + return(res); } return(NULL); @@ -780,16 +808,16 @@ Cudd_addLog( DdNode * cuddAddApplyRecur( DdManager * dd, - DdNode * (*op)(DdManager *, DdNode **, DdNode **), + DD_AOP op, DdNode * f, DdNode * g) { DdNode *res, - *fv, *fvn, *gv, *gvn, - *T, *E; + *fv, *fvn, *gv, *gvn, + *T, *E; unsigned int ford, gord; unsigned int index; - DdNode *(*cacheOp)(DdManager *, DdNode *, DdNode *); + DD_CTFP cacheOp; /* Check terminal cases. Op may swap f and g to increase the * cache hit rate. @@ -799,7 +827,7 @@ cuddAddApplyRecur( if (res != NULL) return(res); /* Check cache. */ - cacheOp = (DdNode *(*)(DdManager *, DdNode *, DdNode *)) op; + cacheOp = (DD_CTFP) op; res = cuddCacheLookup2(dd,cacheOp,f,g); if (res != NULL) return(res); @@ -807,18 +835,18 @@ cuddAddApplyRecur( ford = cuddI(dd,f->index); gord = cuddI(dd,g->index); if (ford <= gord) { - index = f->index; - fv = cuddT(f); - fvn = cuddE(f); + index = f->index; + fv = cuddT(f); + fvn = cuddE(f); } else { - index = g->index; - fv = fvn = f; + index = g->index; + fv = fvn = f; } if (gord <= ford) { - gv = cuddT(g); - gvn = cuddE(g); + gv = cuddT(g); + gvn = cuddE(g); } else { - gv = gvn = g; + gv = gvn = g; } T = cuddAddApplyRecur(dd,op,fv,gv); @@ -827,16 +855,16 @@ cuddAddApplyRecur( E = cuddAddApplyRecur(dd,op,fvn,gvn); if (E == NULL) { - Cudd_RecursiveDeref(dd,T); - return(NULL); + Cudd_RecursiveDeref(dd,T); + return(NULL); } cuddRef(E); res = (T == E) ? T : cuddUniqueInter(dd,(int)index,T,E); if (res == NULL) { - Cudd_RecursiveDeref(dd, T); - Cudd_RecursiveDeref(dd, E); - return(NULL); + Cudd_RecursiveDeref(dd, T); + Cudd_RecursiveDeref(dd, E); + return(NULL); } cuddDeref(T); cuddDeref(E); @@ -864,11 +892,10 @@ cuddAddApplyRecur( DdNode * cuddAddMonadicApplyRecur( DdManager * dd, - DdNode * (*op)(DdManager *, DdNode *), + DD_MAOP op, DdNode * f) { DdNode *res, *ft, *fe, *T, *E; - unsigned int ford; unsigned int index; /* Check terminal cases. */ @@ -881,7 +908,6 @@ cuddAddMonadicApplyRecur( if (res != NULL) return(res); /* Recursive step. */ - ford = cuddI(dd,f->index); index = f->index; ft = cuddT(f); fe = cuddE(f); @@ -892,16 +918,16 @@ cuddAddMonadicApplyRecur( E = cuddAddMonadicApplyRecur(dd,op,fe); if (E == NULL) { - Cudd_RecursiveDeref(dd,T); - return(NULL); + Cudd_RecursiveDeref(dd,T); + return(NULL); } cuddRef(E); res = (T == E) ? T : cuddUniqueInter(dd,(int)index,T,E); if (res == NULL) { - Cudd_RecursiveDeref(dd, T); - Cudd_RecursiveDeref(dd, E); - return(NULL); + Cudd_RecursiveDeref(dd, T); + Cudd_RecursiveDeref(dd, E); + return(NULL); } cuddDeref(T); cuddDeref(E); @@ -918,5 +944,6 @@ cuddAddMonadicApplyRecur( /* Definition of static functions */ /*---------------------------------------------------------------------------*/ + ABC_NAMESPACE_IMPL_END |