diff options
Diffstat (limited to 'src/bdd/cudd/cuddAPI.c')
-rw-r--r-- | src/bdd/cudd/cuddAPI.c | 4409 |
1 files changed, 0 insertions, 4409 deletions
diff --git a/src/bdd/cudd/cuddAPI.c b/src/bdd/cudd/cuddAPI.c deleted file mode 100644 index a16b82cf..00000000 --- a/src/bdd/cudd/cuddAPI.c +++ /dev/null @@ -1,4409 +0,0 @@ -/**CFile*********************************************************************** - - FileName [cuddAPI.c] - - PackageName [cudd] - - Synopsis [Application interface functions.] - - Description [External procedures included in this module: - <ul> - <li> Cudd_addNewVar() - <li> Cudd_addNewVarAtLevel() - <li> Cudd_bddNewVar() - <li> Cudd_bddNewVarAtLevel() - <li> Cudd_addIthVar() - <li> Cudd_bddIthVar() - <li> Cudd_zddIthVar() - <li> Cudd_zddVarsFromBddVars() - <li> Cudd_addConst() - <li> Cudd_IsNonConstant() - <li> Cudd_AutodynEnable() - <li> Cudd_AutodynDisable() - <li> Cudd_ReorderingStatus() - <li> Cudd_AutodynEnableZdd() - <li> Cudd_AutodynDisableZdd() - <li> Cudd_ReorderingStatusZdd() - <li> Cudd_zddRealignmentEnabled() - <li> Cudd_zddRealignEnable() - <li> Cudd_zddRealignDisable() - <li> Cudd_bddRealignmentEnabled() - <li> Cudd_bddRealignEnable() - <li> Cudd_bddRealignDisable() - <li> Cudd_ReadOne() - <li> Cudd_ReadZddOne() - <li> Cudd_ReadZero() - <li> Cudd_ReadLogicZero() - <li> Cudd_ReadPlusInfinity() - <li> Cudd_ReadMinusInfinity() - <li> Cudd_ReadBackground() - <li> Cudd_SetBackground() - <li> Cudd_ReadCacheSlots() - <li> Cudd_ReadCacheUsedSlots() - <li> Cudd_ReadCacheLookUps() - <li> Cudd_ReadCacheHits() - <li> Cudd_ReadMinHit() - <li> Cudd_SetMinHit() - <li> Cudd_ReadLooseUpTo() - <li> Cudd_SetLooseUpTo() - <li> Cudd_ReadMaxCache() - <li> Cudd_ReadMaxCacheHard() - <li> Cudd_SetMaxCacheHard() - <li> Cudd_ReadSize() - <li> Cudd_ReadSlots() - <li> Cudd_ReadUsedSlots() - <li> Cudd_ExpectedUsedSlots() - <li> Cudd_ReadKeys() - <li> Cudd_ReadDead() - <li> Cudd_ReadMinDead() - <li> Cudd_ReadReorderings() - <li> Cudd_ReadReorderingTime() - <li> Cudd_ReadGarbageCollections() - <li> Cudd_ReadGarbageCollectionTime() - <li> Cudd_ReadNodesFreed() - <li> Cudd_ReadNodesDropped() - <li> Cudd_ReadUniqueLookUps() - <li> Cudd_ReadUniqueLinks() - <li> Cudd_ReadSiftMaxVar() - <li> Cudd_SetSiftMaxVar() - <li> Cudd_ReadMaxGrowth() - <li> Cudd_SetMaxGrowth() - <li> Cudd_ReadMaxGrowthAlternate() - <li> Cudd_SetMaxGrowthAlternate() - <li> Cudd_ReadReorderingCycle() - <li> Cudd_SetReorderingCycle() - <li> Cudd_ReadTree() - <li> Cudd_SetTree() - <li> Cudd_FreeTree() - <li> Cudd_ReadZddTree() - <li> Cudd_SetZddTree() - <li> Cudd_FreeZddTree() - <li> Cudd_NodeReadIndex() - <li> Cudd_ReadPerm() - <li> Cudd_ReadInvPerm() - <li> Cudd_ReadVars() - <li> Cudd_ReadEpsilon() - <li> Cudd_SetEpsilon() - <li> Cudd_ReadGroupCheck() - <li> Cudd_SetGroupcheck() - <li> Cudd_GarbageCollectionEnabled() - <li> Cudd_EnableGarbageCollection() - <li> Cudd_DisableGarbageCollection() - <li> Cudd_DeadAreCounted() - <li> Cudd_TurnOnCountDead() - <li> Cudd_TurnOffCountDead() - <li> Cudd_ReadRecomb() - <li> Cudd_SetRecomb() - <li> Cudd_ReadSymmviolation() - <li> Cudd_SetSymmviolation() - <li> Cudd_ReadArcviolation() - <li> Cudd_SetArcviolation() - <li> Cudd_ReadPopulationSize() - <li> Cudd_SetPopulationSize() - <li> Cudd_ReadNumberXovers() - <li> Cudd_SetNumberXovers() - <li> Cudd_ReadMemoryInUse() - <li> Cudd_PrintInfo() - <li> Cudd_ReadPeakNodeCount() - <li> Cudd_ReadPeakLiveNodeCount() - <li> Cudd_ReadNodeCount() - <li> Cudd_zddReadNodeCount() - <li> Cudd_AddHook() - <li> Cudd_RemoveHook() - <li> Cudd_IsInHook() - <li> Cudd_StdPreReordHook() - <li> Cudd_StdPostReordHook() - <li> Cudd_EnableReorderingReporting() - <li> Cudd_DisableReorderingReporting() - <li> Cudd_ReorderingReporting() - <li> Cudd_ReadErrorCode() - <li> Cudd_ClearErrorCode() - <li> Cudd_ReadStdout() - <li> Cudd_SetStdout() - <li> Cudd_ReadStderr() - <li> Cudd_SetStderr() - <li> Cudd_ReadNextReordering() - <li> Cudd_SetNextReordering() - <li> Cudd_ReadSwapSteps() - <li> Cudd_ReadMaxLive() - <li> Cudd_SetMaxLive() - <li> Cudd_ReadMaxMemory() - <li> Cudd_SetMaxMemory() - <li> Cudd_bddBindVar() - <li> Cudd_bddUnbindVar() - <li> Cudd_bddVarIsBound() - <li> Cudd_bddSetPiVar() - <li> Cudd_bddSetPsVar() - <li> Cudd_bddSetNsVar() - <li> Cudd_bddIsPiVar() - <li> Cudd_bddIsPsVar() - <li> Cudd_bddIsNsVar() - <li> Cudd_bddSetPairIndex() - <li> Cudd_bddReadPairIndex() - <li> Cudd_bddSetVarToBeGrouped() - <li> Cudd_bddSetVarHardGroup() - <li> Cudd_bddResetVarToBeGrouped() - <li> Cudd_bddIsVarToBeGrouped() - <li> Cudd_bddSetVarToBeUngrouped() - <li> Cudd_bddIsVarToBeUngrouped() - <li> Cudd_bddIsVarHardGroup() - </ul> - Static procedures included in this module: - <ul> - <li> fixVarTree() - </ul>] - - SeeAlso [] - - 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.] - -******************************************************************************/ - -#include "util_hack.h" -#include "cuddInt.h" - -/*---------------------------------------------------------------------------*/ -/* Constant declarations */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Stucture declarations */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Type declarations */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Variable declarations */ -/*---------------------------------------------------------------------------*/ - -#ifndef lint -static char rcsid[] DD_UNUSED = "$Id: cuddAPI.c,v 1.1.1.1 2003/02/24 22:23:51 wjiang Exp $"; -#endif - -/*---------------------------------------------------------------------------*/ -/* Macro declarations */ -/*---------------------------------------------------------------------------*/ - -/**AutomaticStart*************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Static function prototypes */ -/*---------------------------------------------------------------------------*/ - -static void fixVarTree ARGS((MtrNode *treenode, int *perm, int size)); -static int addMultiplicityGroups ARGS((DdManager *dd, MtrNode *treenode, int multiplicity, char *vmask, char *lmask)); - -/**AutomaticEnd***************************************************************/ - - -/*---------------------------------------------------------------------------*/ -/* Definition of exported functions */ -/*---------------------------------------------------------------------------*/ - - -/**Function******************************************************************** - - Synopsis [Returns a new ADD variable.] - - Description [Creates a new ADD variable. The new variable has an - index equal to the largest previous index plus 1. Returns a - pointer to the new variable if successful; NULL otherwise. - An ADD variable differs from a BDD variable because it points to the - arithmetic zero, instead of having a complement pointer to 1. ] - - SideEffects [None] - - SeeAlso [Cudd_bddNewVar Cudd_addIthVar Cudd_addConst - Cudd_addNewVarAtLevel] - -******************************************************************************/ -DdNode * -Cudd_addNewVar( - DdManager * dd) -{ - DdNode *res; - - if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL); - do { - dd->reordered = 0; - res = cuddUniqueInter(dd,dd->size,DD_ONE(dd),DD_ZERO(dd)); - } while (dd->reordered == 1); - - return(res); - -} /* end of Cudd_addNewVar */ - - -/**Function******************************************************************** - - Synopsis [Returns a new ADD variable at a specified level.] - - Description [Creates a new ADD variable. The new variable has an - index equal to the largest previous index plus 1 and is positioned at - the specified level in the order. Returns a pointer to the new - variable if successful; NULL otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_addNewVar Cudd_addIthVar Cudd_bddNewVarAtLevel] - -******************************************************************************/ -DdNode * -Cudd_addNewVarAtLevel( - DdManager * dd, - int level) -{ - DdNode *res; - - if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL); - if (level >= dd->size) return(Cudd_addIthVar(dd,level)); - if (!cuddInsertSubtables(dd,1,level)) return(NULL); - do { - dd->reordered = 0; - res = cuddUniqueInter(dd,dd->size - 1,DD_ONE(dd),DD_ZERO(dd)); - } while (dd->reordered == 1); - - return(res); - -} /* end of Cudd_addNewVarAtLevel */ - - -/**Function******************************************************************** - - Synopsis [Returns a new BDD variable.] - - Description [Creates a new BDD variable. The new variable has an - index equal to the largest previous index plus 1. Returns a - pointer to the new variable if successful; NULL otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_addNewVar Cudd_bddIthVar Cudd_bddNewVarAtLevel] - -******************************************************************************/ -DdNode * -Cudd_bddNewVar( - DdManager * dd) -{ - DdNode *res; - - if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL); - res = cuddUniqueInter(dd,dd->size,dd->one,Cudd_Not(dd->one)); - - return(res); - -} /* end of Cudd_bddNewVar */ - - -/**Function******************************************************************** - - Synopsis [Returns a new BDD variable at a specified level.] - - Description [Creates a new BDD variable. The new variable has an - index equal to the largest previous index plus 1 and is positioned at - the specified level in the order. Returns a pointer to the new - variable if successful; NULL otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_bddNewVar Cudd_bddIthVar Cudd_addNewVarAtLevel] - -******************************************************************************/ -DdNode * -Cudd_bddNewVarAtLevel( - DdManager * dd, - int level) -{ - DdNode *res; - - if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL); - if (level >= dd->size) return(Cudd_bddIthVar(dd,level)); - if (!cuddInsertSubtables(dd,1,level)) return(NULL); - res = dd->vars[dd->size - 1]; - - return(res); - -} /* end of Cudd_bddNewVarAtLevel */ - - -/**Function******************************************************************** - - Synopsis [Returns the ADD variable with index i.] - - Description [Retrieves the ADD variable with index i if it already - exists, or creates a new ADD variable. Returns a pointer to the - variable if successful; NULL otherwise. An ADD variable differs from - a BDD variable because it points to the arithmetic zero, instead of - having a complement pointer to 1. ] - - SideEffects [None] - - SeeAlso [Cudd_addNewVar Cudd_bddIthVar Cudd_addConst - Cudd_addNewVarAtLevel] - -******************************************************************************/ -DdNode * -Cudd_addIthVar( - DdManager * dd, - int i) -{ - DdNode *res; - - if ((unsigned int) i >= CUDD_MAXINDEX - 1) return(NULL); - do { - dd->reordered = 0; - res = cuddUniqueInter(dd,i,DD_ONE(dd),DD_ZERO(dd)); - } while (dd->reordered == 1); - - return(res); - -} /* end of Cudd_addIthVar */ - - -/**Function******************************************************************** - - Synopsis [Returns the BDD variable with index i.] - - Description [Retrieves the BDD variable with index i if it already - exists, or creates a new BDD variable. Returns a pointer to the - variable if successful; NULL otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_bddNewVar Cudd_addIthVar Cudd_bddNewVarAtLevel - Cudd_ReadVars] - -******************************************************************************/ -DdNode * -Cudd_bddIthVar( - DdManager * dd, - int i) -{ - DdNode *res; - - if ((unsigned int) i >= CUDD_MAXINDEX - 1) return(NULL); - if (i < dd->size) { - res = dd->vars[i]; - } else { - res = cuddUniqueInter(dd,i,dd->one,Cudd_Not(dd->one)); - } - - return(res); - -} /* end of Cudd_bddIthVar */ - - -/**Function******************************************************************** - - Synopsis [Returns the ZDD variable with index i.] - - Description [Retrieves the ZDD variable with index i if it already - exists, or creates a new ZDD variable. Returns a pointer to the - variable if successful; NULL otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_bddIthVar Cudd_addIthVar] - -******************************************************************************/ -DdNode * -Cudd_zddIthVar( - DdManager * dd, - int i) -{ - DdNode *res; - DdNode *zvar; - DdNode *lower; - int j; - - if ((unsigned int) i >= CUDD_MAXINDEX - 1) return(NULL); - - /* The i-th variable function has the following structure: - ** at the level corresponding to index i there is a node whose "then" - ** child points to the universe, and whose "else" child points to zero. - ** Above that level there are nodes with identical children. - */ - - /* First we build the node at the level of index i. */ - lower = (i < dd->sizeZ - 1) ? dd->univ[dd->permZ[i]+1] : DD_ONE(dd); - do { - dd->reordered = 0; - zvar = cuddUniqueInterZdd(dd, i, lower, DD_ZERO(dd)); - } while (dd->reordered == 1); - - if (zvar == NULL) - return(NULL); - cuddRef(zvar); - - /* Now we add the "filler" nodes above the level of index i. */ - for (j = dd->permZ[i] - 1; j >= 0; j--) { - do { - dd->reordered = 0; - res = cuddUniqueInterZdd(dd, dd->invpermZ[j], zvar, zvar); - } while (dd->reordered == 1); - if (res == NULL) { - Cudd_RecursiveDerefZdd(dd,zvar); - return(NULL); - } - cuddRef(res); - Cudd_RecursiveDerefZdd(dd,zvar); - zvar = res; - } - cuddDeref(zvar); - return(zvar); - -} /* end of Cudd_zddIthVar */ - - -/**Function******************************************************************** - - Synopsis [Creates one or more ZDD variables for each BDD variable.] - - Description [Creates one or more ZDD variables for each BDD - variable. If some ZDD variables already exist, only the missing - variables are created. Parameter multiplicity allows the caller to - control how many variables are created for each BDD variable in - existence. For instance, if ZDDs are used to represent covers, two - ZDD variables are required for each BDD variable. The order of the - BDD variables is transferred to the ZDD variables. If a variable - group tree exists for the BDD variables, a corresponding ZDD - variable group tree is created by expanding the BDD variable - tree. In any case, the ZDD variables derived from the same BDD - variable are merged in a ZDD variable group. If a ZDD variable group - tree exists, it is freed. Returns 1 if successful; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_bddNewVar Cudd_bddIthVar Cudd_bddNewVarAtLevel] - -******************************************************************************/ -int -Cudd_zddVarsFromBddVars( - DdManager * dd /* DD manager */, - int multiplicity /* how many ZDD variables are created for each BDD variable */) -{ - int res; - int i, j; - int allnew; - int *permutation; - - if (multiplicity < 1) return(0); - allnew = dd->sizeZ == 0; - if (dd->size * multiplicity > dd->sizeZ) { - res = cuddResizeTableZdd(dd,dd->size * multiplicity - 1); - if (res == 0) return(0); - } - /* Impose the order of the BDD variables to the ZDD variables. */ - if (allnew) { - for (i = 0; i < dd->size; i++) { - for (j = 0; j < multiplicity; j++) { - dd->permZ[i * multiplicity + j] = - dd->perm[i] * multiplicity + j; - dd->invpermZ[dd->permZ[i * multiplicity + j]] = - i * multiplicity + j; - } - } - for (i = 0; i < dd->sizeZ; i++) { - dd->univ[i]->index = dd->invpermZ[i]; - } - } else { - permutation = ALLOC(int,dd->sizeZ); - if (permutation == NULL) { - dd->errorCode = CUDD_MEMORY_OUT; - return(0); - } - for (i = 0; i < dd->size; i++) { - for (j = 0; j < multiplicity; j++) { - permutation[i * multiplicity + j] = - dd->invperm[i] * multiplicity + j; - } - } - for (i = dd->size * multiplicity; i < dd->sizeZ; i++) { - permutation[i] = i; - } - res = Cudd_zddShuffleHeap(dd, permutation); - FREE(permutation); - if (res == 0) return(0); - } - /* Copy and expand the variable group tree if it exists. */ - if (dd->treeZ != NULL) { - Cudd_FreeZddTree(dd); - } - if (dd->tree != NULL) { - dd->treeZ = Mtr_CopyTree(dd->tree, multiplicity); - if (dd->treeZ == NULL) return(0); - } else if (multiplicity > 1) { - dd->treeZ = Mtr_InitGroupTree(0, dd->sizeZ); - if (dd->treeZ == NULL) return(0); - dd->treeZ->index = dd->invpermZ[0]; - } - /* Create groups for the ZDD variables derived from the same BDD variable. - */ - if (multiplicity > 1) { - char *vmask, *lmask; - - vmask = ALLOC(char, dd->size); - if (vmask == NULL) { - dd->errorCode = CUDD_MEMORY_OUT; - return(0); - } - lmask = ALLOC(char, dd->size); - if (lmask == NULL) { - dd->errorCode = CUDD_MEMORY_OUT; - return(0); - } - for (i = 0; i < dd->size; i++) { - vmask[i] = lmask[i] = 0; - } - res = addMultiplicityGroups(dd,dd->treeZ,multiplicity,vmask,lmask); - FREE(vmask); - FREE(lmask); - if (res == 0) return(0); - } - return(1); - -} /* end of Cudd_zddVarsFromBddVars */ - - -/**Function******************************************************************** - - Synopsis [Returns the ADD for constant c.] - - Description [Retrieves the ADD for constant c if it already - exists, or creates a new ADD. Returns a pointer to the - ADD if successful; NULL otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_addNewVar Cudd_addIthVar] - -******************************************************************************/ -DdNode * -Cudd_addConst( - DdManager * dd, - CUDD_VALUE_TYPE c) -{ - return(cuddUniqueConst(dd,c)); - -} /* end of Cudd_addConst */ - - -/**Function******************************************************************** - - Synopsis [Returns 1 if a DD node is not constant.] - - Description [Returns 1 if a DD node is not constant. This function is - useful to test the results of Cudd_bddIteConstant, Cudd_addIteConstant, - Cudd_addEvalConst. These results may be a special value signifying - non-constant. In the other cases the macro Cudd_IsConstant can be used.] - - SideEffects [None] - - SeeAlso [Cudd_IsConstant Cudd_bddIteConstant Cudd_addIteConstant - Cudd_addEvalConst] - -******************************************************************************/ -int -Cudd_IsNonConstant( - DdNode *f) -{ - return(f == DD_NON_CONSTANT || !Cudd_IsConstant(f)); - -} /* end of Cudd_IsNonConstant */ - - -/**Function******************************************************************** - - Synopsis [Enables automatic dynamic reordering of BDDs and ADDs.] - - Description [Enables automatic dynamic reordering of BDDs and - ADDs. Parameter method is used to determine the method used for - reordering. If CUDD_REORDER_SAME is passed, the method is - unchanged.] - - SideEffects [None] - - SeeAlso [Cudd_AutodynDisable Cudd_ReorderingStatus - Cudd_AutodynEnableZdd] - -******************************************************************************/ -void -Cudd_AutodynEnable( - DdManager * unique, - Cudd_ReorderingType method) -{ - unique->autoDyn = 1; - if (method != CUDD_REORDER_SAME) { - unique->autoMethod = method; - } -#ifndef DD_NO_DEATH_ROW - /* If reordering is enabled, using the death row causes too many - ** invocations. Hence, we shrink the death row to just one entry. - */ - cuddClearDeathRow(unique); - unique->deathRowDepth = 1; - unique->deadMask = unique->deathRowDepth - 1; - if ((unsigned) unique->nextDead > unique->deadMask) { - unique->nextDead = 0; - } - unique->deathRow = REALLOC(DdNodePtr, unique->deathRow, - unique->deathRowDepth); -#endif - return; - -} /* end of Cudd_AutodynEnable */ - - -/**Function******************************************************************** - - Synopsis [Disables automatic dynamic reordering.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_AutodynEnable Cudd_ReorderingStatus - Cudd_AutodynDisableZdd] - -******************************************************************************/ -void -Cudd_AutodynDisable( - DdManager * unique) -{ - unique->autoDyn = 0; - return; - -} /* end of Cudd_AutodynDisable */ - - -/**Function******************************************************************** - - Synopsis [Reports the status of automatic dynamic reordering of BDDs - and ADDs.] - - Description [Reports the status of automatic dynamic reordering of - BDDs and ADDs. Parameter method is set to the reordering method - currently selected. Returns 1 if automatic reordering is enabled; 0 - otherwise.] - - SideEffects [Parameter method is set to the reordering method currently - selected.] - - SeeAlso [Cudd_AutodynEnable Cudd_AutodynDisable - Cudd_ReorderingStatusZdd] - -******************************************************************************/ -int -Cudd_ReorderingStatus( - DdManager * unique, - Cudd_ReorderingType * method) -{ - *method = unique->autoMethod; - return(unique->autoDyn); - -} /* end of Cudd_ReorderingStatus */ - - -/**Function******************************************************************** - - Synopsis [Enables automatic dynamic reordering of ZDDs.] - - Description [Enables automatic dynamic reordering of ZDDs. Parameter - method is used to determine the method used for reordering ZDDs. If - CUDD_REORDER_SAME is passed, the method is unchanged.] - - SideEffects [None] - - SeeAlso [Cudd_AutodynDisableZdd Cudd_ReorderingStatusZdd - Cudd_AutodynEnable] - -******************************************************************************/ -void -Cudd_AutodynEnableZdd( - DdManager * unique, - Cudd_ReorderingType method) -{ - unique->autoDynZ = 1; - if (method != CUDD_REORDER_SAME) { - unique->autoMethodZ = method; - } - return; - -} /* end of Cudd_AutodynEnableZdd */ - - -/**Function******************************************************************** - - Synopsis [Disables automatic dynamic reordering of ZDDs.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_AutodynEnableZdd Cudd_ReorderingStatusZdd - Cudd_AutodynDisable] - -******************************************************************************/ -void -Cudd_AutodynDisableZdd( - DdManager * unique) -{ - unique->autoDynZ = 0; - return; - -} /* end of Cudd_AutodynDisableZdd */ - - -/**Function******************************************************************** - - Synopsis [Reports the status of automatic dynamic reordering of ZDDs.] - - Description [Reports the status of automatic dynamic reordering of - ZDDs. Parameter method is set to the ZDD reordering method currently - selected. Returns 1 if automatic reordering is enabled; 0 - otherwise.] - - SideEffects [Parameter method is set to the ZDD reordering method currently - selected.] - - SeeAlso [Cudd_AutodynEnableZdd Cudd_AutodynDisableZdd - Cudd_ReorderingStatus] - -******************************************************************************/ -int -Cudd_ReorderingStatusZdd( - DdManager * unique, - Cudd_ReorderingType * method) -{ - *method = unique->autoMethodZ; - return(unique->autoDynZ); - -} /* end of Cudd_ReorderingStatusZdd */ - - -/**Function******************************************************************** - - Synopsis [Tells whether the realignment of ZDD order to BDD order is - enabled.] - - Description [Returns 1 if the realignment of ZDD order to BDD order is - enabled; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_zddRealignEnable Cudd_zddRealignDisable - Cudd_bddRealignEnable Cudd_bddRealignDisable] - -******************************************************************************/ -int -Cudd_zddRealignmentEnabled( - DdManager * unique) -{ - return(unique->realign); - -} /* end of Cudd_zddRealignmentEnabled */ - - -/**Function******************************************************************** - - Synopsis [Enables realignment of ZDD order to BDD order.] - - Description [Enables realignment of the ZDD variable order to the - BDD variable order after the BDDs and ADDs have been reordered. The - number of ZDD variables must be a multiple of the number of BDD - variables for realignment to make sense. If this condition is not met, - Cudd_ReduceHeap will return 0. Let <code>M</code> be the - ratio of the two numbers. For the purpose of realignment, the ZDD - variables from <code>M*i</code> to <code>(M+1)*i-1</code> are - reagarded as corresponding to BDD variable <code>i</code>. Realignment - is initially disabled.] - - SideEffects [None] - - SeeAlso [Cudd_ReduceHeap Cudd_zddRealignDisable - Cudd_zddRealignmentEnabled Cudd_bddRealignDisable - Cudd_bddRealignmentEnabled] - -******************************************************************************/ -void -Cudd_zddRealignEnable( - DdManager * unique) -{ - unique->realign = 1; - return; - -} /* end of Cudd_zddRealignEnable */ - - -/**Function******************************************************************** - - Synopsis [Disables realignment of ZDD order to BDD order.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_zddRealignEnable Cudd_zddRealignmentEnabled - Cudd_bddRealignEnable Cudd_bddRealignmentEnabled] - -******************************************************************************/ -void -Cudd_zddRealignDisable( - DdManager * unique) -{ - unique->realign = 0; - return; - -} /* end of Cudd_zddRealignDisable */ - - -/**Function******************************************************************** - - Synopsis [Tells whether the realignment of BDD order to ZDD order is - enabled.] - - Description [Returns 1 if the realignment of BDD order to ZDD order is - enabled; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_bddRealignEnable Cudd_bddRealignDisable - Cudd_zddRealignEnable Cudd_zddRealignDisable] - -******************************************************************************/ -int -Cudd_bddRealignmentEnabled( - DdManager * unique) -{ - return(unique->realignZ); - -} /* end of Cudd_bddRealignmentEnabled */ - - -/**Function******************************************************************** - - Synopsis [Enables realignment of BDD order to ZDD order.] - - Description [Enables realignment of the BDD variable order to the - ZDD variable order after the ZDDs have been reordered. The - number of ZDD variables must be a multiple of the number of BDD - variables for realignment to make sense. If this condition is not met, - Cudd_zddReduceHeap will return 0. Let <code>M</code> be the - ratio of the two numbers. For the purpose of realignment, the ZDD - variables from <code>M*i</code> to <code>(M+1)*i-1</code> are - reagarded as corresponding to BDD variable <code>i</code>. Realignment - is initially disabled.] - - SideEffects [None] - - SeeAlso [Cudd_zddReduceHeap Cudd_bddRealignDisable - Cudd_bddRealignmentEnabled Cudd_zddRealignDisable - Cudd_zddRealignmentEnabled] - -******************************************************************************/ -void -Cudd_bddRealignEnable( - DdManager * unique) -{ - unique->realignZ = 1; - return; - -} /* end of Cudd_bddRealignEnable */ - - -/**Function******************************************************************** - - Synopsis [Disables realignment of ZDD order to BDD order.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_bddRealignEnable Cudd_bddRealignmentEnabled - Cudd_zddRealignEnable Cudd_zddRealignmentEnabled] - -******************************************************************************/ -void -Cudd_bddRealignDisable( - DdManager * unique) -{ - unique->realignZ = 0; - return; - -} /* end of Cudd_bddRealignDisable */ - - -/**Function******************************************************************** - - Synopsis [Returns the one constant of the manager.] - - Description [Returns the one constant of the manager. The one - constant is common to ADDs and BDDs.] - - SideEffects [None] - - SeeAlso [Cudd_ReadZero Cudd_ReadLogicZero Cudd_ReadZddOne] - -******************************************************************************/ -DdNode * -Cudd_ReadOne( - DdManager * dd) -{ - return(dd->one); - -} /* end of Cudd_ReadOne */ - - -/**Function******************************************************************** - - Synopsis [Returns the ZDD for the constant 1 function.] - - Description [Returns the ZDD for the constant 1 function. - The representation of the constant 1 function as a ZDD depends on - how many variables it (nominally) depends on. The index of the - topmost variable in the support is given as argument <code>i</code>.] - - SideEffects [None] - - SeeAlso [Cudd_ReadOne] - -******************************************************************************/ -DdNode * -Cudd_ReadZddOne( - DdManager * dd, - int i) -{ - if (i < 0) - return(NULL); - return(i < dd->sizeZ ? dd->univ[i] : DD_ONE(dd)); - -} /* end of Cudd_ReadZddOne */ - - - -/**Function******************************************************************** - - Synopsis [Returns the zero constant of the manager.] - - Description [Returns the zero constant of the manager. The zero - constant is the arithmetic zero, rather than the logic zero. The - latter is the complement of the one constant.] - - SideEffects [None] - - SeeAlso [Cudd_ReadOne Cudd_ReadLogicZero] - -******************************************************************************/ -DdNode * -Cudd_ReadZero( - DdManager * dd) -{ - return(DD_ZERO(dd)); - -} /* end of Cudd_ReadZero */ - - -/**Function******************************************************************** - - Synopsis [Returns the logic zero constant of the manager.] - - Description [Returns the zero constant of the manager. The logic zero - constant is the complement of the one constant, and is distinct from - the arithmetic zero.] - - SideEffects [None] - - SeeAlso [Cudd_ReadOne Cudd_ReadZero] - -******************************************************************************/ -DdNode * -Cudd_ReadLogicZero( - DdManager * dd) -{ - return(Cudd_Not(DD_ONE(dd))); - -} /* end of Cudd_ReadLogicZero */ - - -/**Function******************************************************************** - - Synopsis [Reads the plus-infinity constant from the manager.] - - Description [] - - SideEffects [None] - -******************************************************************************/ -DdNode * -Cudd_ReadPlusInfinity( - DdManager * dd) -{ - return(dd->plusinfinity); - -} /* end of Cudd_ReadPlusInfinity */ - - -/**Function******************************************************************** - - Synopsis [Reads the minus-infinity constant from the manager.] - - Description [] - - SideEffects [None] - -******************************************************************************/ -DdNode * -Cudd_ReadMinusInfinity( - DdManager * dd) -{ - return(dd->minusinfinity); - -} /* end of Cudd_ReadMinusInfinity */ - - -/**Function******************************************************************** - - Synopsis [Reads the background constant of the manager.] - - Description [] - - SideEffects [None] - -******************************************************************************/ -DdNode * -Cudd_ReadBackground( - DdManager * dd) -{ - return(dd->background); - -} /* end of Cudd_ReadBackground */ - - -/**Function******************************************************************** - - Synopsis [Sets the background constant of the manager.] - - Description [Sets the background constant of the manager. It assumes - that the DdNode pointer bck is already referenced.] - - SideEffects [None] - -******************************************************************************/ -void -Cudd_SetBackground( - DdManager * dd, - DdNode * bck) -{ - dd->background = bck; - -} /* end of Cudd_SetBackground */ - - -/**Function******************************************************************** - - Synopsis [Reads the number of slots in the cache.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadCacheUsedSlots] - -******************************************************************************/ -unsigned int -Cudd_ReadCacheSlots( - DdManager * dd) -{ - return(dd->cacheSlots); - -} /* end of Cudd_ReadCacheSlots */ - - -/**Function******************************************************************** - - Synopsis [Reads the fraction of used slots in the cache.] - - Description [Reads the fraction of used slots in the cache. The unused - slots are those in which no valid data is stored. Garbage collection, - variable reordering, and cache resizing may cause used slots to become - unused.] - - SideEffects [None] - - SeeAlso [Cudd_ReadCacheSlots] - -******************************************************************************/ -double -Cudd_ReadCacheUsedSlots( - DdManager * dd) -{ - unsigned long used = 0; - int slots = dd->cacheSlots; - DdCache *cache = dd->cache; - int i; - - for (i = 0; i < slots; i++) { - used += cache[i].h != 0; - } - - return((double)used / (double) dd->cacheSlots); - -} /* end of Cudd_ReadCacheUsedSlots */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of cache look-ups.] - - Description [Returns the number of cache look-ups.] - - SideEffects [None] - - SeeAlso [Cudd_ReadCacheHits] - -******************************************************************************/ -double -Cudd_ReadCacheLookUps( - DdManager * dd) -{ - return(dd->cacheHits + dd->cacheMisses + - dd->totCachehits + dd->totCacheMisses); - -} /* end of Cudd_ReadCacheLookUps */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of cache hits.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadCacheLookUps] - -******************************************************************************/ -double -Cudd_ReadCacheHits( - DdManager * dd) -{ - return(dd->cacheHits + dd->totCachehits); - -} /* end of Cudd_ReadCacheHits */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of recursive calls.] - - Description [Returns the number of recursive calls if the package is - compiled with DD_COUNT defined.] - - SideEffects [None] - - SeeAlso [] - -******************************************************************************/ -double -Cudd_ReadRecursiveCalls( - DdManager * dd) -{ -#ifdef DD_COUNT - return(dd->recursiveCalls); -#else - return(-1.0); -#endif - -} /* end of Cudd_ReadRecursiveCalls */ - - - -/**Function******************************************************************** - - Synopsis [Reads the hit rate that causes resizinig of the computed - table.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetMinHit] - -******************************************************************************/ -unsigned int -Cudd_ReadMinHit( - DdManager * dd) -{ - /* Internally, the package manipulates the ratio of hits to - ** misses instead of the ratio of hits to accesses. */ - return((unsigned int) (0.5 + 100 * dd->minHit / (1 + dd->minHit))); - -} /* end of Cudd_ReadMinHit */ - - -/**Function******************************************************************** - - Synopsis [Sets the hit rate that causes resizinig of the computed - table.] - - Description [Sets the minHit parameter of the manager. This - parameter controls the resizing of the computed table. If the hit - rate is larger than the specified value, and the cache is not - already too large, then its size is doubled.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMinHit] - -******************************************************************************/ -void -Cudd_SetMinHit( - DdManager * dd, - unsigned int hr) -{ - /* Internally, the package manipulates the ratio of hits to - ** misses instead of the ratio of hits to accesses. */ - dd->minHit = (double) hr / (100.0 - (double) hr); - -} /* end of Cudd_SetMinHit */ - - -/**Function******************************************************************** - - Synopsis [Reads the looseUpTo parameter of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetLooseUpTo Cudd_ReadMinHit Cudd_ReadMinDead] - -******************************************************************************/ -unsigned int -Cudd_ReadLooseUpTo( - DdManager * dd) -{ - return(dd->looseUpTo); - -} /* end of Cudd_ReadLooseUpTo */ - - -/**Function******************************************************************** - - Synopsis [Sets the looseUpTo parameter of the manager.] - - Description [Sets the looseUpTo parameter of the manager. This - parameter of the manager controls the threshold beyond which no fast - growth of the unique table is allowed. The threshold is given as a - number of slots. If the value passed to this function is 0, the - function determines a suitable value based on the available memory.] - - SideEffects [None] - - SeeAlso [Cudd_ReadLooseUpTo Cudd_SetMinHit] - -******************************************************************************/ -void -Cudd_SetLooseUpTo( - DdManager * dd, - unsigned int lut) -{ - if (lut == 0) { - long datalimit = getSoftDataLimit(); - lut = (unsigned int) (datalimit / (sizeof(DdNode) * - DD_MAX_LOOSE_FRACTION)); - } - dd->looseUpTo = lut; - -} /* end of Cudd_SetLooseUpTo */ - - -/**Function******************************************************************** - - Synopsis [Returns the soft limit for the cache size.] - - Description [Returns the soft limit for the cache size. The soft limit] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxCache] - -******************************************************************************/ -unsigned int -Cudd_ReadMaxCache( - DdManager * dd) -{ - return(2 * dd->cacheSlots + dd->cacheSlack); - -} /* end of Cudd_ReadMaxCache */ - - -/**Function******************************************************************** - - Synopsis [Reads the maxCacheHard parameter of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetMaxCacheHard Cudd_ReadMaxCache] - -******************************************************************************/ -unsigned int -Cudd_ReadMaxCacheHard( - DdManager * dd) -{ - return(dd->maxCacheHard); - -} /* end of Cudd_ReadMaxCache */ - - -/**Function******************************************************************** - - Synopsis [Sets the maxCacheHard parameter of the manager.] - - Description [Sets the maxCacheHard parameter of the manager. The - cache cannot grow larger than maxCacheHard entries. This parameter - allows an application to control the trade-off of memory versus - speed. If the value passed to this function is 0, the function - determines a suitable maximum cache size based on the available memory.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxCacheHard Cudd_SetMaxCache] - -******************************************************************************/ -void -Cudd_SetMaxCacheHard( - DdManager * dd, - unsigned int mc) -{ - if (mc == 0) { - long datalimit = getSoftDataLimit(); - mc = (unsigned int) (datalimit / (sizeof(DdCache) * - DD_MAX_CACHE_FRACTION)); - } - dd->maxCacheHard = mc; - -} /* end of Cudd_SetMaxCacheHard */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of BDD variables in existance.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadZddSize] - -******************************************************************************/ -int -Cudd_ReadSize( - DdManager * dd) -{ - return(dd->size); - -} /* end of Cudd_ReadSize */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of ZDD variables in existance.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadSize] - -******************************************************************************/ -int -Cudd_ReadZddSize( - DdManager * dd) -{ - return(dd->sizeZ); - -} /* end of Cudd_ReadZddSize */ - - -/**Function******************************************************************** - - Synopsis [Returns the total number of slots of the unique table.] - - Description [Returns the total number of slots of the unique table. - This number ismainly for diagnostic purposes.] - - SideEffects [None] - -******************************************************************************/ -unsigned int -Cudd_ReadSlots( - DdManager * dd) -{ - return(dd->slots); - -} /* end of Cudd_ReadSlots */ - - -/**Function******************************************************************** - - Synopsis [Reads the fraction of used slots in the unique table.] - - Description [Reads the fraction of used slots in the unique - table. The unused slots are those in which no valid data is - stored. Garbage collection, variable reordering, and subtable - resizing may cause used slots to become unused.] - - SideEffects [None] - - SeeAlso [Cudd_ReadSlots] - -******************************************************************************/ -double -Cudd_ReadUsedSlots( - DdManager * dd) -{ - unsigned long used = 0; - int i, j; - int size = dd->size; - DdNodePtr *nodelist; - DdSubtable *subtable; - DdNode *node; - DdNode *sentinel = &(dd->sentinel); - - /* Scan each BDD/ADD subtable. */ - for (i = 0; i < size; i++) { - subtable = &(dd->subtables[i]); - nodelist = subtable->nodelist; - for (j = 0; (unsigned) j < subtable->slots; j++) { - node = nodelist[j]; - if (node != sentinel) { - used++; - } - } - } - - /* Scan the ZDD subtables. */ - size = dd->sizeZ; - - for (i = 0; i < size; i++) { - subtable = &(dd->subtableZ[i]); - nodelist = subtable->nodelist; - for (j = 0; (unsigned) j < subtable->slots; j++) { - node = nodelist[j]; - if (node != NULL) { - used++; - } - } - } - - /* Constant table. */ - subtable = &(dd->constants); - nodelist = subtable->nodelist; - for (j = 0; (unsigned) j < subtable->slots; j++) { - node = nodelist[j]; - if (node != NULL) { - used++; - } - } - - return((double)used / (double) dd->slots); - -} /* end of Cudd_ReadUsedSlots */ - - -/**Function******************************************************************** - - Synopsis [Computes the expected fraction of used slots in the unique - table.] - - Description [Computes the fraction of slots in the unique table that - should be in use. This expected value is based on the assumption - that the hash function distributes the keys randomly; it can be - compared with the result of Cudd_ReadUsedSlots to monitor the - performance of the unique table hash function.] - - SideEffects [None] - - SeeAlso [Cudd_ReadSlots Cudd_ReadUsedSlots] - -******************************************************************************/ -double -Cudd_ExpectedUsedSlots( - DdManager * dd) -{ - int i; - int size = dd->size; - DdSubtable *subtable; - double empty = 0.0; - - /* To each subtable we apply the corollary to Theorem 8.5 (occupancy - ** distribution) from Sedgewick and Flajolet's Analysis of Algorithms. - ** The corollary says that for a a table with M buckets and a load ratio - ** of r, the expected number of empty buckets is asymptotically given - ** by M * exp(-r). - */ - - /* Scan each BDD/ADD subtable. */ - for (i = 0; i < size; i++) { - subtable = &(dd->subtables[i]); - empty += (double) subtable->slots * - exp(-(double) subtable->keys / (double) subtable->slots); - } - - /* Scan the ZDD subtables. */ - size = dd->sizeZ; - - for (i = 0; i < size; i++) { - subtable = &(dd->subtableZ[i]); - empty += (double) subtable->slots * - exp(-(double) subtable->keys / (double) subtable->slots); - } - - /* Constant table. */ - subtable = &(dd->constants); - empty += (double) subtable->slots * - exp(-(double) subtable->keys / (double) subtable->slots); - - return(1.0 - empty / (double) dd->slots); - -} /* end of Cudd_ExpectedUsedSlots */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of nodes in the unique table.] - - Description [Returns the total number of nodes currently in the unique - table, including the dead nodes.] - - SideEffects [None] - - SeeAlso [Cudd_ReadDead] - -******************************************************************************/ -unsigned int -Cudd_ReadKeys( - DdManager * dd) -{ - return(dd->keys); - -} /* end of Cudd_ReadKeys */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of dead nodes in the unique table.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadKeys] - -******************************************************************************/ -unsigned int -Cudd_ReadDead( - DdManager * dd) -{ - return(dd->dead); - -} /* end of Cudd_ReadDead */ - - -/**Function******************************************************************** - - Synopsis [Reads the minDead parameter of the manager.] - - Description [Reads the minDead parameter of the manager. The minDead - parameter is used by the package to decide whether to collect garbage - or resize a subtable of the unique table when the subtable becomes - too full. The application can indirectly control the value of minDead - by setting the looseUpTo parameter.] - - SideEffects [None] - - SeeAlso [Cudd_ReadDead Cudd_ReadLooseUpTo Cudd_SetLooseUpTo] - -******************************************************************************/ -unsigned int -Cudd_ReadMinDead( - DdManager * dd) -{ - return(dd->minDead); - -} /* end of Cudd_ReadMinDead */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of times reordering has occurred.] - - Description [Returns the number of times reordering has occurred in the - manager. The number includes both the calls to Cudd_ReduceHeap from - the application program and those automatically performed by the - package. However, calls that do not even initiate reordering are not - counted. A call may not initiate reordering if there are fewer than - minsize live nodes in the manager, or if CUDD_REORDER_NONE is specified - as reordering method. The calls to Cudd_ShuffleHeap are not counted.] - - SideEffects [None] - - SeeAlso [Cudd_ReduceHeap Cudd_ReadReorderingTime] - -******************************************************************************/ -int -Cudd_ReadReorderings( - DdManager * dd) -{ - return(dd->reorderings); - -} /* end of Cudd_ReadReorderings */ - - -/**Function******************************************************************** - - Synopsis [Returns the time spent in reordering.] - - Description [Returns the number of milliseconds spent reordering - variables since the manager was initialized. The time spent in collecting - garbage before reordering is included.] - - SideEffects [None] - - SeeAlso [Cudd_ReadReorderings] - -******************************************************************************/ -long -Cudd_ReadReorderingTime( - DdManager * dd) -{ - return(dd->reordTime); - -} /* end of Cudd_ReadReorderingTime */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of times garbage collection has occurred.] - - Description [Returns the number of times garbage collection has - occurred in the manager. The number includes both the calls from - reordering procedures and those caused by requests to create new - nodes.] - - SideEffects [None] - - SeeAlso [Cudd_ReadGarbageCollectionTime] - -******************************************************************************/ -int -Cudd_ReadGarbageCollections( - DdManager * dd) -{ - return(dd->garbageCollections); - -} /* end of Cudd_ReadGarbageCollections */ - - -/**Function******************************************************************** - - Synopsis [Returns the time spent in garbage collection.] - - Description [Returns the number of milliseconds spent doing garbage - collection since the manager was initialized.] - - SideEffects [None] - - SeeAlso [Cudd_ReadGarbageCollections] - -******************************************************************************/ -long -Cudd_ReadGarbageCollectionTime( - DdManager * dd) -{ - return(dd->GCTime); - -} /* end of Cudd_ReadGarbageCollectionTime */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of nodes freed.] - - Description [Returns the number of nodes returned to the free list if the - keeping of this statistic is enabled; -1 otherwise. This statistic is - enabled only if the package is compiled with DD_STATS defined.] - - SideEffects [None] - - SeeAlso [Cudd_ReadNodesDropped] - -******************************************************************************/ -double -Cudd_ReadNodesFreed( - DdManager * dd) -{ -#ifdef DD_STATS - return(dd->nodesFreed); -#else - return(-1.0); -#endif - -} /* end of Cudd_ReadNodesFreed */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of nodes dropped.] - - Description [Returns the number of nodes killed by dereferencing if the - keeping of this statistic is enabled; -1 otherwise. This statistic is - enabled only if the package is compiled with DD_STATS defined.] - - SideEffects [None] - - SeeAlso [Cudd_ReadNodesFreed] - -******************************************************************************/ -double -Cudd_ReadNodesDropped( - DdManager * dd) -{ -#ifdef DD_STATS - return(dd->nodesDropped); -#else - return(-1.0); -#endif - -} /* end of Cudd_ReadNodesDropped */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of look-ups in the unique table.] - - Description [Returns the number of look-ups in the unique table if the - keeping of this statistic is enabled; -1 otherwise. This statistic is - enabled only if the package is compiled with DD_UNIQUE_PROFILE defined.] - - SideEffects [None] - - SeeAlso [Cudd_ReadUniqueLinks] - -******************************************************************************/ -double -Cudd_ReadUniqueLookUps( - DdManager * dd) -{ -#ifdef DD_UNIQUE_PROFILE - return(dd->uniqueLookUps); -#else - return(-1.0); -#endif - -} /* end of Cudd_ReadUniqueLookUps */ - - -/**Function******************************************************************** - - Synopsis [Returns the number of links followed in the unique table.] - - Description [Returns the number of links followed during look-ups in the - unique table if the keeping of this statistic is enabled; -1 otherwise. - If an item is found in the first position of its collision list, the - number of links followed is taken to be 0. If it is in second position, - the number of links is 1, and so on. This statistic is enabled only if - the package is compiled with DD_UNIQUE_PROFILE defined.] - - SideEffects [None] - - SeeAlso [Cudd_ReadUniqueLookUps] - -******************************************************************************/ -double -Cudd_ReadUniqueLinks( - DdManager * dd) -{ -#ifdef DD_UNIQUE_PROFILE - return(dd->uniqueLinks); -#else - return(-1.0); -#endif - -} /* end of Cudd_ReadUniqueLinks */ - - -/**Function******************************************************************** - - Synopsis [Reads the siftMaxVar parameter of the manager.] - - Description [Reads the siftMaxVar parameter of the manager. This - parameter gives the maximum number of variables that will be sifted - for each invocation of sifting.] - - SideEffects [None] - - SeeAlso [Cudd_ReadSiftMaxSwap Cudd_SetSiftMaxVar] - -******************************************************************************/ -int -Cudd_ReadSiftMaxVar( - DdManager * dd) -{ - return(dd->siftMaxVar); - -} /* end of Cudd_ReadSiftMaxVar */ - - -/**Function******************************************************************** - - Synopsis [Sets the siftMaxVar parameter of the manager.] - - Description [Sets the siftMaxVar parameter of the manager. This - parameter gives the maximum number of variables that will be sifted - for each invocation of sifting.] - - SideEffects [None] - - SeeAlso [Cudd_SetSiftMaxSwap Cudd_ReadSiftMaxVar] - -******************************************************************************/ -void -Cudd_SetSiftMaxVar( - DdManager * dd, - int smv) -{ - dd->siftMaxVar = smv; - -} /* end of Cudd_SetSiftMaxVar */ - - -/**Function******************************************************************** - - Synopsis [Reads the siftMaxSwap parameter of the manager.] - - Description [Reads the siftMaxSwap parameter of the manager. This - parameter gives the maximum number of swaps that will be attempted - for each invocation of sifting. The real number of swaps may exceed - the set limit because the package will always complete the sifting - of the variable that causes the limit to be reached.] - - SideEffects [None] - - SeeAlso [Cudd_ReadSiftMaxVar Cudd_SetSiftMaxSwap] - -******************************************************************************/ -int -Cudd_ReadSiftMaxSwap( - DdManager * dd) -{ - return(dd->siftMaxSwap); - -} /* end of Cudd_ReadSiftMaxSwap */ - - -/**Function******************************************************************** - - Synopsis [Sets the siftMaxSwap parameter of the manager.] - - Description [Sets the siftMaxSwap parameter of the manager. This - parameter gives the maximum number of swaps that will be attempted - for each invocation of sifting. The real number of swaps may exceed - the set limit because the package will always complete the sifting - of the variable that causes the limit to be reached.] - - SideEffects [None] - - SeeAlso [Cudd_SetSiftMaxVar Cudd_ReadSiftMaxSwap] - -******************************************************************************/ -void -Cudd_SetSiftMaxSwap( - DdManager * dd, - int sms) -{ - dd->siftMaxSwap = sms; - -} /* end of Cudd_SetSiftMaxSwap */ - - -/**Function******************************************************************** - - Synopsis [Reads the maxGrowth parameter of the manager.] - - Description [Reads the maxGrowth parameter of the manager. This - parameter determines how much the number of nodes can grow during - sifting of a variable. Overall, sifting never increases the size of - the decision diagrams. This parameter only refers to intermediate - results. A lower value will speed up sifting, possibly at the - expense of quality.] - - SideEffects [None] - - SeeAlso [Cudd_SetMaxGrowth Cudd_ReadMaxGrowthAlternate] - -******************************************************************************/ -double -Cudd_ReadMaxGrowth( - DdManager * dd) -{ - return(dd->maxGrowth); - -} /* end of Cudd_ReadMaxGrowth */ - - -/**Function******************************************************************** - - Synopsis [Sets the maxGrowth parameter of the manager.] - - Description [Sets the maxGrowth parameter of the manager. This - parameter determines how much the number of nodes can grow during - sifting of a variable. Overall, sifting never increases the size of - the decision diagrams. This parameter only refers to intermediate - results. A lower value will speed up sifting, possibly at the - expense of quality.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxGrowth Cudd_SetMaxGrowthAlternate] - -******************************************************************************/ -void -Cudd_SetMaxGrowth( - DdManager * dd, - double mg) -{ - dd->maxGrowth = mg; - -} /* end of Cudd_SetMaxGrowth */ - - -/**Function******************************************************************** - - Synopsis [Reads the maxGrowthAlt parameter of the manager.] - - Description [Reads the maxGrowthAlt parameter of the manager. This - parameter is analogous to the maxGrowth paramter, and is used every - given number of reorderings instead of maxGrowth. The number of - reorderings is set with Cudd_SetReorderingCycle. If the number of - reorderings is 0 (default) maxGrowthAlt is never used.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxGrowth Cudd_SetMaxGrowthAlternate - Cudd_SetReorderingCycle Cudd_ReadReorderingCycle] - -******************************************************************************/ -double -Cudd_ReadMaxGrowthAlternate( - DdManager * dd) -{ - return(dd->maxGrowthAlt); - -} /* end of Cudd_ReadMaxGrowthAlternate */ - - -/**Function******************************************************************** - - Synopsis [Sets the maxGrowthAlt parameter of the manager.] - - Description [Sets the maxGrowthAlt parameter of the manager. This - parameter is analogous to the maxGrowth paramter, and is used every - given number of reorderings instead of maxGrowth. The number of - reorderings is set with Cudd_SetReorderingCycle. If the number of - reorderings is 0 (default) maxGrowthAlt is never used.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxGrowthAlternate Cudd_SetMaxGrowth - Cudd_SetReorderingCycle Cudd_ReadReorderingCycle] - -******************************************************************************/ -void -Cudd_SetMaxGrowthAlternate( - DdManager * dd, - double mg) -{ - dd->maxGrowthAlt = mg; - -} /* end of Cudd_SetMaxGrowthAlternate */ - - -/**Function******************************************************************** - - Synopsis [Reads the reordCycle parameter of the manager.] - - Description [Reads the reordCycle parameter of the manager. This - parameter determines how often the alternate threshold on maximum - growth is used in reordering.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxGrowthAlternate Cudd_SetMaxGrowthAlternate - Cudd_SetReorderingCycle] - -******************************************************************************/ -int -Cudd_ReadReorderingCycle( - DdManager * dd) -{ - return(dd->reordCycle); - -} /* end of Cudd_ReadReorderingCycle */ - - -/**Function******************************************************************** - - Synopsis [Sets the reordCycle parameter of the manager.] - - Description [Sets the reordCycle parameter of the manager. This - parameter determines how often the alternate threshold on maximum - growth is used in reordering.] - - SideEffects [None] - - SeeAlso [Cudd_ReadMaxGrowthAlternate Cudd_SetMaxGrowthAlternate - Cudd_ReadReorderingCycle] - -******************************************************************************/ -void -Cudd_SetReorderingCycle( - DdManager * dd, - int cycle) -{ - dd->reordCycle = cycle; - -} /* end of Cudd_SetReorderingCycle */ - - -/**Function******************************************************************** - - Synopsis [Returns the variable group tree of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetTree Cudd_FreeTree Cudd_ReadZddTree] - -******************************************************************************/ -MtrNode * -Cudd_ReadTree( - DdManager * dd) -{ - return(dd->tree); - -} /* end of Cudd_ReadTree */ - - -/**Function******************************************************************** - - Synopsis [Sets the variable group tree of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_FreeTree Cudd_ReadTree Cudd_SetZddTree] - -******************************************************************************/ -void -Cudd_SetTree( - DdManager * dd, - MtrNode * tree) -{ - if (dd->tree != NULL) { - Mtr_FreeTree(dd->tree); - } - dd->tree = tree; - if (tree == NULL) return; - - fixVarTree(tree, dd->perm, dd->size); - return; - -} /* end of Cudd_SetTree */ - - -/**Function******************************************************************** - - Synopsis [Frees the variable group tree of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetTree Cudd_ReadTree Cudd_FreeZddTree] - -******************************************************************************/ -void -Cudd_FreeTree( - DdManager * dd) -{ - if (dd->tree != NULL) { - Mtr_FreeTree(dd->tree); - dd->tree = NULL; - } - return; - -} /* end of Cudd_FreeTree */ - - -/**Function******************************************************************** - - Synopsis [Returns the variable group tree of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetZddTree Cudd_FreeZddTree Cudd_ReadTree] - -******************************************************************************/ -MtrNode * -Cudd_ReadZddTree( - DdManager * dd) -{ - return(dd->treeZ); - -} /* end of Cudd_ReadZddTree */ - - -/**Function******************************************************************** - - Synopsis [Sets the ZDD variable group tree of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_FreeZddTree Cudd_ReadZddTree Cudd_SetTree] - -******************************************************************************/ -void -Cudd_SetZddTree( - DdManager * dd, - MtrNode * tree) -{ - if (dd->treeZ != NULL) { - Mtr_FreeTree(dd->treeZ); - } - dd->treeZ = tree; - if (tree == NULL) return; - - fixVarTree(tree, dd->permZ, dd->sizeZ); - return; - -} /* end of Cudd_SetZddTree */ - - -/**Function******************************************************************** - - Synopsis [Frees the variable group tree of the manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_SetZddTree Cudd_ReadZddTree Cudd_FreeTree] - -******************************************************************************/ -void -Cudd_FreeZddTree( - DdManager * dd) -{ - if (dd->treeZ != NULL) { - Mtr_FreeTree(dd->treeZ); - dd->treeZ = NULL; - } - return; - -} /* end of Cudd_FreeZddTree */ - - -/**Function******************************************************************** - - Synopsis [Returns the index of the node.] - - Description [Returns the index of the node. The node pointer can be - either regular or complemented.] - - SideEffects [None] - - SeeAlso [Cudd_ReadIndex] - -******************************************************************************/ -unsigned int -Cudd_NodeReadIndex( - DdNode * node) -{ - return((unsigned int) Cudd_Regular(node)->index); - -} /* end of Cudd_NodeReadIndex */ - - -/**Function******************************************************************** - - Synopsis [Returns the current position of the i-th variable in the - order.] - - Description [Returns the current position of the i-th variable in - the order. If the index is CUDD_CONST_INDEX, returns - CUDD_CONST_INDEX; otherwise, if the index is out of bounds returns - -1.] - - SideEffects [None] - - SeeAlso [Cudd_ReadInvPerm Cudd_ReadPermZdd] - -******************************************************************************/ -int -Cudd_ReadPerm( - DdManager * dd, - int i) -{ - if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX); - if (i < 0 || i >= dd->size) return(-1); - return(dd->perm[i]); - -} /* end of Cudd_ReadPerm */ - - -/**Function******************************************************************** - - Synopsis [Returns the current position of the i-th ZDD variable in the - order.] - - Description [Returns the current position of the i-th ZDD variable - in the order. If the index is CUDD_CONST_INDEX, returns - CUDD_CONST_INDEX; otherwise, if the index is out of bounds returns - -1.] - - SideEffects [None] - - SeeAlso [Cudd_ReadInvPermZdd Cudd_ReadPerm] - -******************************************************************************/ -int -Cudd_ReadPermZdd( - DdManager * dd, - int i) -{ - if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX); - if (i < 0 || i >= dd->sizeZ) return(-1); - return(dd->permZ[i]); - -} /* end of Cudd_ReadPermZdd */ - - -/**Function******************************************************************** - - Synopsis [Returns the index of the variable currently in the i-th - position of the order.] - - Description [Returns the index of the variable currently in the i-th - position of the order. If the index is CUDD_CONST_INDEX, returns - CUDD_CONST_INDEX; otherwise, if the index is out of bounds returns -1.] - - SideEffects [None] - - SeeAlso [Cudd_ReadPerm Cudd_ReadInvPermZdd] - -******************************************************************************/ -int -Cudd_ReadInvPerm( - DdManager * dd, - int i) -{ - if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX); - if (i < 0 || i >= dd->size) return(-1); - return(dd->invperm[i]); - -} /* end of Cudd_ReadInvPerm */ - - -/**Function******************************************************************** - - Synopsis [Returns the index of the ZDD variable currently in the i-th - position of the order.] - - Description [Returns the index of the ZDD variable currently in the - i-th position of the order. If the index is CUDD_CONST_INDEX, returns - CUDD_CONST_INDEX; otherwise, if the index is out of bounds returns -1.] - - SideEffects [None] - - SeeAlso [Cudd_ReadPerm Cudd_ReadInvPermZdd] - -******************************************************************************/ -int -Cudd_ReadInvPermZdd( - DdManager * dd, - int i) -{ - if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX); - if (i < 0 || i >= dd->sizeZ) return(-1); - return(dd->invpermZ[i]); - -} /* end of Cudd_ReadInvPermZdd */ - - -/**Function******************************************************************** - - Synopsis [Returns the i-th element of the vars array.] - - Description [Returns the i-th element of the vars array if it falls - within the array bounds; NULL otherwise. If i is the index of an - existing variable, this function produces the same result as - Cudd_bddIthVar. However, if the i-th var does not exist yet, - Cudd_bddIthVar will create it, whereas Cudd_ReadVars will not.] - - SideEffects [None] - - SeeAlso [Cudd_bddIthVar] - -******************************************************************************/ -DdNode * -Cudd_ReadVars( - DdManager * dd, - int i) -{ - if (i < 0 || i > dd->size) return(NULL); - return(dd->vars[i]); - -} /* end of Cudd_ReadVars */ - - -/**Function******************************************************************** - - Synopsis [Reads the epsilon parameter of the manager.] - - Description [Reads the epsilon parameter of the manager. The epsilon - parameter control the comparison between floating point numbers.] - - SideEffects [None] - - SeeAlso [Cudd_SetEpsilon] - -******************************************************************************/ -CUDD_VALUE_TYPE -Cudd_ReadEpsilon( - DdManager * dd) -{ - return(dd->epsilon); - -} /* end of Cudd_ReadEpsilon */ - - -/**Function******************************************************************** - - Synopsis [Sets the epsilon parameter of the manager to ep.] - - Description [Sets the epsilon parameter of the manager to ep. The epsilon - parameter control the comparison between floating point numbers.] - - SideEffects [None] - - SeeAlso [Cudd_ReadEpsilon] - -******************************************************************************/ -void -Cudd_SetEpsilon( - DdManager * dd, - CUDD_VALUE_TYPE ep) -{ - dd->epsilon = ep; - -} /* end of Cudd_SetEpsilon */ - - -/**Function******************************************************************** - - Synopsis [Reads the groupcheck parameter of the manager.] - - Description [Reads the groupcheck parameter of the manager. The - groupcheck parameter determines the aggregation criterion in group - sifting.] - - SideEffects [None] - - SeeAlso [Cudd_SetGroupcheck] - -******************************************************************************/ -Cudd_AggregationType -Cudd_ReadGroupcheck( - DdManager * dd) -{ - return(dd->groupcheck); - -} /* end of Cudd_ReadGroupCheck */ - - -/**Function******************************************************************** - - Synopsis [Sets the parameter groupcheck of the manager to gc.] - - Description [Sets the parameter groupcheck of the manager to gc. The - groupcheck parameter determines the aggregation criterion in group - sifting.] - - SideEffects [None] - - SeeAlso [Cudd_ReadGroupCheck] - -******************************************************************************/ -void -Cudd_SetGroupcheck( - DdManager * dd, - Cudd_AggregationType gc) -{ - dd->groupcheck = gc; - -} /* end of Cudd_SetGroupcheck */ - - -/**Function******************************************************************** - - Synopsis [Tells whether garbage collection is enabled.] - - Description [Returns 1 if garbage collection is enabled; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_EnableGarbageCollection Cudd_DisableGarbageCollection] - -******************************************************************************/ -int -Cudd_GarbageCollectionEnabled( - DdManager * dd) -{ - return(dd->gcEnabled); - -} /* end of Cudd_GarbageCollectionEnabled */ - - -/**Function******************************************************************** - - Synopsis [Enables garbage collection.] - - Description [Enables garbage collection. Garbage collection is - initially enabled. Therefore it is necessary to call this function - only if garbage collection has been explicitly disabled.] - - SideEffects [None] - - SeeAlso [Cudd_DisableGarbageCollection Cudd_GarbageCollectionEnabled] - -******************************************************************************/ -void -Cudd_EnableGarbageCollection( - DdManager * dd) -{ - dd->gcEnabled = 1; - -} /* end of Cudd_EnableGarbageCollection */ - - -/**Function******************************************************************** - - Synopsis [Disables garbage collection.] - - Description [Disables garbage collection. Garbage collection is - initially enabled. This function may be called to disable it. - However, garbage collection will still occur when a new node must be - created and no memory is left, or when garbage collection is required - for correctness. (E.g., before reordering.)] - - SideEffects [None] - - SeeAlso [Cudd_EnableGarbageCollection Cudd_GarbageCollectionEnabled] - -******************************************************************************/ -void -Cudd_DisableGarbageCollection( - DdManager * dd) -{ - dd->gcEnabled = 0; - -} /* end of Cudd_DisableGarbageCollection */ - - -/**Function******************************************************************** - - Synopsis [Tells whether dead nodes are counted towards triggering - reordering.] - - Description [Tells whether dead nodes are counted towards triggering - reordering. Returns 1 if dead nodes are counted; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_TurnOnCountDead Cudd_TurnOffCountDead] - -******************************************************************************/ -int -Cudd_DeadAreCounted( - DdManager * dd) -{ - return(dd->countDead == 0 ? 1 : 0); - -} /* end of Cudd_DeadAreCounted */ - - -/**Function******************************************************************** - - Synopsis [Causes the dead nodes to be counted towards triggering - reordering.] - - Description [Causes the dead nodes to be counted towards triggering - reordering. This causes more frequent reorderings. By default dead - nodes are not counted.] - - SideEffects [Changes the manager.] - - SeeAlso [Cudd_TurnOffCountDead Cudd_DeadAreCounted] - -******************************************************************************/ -void -Cudd_TurnOnCountDead( - DdManager * dd) -{ - dd->countDead = 0; - -} /* end of Cudd_TurnOnCountDead */ - - -/**Function******************************************************************** - - Synopsis [Causes the dead nodes not to be counted towards triggering - reordering.] - - Description [Causes the dead nodes not to be counted towards - triggering reordering. This causes less frequent reorderings. By - default dead nodes are not counted. Therefore there is no need to - call this function unless Cudd_TurnOnCountDead has been previously - called.] - - SideEffects [Changes the manager.] - - SeeAlso [Cudd_TurnOnCountDead Cudd_DeadAreCounted] - -******************************************************************************/ -void -Cudd_TurnOffCountDead( - DdManager * dd) -{ - dd->countDead = ~0; - -} /* end of Cudd_TurnOffCountDead */ - - -/**Function******************************************************************** - - Synopsis [Returns the current value of the recombination parameter used - in group sifting.] - - Description [Returns the current value of the recombination - parameter used in group sifting. A larger (positive) value makes the - aggregation of variables due to the second difference criterion more - likely. A smaller (negative) value makes aggregation less likely.] - - SideEffects [None] - - SeeAlso [Cudd_SetRecomb] - -******************************************************************************/ -int -Cudd_ReadRecomb( - DdManager * dd) -{ - return(dd->recomb); - -} /* end of Cudd_ReadRecomb */ - - -/**Function******************************************************************** - - Synopsis [Sets the value of the recombination parameter used in group - sifting.] - - Description [Sets the value of the recombination parameter used in - group sifting. A larger (positive) value makes the aggregation of - variables due to the second difference criterion more likely. A - smaller (negative) value makes aggregation less likely. The default - value is 0.] - - SideEffects [Changes the manager.] - - SeeAlso [Cudd_ReadRecomb] - -******************************************************************************/ -void -Cudd_SetRecomb( - DdManager * dd, - int recomb) -{ - dd->recomb = recomb; - -} /* end of Cudd_SetRecomb */ - - -/**Function******************************************************************** - - Synopsis [Returns the current value of the symmviolation parameter used - in group sifting.] - - Description [Returns the current value of the symmviolation - parameter. This parameter is used in group sifting to decide how - many violations to the symmetry conditions <code>f10 = f01</code> or - <code>f11 = f00</code> are tolerable when checking for aggregation - due to extended symmetry. The value should be between 0 and 100. A - small value causes fewer variables to be aggregated. The default - value is 0.] - - SideEffects [None] - - SeeAlso [Cudd_SetSymmviolation] - -******************************************************************************/ -int -Cudd_ReadSymmviolation( - DdManager * dd) -{ - return(dd->symmviolation); - -} /* end of Cudd_ReadSymmviolation */ - - -/**Function******************************************************************** - - Synopsis [Sets the value of the symmviolation parameter used - in group sifting.] - - Description [Sets the value of the symmviolation - parameter. This parameter is used in group sifting to decide how - many violations to the symmetry conditions <code>f10 = f01</code> or - <code>f11 = f00</code> are tolerable when checking for aggregation - due to extended symmetry. The value should be between 0 and 100. A - small value causes fewer variables to be aggregated. The default - value is 0.] - - SideEffects [Changes the manager.] - - SeeAlso [Cudd_ReadSymmviolation] - -******************************************************************************/ -void -Cudd_SetSymmviolation( - DdManager * dd, - int symmviolation) -{ - dd->symmviolation = symmviolation; - -} /* end of Cudd_SetSymmviolation */ - - -/**Function******************************************************************** - - Synopsis [Returns the current value of the arcviolation parameter used - in group sifting.] - - Description [Returns the current value of the arcviolation - parameter. This parameter is used in group sifting to decide how - many arcs into <code>y</code> not coming from <code>x</code> are - tolerable when checking for aggregation due to extended - symmetry. The value should be between 0 and 100. A small value - causes fewer variables to be aggregated. The default value is 0.] - - SideEffects [None] - - SeeAlso [Cudd_SetArcviolation] - -******************************************************************************/ -int -Cudd_ReadArcviolation( - DdManager * dd) -{ - return(dd->arcviolation); - -} /* end of Cudd_ReadArcviolation */ - - -/**Function******************************************************************** - - Synopsis [Sets the value of the arcviolation parameter used - in group sifting.] - - Description [Sets the value of the arcviolation - parameter. This parameter is used in group sifting to decide how - many arcs into <code>y</code> not coming from <code>x</code> are - tolerable when checking for aggregation due to extended - symmetry. The value should be between 0 and 100. A small value - causes fewer variables to be aggregated. The default value is 0.] - - SideEffects [None] - - SeeAlso [Cudd_ReadArcviolation] - -******************************************************************************/ -void -Cudd_SetArcviolation( - DdManager * dd, - int arcviolation) -{ - dd->arcviolation = arcviolation; - -} /* end of Cudd_SetArcviolation */ - - -/**Function******************************************************************** - - Synopsis [Reads the current size of the population used by the - genetic algorithm for reordering.] - - Description [Reads the current size of the population used by the - genetic algorithm for variable reordering. A larger population size will - cause the genetic algorithm to take more time, but will generally - produce better results. The default value is 0, in which case the - package uses three times the number of variables as population size, - with a maximum of 120.] - - SideEffects [None] - - SeeAlso [Cudd_SetPopulationSize] - -******************************************************************************/ -int -Cudd_ReadPopulationSize( - DdManager * dd) -{ - return(dd->populationSize); - -} /* end of Cudd_ReadPopulationSize */ - - -/**Function******************************************************************** - - Synopsis [Sets the size of the population used by the - genetic algorithm for reordering.] - - Description [Sets the size of the population used by the - genetic algorithm for variable reordering. A larger population size will - cause the genetic algorithm to take more time, but will generally - produce better results. The default value is 0, in which case the - package uses three times the number of variables as population size, - with a maximum of 120.] - - SideEffects [Changes the manager.] - - SeeAlso [Cudd_ReadPopulationSize] - -******************************************************************************/ -void -Cudd_SetPopulationSize( - DdManager * dd, - int populationSize) -{ - dd->populationSize = populationSize; - -} /* end of Cudd_SetPopulationSize */ - - -/**Function******************************************************************** - - Synopsis [Reads the current number of crossovers used by the - genetic algorithm for reordering.] - - Description [Reads the current number of crossovers used by the - genetic algorithm for variable reordering. A larger number of crossovers will - cause the genetic algorithm to take more time, but will generally - produce better results. The default value is 0, in which case the - package uses three times the number of variables as number of crossovers, - with a maximum of 60.] - - SideEffects [None] - - SeeAlso [Cudd_SetNumberXovers] - -******************************************************************************/ -int -Cudd_ReadNumberXovers( - DdManager * dd) -{ - return(dd->numberXovers); - -} /* end of Cudd_ReadNumberXovers */ - - -/**Function******************************************************************** - - Synopsis [Sets the number of crossovers used by the - genetic algorithm for reordering.] - - Description [Sets the number of crossovers used by the genetic - algorithm for variable reordering. A larger number of crossovers - will cause the genetic algorithm to take more time, but will - generally produce better results. The default value is 0, in which - case the package uses three times the number of variables as number - of crossovers, with a maximum of 60.] - - SideEffects [None] - - SeeAlso [Cudd_ReadNumberXovers] - -******************************************************************************/ -void -Cudd_SetNumberXovers( - DdManager * dd, - int numberXovers) -{ - dd->numberXovers = numberXovers; - -} /* end of Cudd_SetNumberXovers */ - -/**Function******************************************************************** - - Synopsis [Returns the memory in use by the manager measured in bytes.] - - Description [] - - SideEffects [None] - - SeeAlso [] - -******************************************************************************/ -long -Cudd_ReadMemoryInUse( - DdManager * dd) -{ - return(dd->memused); - -} /* end of Cudd_ReadMemoryInUse */ - - -/**Function******************************************************************** - - Synopsis [Prints out statistics and settings for a CUDD manager.] - - Description [Prints out statistics and settings for a CUDD manager. - Returns 1 if successful; 0 otherwise.] - - SideEffects [None] - - SeeAlso [] - -******************************************************************************/ -int -Cudd_PrintInfo( - DdManager * dd, - FILE * fp) -{ - int retval; - Cudd_ReorderingType autoMethod, autoMethodZ; - - /* Modifiable parameters. */ - retval = fprintf(fp,"**** CUDD modifiable parameters ****\n"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Hard limit for cache size: %u\n", - Cudd_ReadMaxCacheHard(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Cache hit threshold for resizing: %u%%\n", - Cudd_ReadMinHit(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Garbage collection enabled: %s\n", - Cudd_GarbageCollectionEnabled(dd) ? "yes" : "no"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Limit for fast unique table growth: %u\n", - Cudd_ReadLooseUpTo(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp, - "Maximum number of variables sifted per reordering: %d\n", - Cudd_ReadSiftMaxVar(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp, - "Maximum number of variable swaps per reordering: %d\n", - Cudd_ReadSiftMaxSwap(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Maximum growth while sifting a variable: %g\n", - Cudd_ReadMaxGrowth(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Dynamic reordering of BDDs enabled: %s\n", - Cudd_ReorderingStatus(dd,&autoMethod) ? "yes" : "no"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Default BDD reordering method: %d\n", autoMethod); - if (retval == EOF) return(0); - retval = fprintf(fp,"Dynamic reordering of ZDDs enabled: %s\n", - Cudd_ReorderingStatusZdd(dd,&autoMethodZ) ? "yes" : "no"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Default ZDD reordering method: %d\n", autoMethodZ); - if (retval == EOF) return(0); - retval = fprintf(fp,"Realignment of ZDDs to BDDs enabled: %s\n", - Cudd_zddRealignmentEnabled(dd) ? "yes" : "no"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Realignment of BDDs to ZDDs enabled: %s\n", - Cudd_bddRealignmentEnabled(dd) ? "yes" : "no"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Dead nodes counted in triggering reordering: %s\n", - Cudd_DeadAreCounted(dd) ? "yes" : "no"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Group checking criterion: %d\n", - Cudd_ReadGroupcheck(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Recombination threshold: %d\n", Cudd_ReadRecomb(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Symmetry violation threshold: %d\n", - Cudd_ReadSymmviolation(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Arc violation threshold: %d\n", - Cudd_ReadArcviolation(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"GA population size: %d\n", - Cudd_ReadPopulationSize(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of crossovers for GA: %d\n", - Cudd_ReadNumberXovers(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Next reordering threshold: %u\n", - Cudd_ReadNextReordering(dd)); - if (retval == EOF) return(0); - - /* Non-modifiable parameters. */ - retval = fprintf(fp,"**** CUDD non-modifiable parameters ****\n"); - if (retval == EOF) return(0); - retval = fprintf(fp,"Memory in use: %ld\n", Cudd_ReadMemoryInUse(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Peak number of nodes: %ld\n", - Cudd_ReadPeakNodeCount(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Peak number of live nodes: %d\n", - Cudd_ReadPeakLiveNodeCount(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of BDD variables: %d\n", dd->size); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of ZDD variables: %d\n", dd->sizeZ); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of cache entries: %u\n", dd->cacheSlots); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of cache look-ups: %.0f\n", - Cudd_ReadCacheLookUps(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of cache hits: %.0f\n", - Cudd_ReadCacheHits(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of cache insertions: %.0f\n", - dd->cacheinserts); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of cache collisions: %.0f\n", - dd->cachecollisions); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of cache deletions: %.0f\n", - dd->cachedeletions); - if (retval == EOF) return(0); - retval = cuddCacheProfile(dd,fp); - if (retval == 0) return(0); - retval = fprintf(fp,"Soft limit for cache size: %u\n", - Cudd_ReadMaxCache(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of buckets in unique table: %u\n", dd->slots); - if (retval == EOF) return(0); - retval = fprintf(fp,"Used buckets in unique table: %.2f%% (expected %.2f%%)\n", - 100.0 * Cudd_ReadUsedSlots(dd), - 100.0 * Cudd_ExpectedUsedSlots(dd)); - if (retval == EOF) return(0); -#ifdef DD_UNIQUE_PROFILE - retval = fprintf(fp,"Unique lookups: %.0f\n", dd->uniqueLookUps); - if (retval == EOF) return(0); - retval = fprintf(fp,"Unique links: %.0f (%g per lookup)\n", - dd->uniqueLinks, dd->uniqueLinks / dd->uniqueLookUps); - if (retval == EOF) return(0); -#endif - retval = fprintf(fp,"Number of BDD and ADD nodes: %u\n", dd->keys); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of ZDD nodes: %u\n", dd->keysZ); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of dead BDD and ADD nodes: %u\n", dd->dead); - if (retval == EOF) return(0); - retval = fprintf(fp,"Number of dead ZDD nodes: %u\n", dd->deadZ); - if (retval == EOF) return(0); - retval = fprintf(fp,"Total number of nodes allocated: %.0f\n", - dd->allocated); - if (retval == EOF) return(0); - retval = fprintf(fp,"Total number of nodes reclaimed: %.0f\n", - dd->reclaimed); - if (retval == EOF) return(0); -#if DD_STATS - retval = fprintf(fp,"Nodes freed: %.0f\n", dd->nodesFreed); - if (retval == EOF) return(0); - retval = fprintf(fp,"Nodes dropped: %.0f\n", dd->nodesDropped); - if (retval == EOF) return(0); -#endif -#if DD_COUNT - retval = fprintf(fp,"Number of recursive calls: %.0f\n", - Cudd_ReadRecursiveCalls(dd)); - if (retval == EOF) return(0); -#endif - retval = fprintf(fp,"Garbage collections so far: %d\n", - Cudd_ReadGarbageCollections(dd)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Time for garbage collection: %.2f sec\n", - ((double)Cudd_ReadGarbageCollectionTime(dd)/1000.0)); - if (retval == EOF) return(0); - retval = fprintf(fp,"Reorderings so far: %d\n", dd->reorderings); - if (retval == EOF) return(0); - retval = fprintf(fp,"Time for reordering: %.2f sec\n", - ((double)Cudd_ReadReorderingTime(dd)/1000.0)); - if (retval == EOF) return(0); -#if DD_COUNT - retval = fprintf(fp,"Node swaps in reordering: %.0f\n", - Cudd_ReadSwapSteps(dd)); - if (retval == EOF) return(0); -#endif - - return(1); - -} /* end of Cudd_PrintInfo */ - - -/**Function******************************************************************** - - Synopsis [Reports the peak number of nodes.] - - Description [Reports the peak number of nodes. This number includes - node on the free list. At the peak, the number of nodes on the free - list is guaranteed to be less than DD_MEM_CHUNK.] - - SideEffects [None] - - SeeAlso [Cudd_ReadNodeCount Cudd_PrintInfo] - -******************************************************************************/ -long -Cudd_ReadPeakNodeCount( - DdManager * dd) -{ - long count = 0; - DdNodePtr *scan = dd->memoryList; - - while (scan != NULL) { - count += DD_MEM_CHUNK; - scan = (DdNodePtr *) *scan; - } - return(count); - -} /* end of Cudd_ReadPeakNodeCount */ - - -/**Function******************************************************************** - - Synopsis [Reports the peak number of live nodes.] - - Description [Reports the peak number of live nodes. This count is kept - only if CUDD is compiled with DD_STATS defined. If DD_STATS is not - defined, this function returns -1.] - - SideEffects [None] - - SeeAlso [Cudd_ReadNodeCount Cudd_PrintInfo Cudd_ReadPeakNodeCount] - -******************************************************************************/ -int -Cudd_ReadPeakLiveNodeCount( - DdManager * dd) -{ - unsigned int live = dd->keys - dd->dead; - - if (live > dd->peakLiveNodes) { - dd->peakLiveNodes = live; - } - return((int)dd->peakLiveNodes); - -} /* end of Cudd_ReadPeakLiveNodeCount */ - - -/**Function******************************************************************** - - Synopsis [Reports the number of nodes in BDDs and ADDs.] - - Description [Reports the number of live nodes in BDDs and ADDs. This - number does not include the isolated projection functions and the - unused constants. These nodes that are not counted are not part of - the DDs manipulated by the application.] - - SideEffects [None] - - SeeAlso [Cudd_ReadPeakNodeCount Cudd_zddReadNodeCount] - -******************************************************************************/ -long -Cudd_ReadNodeCount( - DdManager * dd) -{ - long count; - int i; - -#ifndef DD_NO_DEATH_ROW - cuddClearDeathRow(dd); -#endif - - count = dd->keys - dd->dead; - - /* Count isolated projection functions. Their number is subtracted - ** from the node count because they are not part of the BDDs. - */ - for (i=0; i < dd->size; i++) { - if (dd->vars[i]->ref == 1) count--; - } - /* Subtract from the count the unused constants. */ - if (DD_ZERO(dd)->ref == 1) count--; - if (DD_PLUS_INFINITY(dd)->ref == 1) count--; - if (DD_MINUS_INFINITY(dd)->ref == 1) count--; - - return(count); - -} /* end of Cudd_ReadNodeCount */ - - - -/**Function******************************************************************** - - Synopsis [Reports the number of nodes in ZDDs.] - - Description [Reports the number of nodes in ZDDs. This - number always includes the two constants 1 and 0.] - - SideEffects [None] - - SeeAlso [Cudd_ReadPeakNodeCount Cudd_ReadNodeCount] - -******************************************************************************/ -long -Cudd_zddReadNodeCount( - DdManager * dd) -{ - return(dd->keysZ - dd->deadZ + 2); - -} /* end of Cudd_zddReadNodeCount */ - - -/**Function******************************************************************** - - Synopsis [Adds a function to a hook.] - - Description [Adds a function to a hook. A hook is a list of - application-provided functions called on certain occasions by the - package. Returns 1 if the function is successfully added; 2 if the - function was already in the list; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_RemoveHook] - -******************************************************************************/ -int -Cudd_AddHook( - DdManager * dd, - int (*f)(DdManager *, char *, void *) , - Cudd_HookType where) -{ - DdHook **hook, *nextHook, *newHook; - - switch (where) { - case CUDD_PRE_GC_HOOK: - hook = &(dd->preGCHook); - break; - case CUDD_POST_GC_HOOK: - hook = &(dd->postGCHook); - break; - case CUDD_PRE_REORDERING_HOOK: - hook = &(dd->preReorderingHook); - break; - case CUDD_POST_REORDERING_HOOK: - hook = &(dd->postReorderingHook); - break; - default: - return(0); - } - /* Scan the list and find whether the function is already there. - ** If so, just return. */ - nextHook = *hook; - while (nextHook != NULL) { - if (nextHook->f == f) { - return(2); - } - hook = &(nextHook->next); - nextHook = nextHook->next; - } - /* The function was not in the list. Create a new item and append it - ** to the end of the list. */ - newHook = ALLOC(DdHook,1); - if (newHook == NULL) { - dd->errorCode = CUDD_MEMORY_OUT; - return(0); - } - newHook->next = NULL; - newHook->f = f; - *hook = newHook; - return(1); - -} /* end of Cudd_AddHook */ - - -/**Function******************************************************************** - - Synopsis [Removes a function from a hook.] - - Description [Removes a function from a hook. A hook is a list of - application-provided functions called on certain occasions by the - package. Returns 1 if successful; 0 the function was not in the list.] - - SideEffects [None] - - SeeAlso [Cudd_AddHook] - -******************************************************************************/ -int -Cudd_RemoveHook( - DdManager * dd, - int (*f)(DdManager *, char *, void *) , - Cudd_HookType where) -{ - DdHook **hook, *nextHook; - - switch (where) { - case CUDD_PRE_GC_HOOK: - hook = &(dd->preGCHook); - break; - case CUDD_POST_GC_HOOK: - hook = &(dd->postGCHook); - break; - case CUDD_PRE_REORDERING_HOOK: - hook = &(dd->preReorderingHook); - break; - case CUDD_POST_REORDERING_HOOK: - hook = &(dd->postReorderingHook); - break; - default: - return(0); - } - nextHook = *hook; - while (nextHook != NULL) { - if (nextHook->f == f) { - *hook = nextHook->next; - FREE(nextHook); - return(1); - } - hook = &(nextHook->next); - nextHook = nextHook->next; - } - - return(0); - -} /* end of Cudd_RemoveHook */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a function is in a hook.] - - Description [Checks whether a function is in a hook. A hook is a list of - application-provided functions called on certain occasions by the - package. Returns 1 if the function is found; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_AddHook Cudd_RemoveHook] - -******************************************************************************/ -int -Cudd_IsInHook( - DdManager * dd, - int (*f)(DdManager *, char *, void *) , - Cudd_HookType where) -{ - DdHook *hook; - - switch (where) { - case CUDD_PRE_GC_HOOK: - hook = dd->preGCHook; - break; - case CUDD_POST_GC_HOOK: - hook = dd->postGCHook; - break; - case CUDD_PRE_REORDERING_HOOK: - hook = dd->preReorderingHook; - break; - case CUDD_POST_REORDERING_HOOK: - hook = dd->postReorderingHook; - break; - default: - return(0); - } - /* Scan the list and find whether the function is already there. */ - while (hook != NULL) { - if (hook->f == f) { - return(1); - } - hook = hook->next; - } - return(0); - -} /* end of Cudd_IsInHook */ - - -/**Function******************************************************************** - - Synopsis [Sample hook function to call before reordering.] - - Description [Sample hook function to call before reordering. - Prints on the manager's stdout reordering method and initial size. - Returns 1 if successful; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_StdPostReordHook] - -******************************************************************************/ -int -Cudd_StdPreReordHook( - DdManager *dd, - char *str, - void *data) -{ - Cudd_ReorderingType method = (Cudd_ReorderingType) (ptruint) data; - int retval; - - retval = fprintf(dd->out,"%s reordering with ", str); - if (retval == EOF) return(0); - switch (method) { - case CUDD_REORDER_SIFT_CONVERGE: - case CUDD_REORDER_SYMM_SIFT_CONV: - case CUDD_REORDER_GROUP_SIFT_CONV: - case CUDD_REORDER_WINDOW2_CONV: - case CUDD_REORDER_WINDOW3_CONV: - case CUDD_REORDER_WINDOW4_CONV: - case CUDD_REORDER_LINEAR_CONVERGE: - retval = fprintf(dd->out,"converging "); - if (retval == EOF) return(0); - break; - default: - break; - } - switch (method) { - case CUDD_REORDER_RANDOM: - case CUDD_REORDER_RANDOM_PIVOT: - retval = fprintf(dd->out,"random"); - break; - case CUDD_REORDER_SIFT: - case CUDD_REORDER_SIFT_CONVERGE: - retval = fprintf(dd->out,"sifting"); - break; - case CUDD_REORDER_SYMM_SIFT: - case CUDD_REORDER_SYMM_SIFT_CONV: - retval = fprintf(dd->out,"symmetric sifting"); - break; - case CUDD_REORDER_LAZY_SIFT: - retval = fprintf(dd->out,"lazy sifting"); - break; - case CUDD_REORDER_GROUP_SIFT: - case CUDD_REORDER_GROUP_SIFT_CONV: - retval = fprintf(dd->out,"group sifting"); - break; - case CUDD_REORDER_WINDOW2: - case CUDD_REORDER_WINDOW3: - case CUDD_REORDER_WINDOW4: - case CUDD_REORDER_WINDOW2_CONV: - case CUDD_REORDER_WINDOW3_CONV: - case CUDD_REORDER_WINDOW4_CONV: - retval = fprintf(dd->out,"window"); - break; - case CUDD_REORDER_ANNEALING: - retval = fprintf(dd->out,"annealing"); - break; - case CUDD_REORDER_GENETIC: - retval = fprintf(dd->out,"genetic"); - break; - case CUDD_REORDER_LINEAR: - case CUDD_REORDER_LINEAR_CONVERGE: - retval = fprintf(dd->out,"linear sifting"); - break; - case CUDD_REORDER_EXACT: - retval = fprintf(dd->out,"exact"); - break; - default: - return(0); - } - if (retval == EOF) return(0); - - retval = fprintf(dd->out,": from %ld to ... ", strcmp(str, "BDD") == 0 ? - Cudd_ReadNodeCount(dd) : Cudd_zddReadNodeCount(dd)); - if (retval == EOF) return(0); - fflush(dd->out); - return(1); - -} /* end of Cudd_StdPreReordHook */ - - -/**Function******************************************************************** - - Synopsis [Sample hook function to call after reordering.] - - Description [Sample hook function to call after reordering. - Prints on the manager's stdout final size and reordering time. - Returns 1 if successful; 0 otherwise.] - - SideEffects [None] - - SeeAlso [Cudd_StdPreReordHook] - -******************************************************************************/ -int -Cudd_StdPostReordHook( - DdManager *dd, - char *str, - void *data) -{ - long initialTime = (long) data; - int retval; - long finalTime = util_cpu_time(); - double totalTimeSec = (double)(finalTime - initialTime) / 1000.0; - - retval = fprintf(dd->out,"%ld nodes in %g sec\n", strcmp(str, "BDD") == 0 ? - Cudd_ReadNodeCount(dd) : Cudd_zddReadNodeCount(dd), - totalTimeSec); - if (retval == EOF) return(0); - retval = fflush(dd->out); - if (retval == EOF) return(0); - return(1); - -} /* end of Cudd_StdPostReordHook */ - - -/**Function******************************************************************** - - Synopsis [Enables reporting of reordering stats.] - - Description [Enables reporting of reordering stats. - Returns 1 if successful; 0 otherwise.] - - SideEffects [Installs functions in the pre-reordering and post-reordering - hooks.] - - SeeAlso [Cudd_DisableReorderingReporting Cudd_ReorderingReporting] - -******************************************************************************/ -int -Cudd_EnableReorderingReporting( - DdManager *dd) -{ - if (!Cudd_AddHook(dd, Cudd_StdPreReordHook, CUDD_PRE_REORDERING_HOOK)) { - return(0); - } - if (!Cudd_AddHook(dd, Cudd_StdPostReordHook, CUDD_POST_REORDERING_HOOK)) { - return(0); - } - return(1); - -} /* end of Cudd_EnableReorderingReporting */ - - -/**Function******************************************************************** - - Synopsis [Disables reporting of reordering stats.] - - Description [Disables reporting of reordering stats. - Returns 1 if successful; 0 otherwise.] - - SideEffects [Removes functions from the pre-reordering and post-reordering - hooks.] - - SeeAlso [Cudd_EnableReorderingReporting Cudd_ReorderingReporting] - -******************************************************************************/ -int -Cudd_DisableReorderingReporting( - DdManager *dd) -{ - if (!Cudd_RemoveHook(dd, Cudd_StdPreReordHook, CUDD_PRE_REORDERING_HOOK)) { - return(0); - } - if (!Cudd_RemoveHook(dd, Cudd_StdPostReordHook, CUDD_POST_REORDERING_HOOK)) { - return(0); - } - return(1); - -} /* end of Cudd_DisableReorderingReporting */ - - -/**Function******************************************************************** - - Synopsis [Returns 1 if reporting of reordering stats is enabled.] - - Description [Returns 1 if reporting of reordering stats is enabled; - 0 otherwise.] - - SideEffects [none] - - SeeAlso [Cudd_EnableReorderingReporting Cudd_DisableReorderingReporting] - -******************************************************************************/ -int -Cudd_ReorderingReporting( - DdManager *dd) -{ - return(Cudd_IsInHook(dd, Cudd_StdPreReordHook, CUDD_PRE_REORDERING_HOOK)); - -} /* end of Cudd_ReorderingReporting */ - - -/**Function******************************************************************** - - Synopsis [Returns the code of the last error.] - - Description [Returns the code of the last error. The error codes are - defined in cudd.h.] - - SideEffects [None] - - SeeAlso [Cudd_ClearErrorCode] - -******************************************************************************/ -Cudd_ErrorType -Cudd_ReadErrorCode( - DdManager *dd) -{ - return(dd->errorCode); - -} /* end of Cudd_ReadErrorCode */ - - -/**Function******************************************************************** - - Synopsis [Clear the error code of a manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadErrorCode] - -******************************************************************************/ -void -Cudd_ClearErrorCode( - DdManager *dd) -{ - dd->errorCode = CUDD_NO_ERROR; - -} /* end of Cudd_ClearErrorCode */ - - -/**Function******************************************************************** - - Synopsis [Reads the stdout of a manager.] - - Description [Reads the stdout of a manager. This is the file pointer to - which messages normally going to stdout are written. It is initialized - to stdout. Cudd_SetStdout allows the application to redirect it.] - - SideEffects [None] - - SeeAlso [Cudd_SetStdout Cudd_ReadStderr] - -******************************************************************************/ -FILE * -Cudd_ReadStdout( - DdManager *dd) -{ - return(dd->out); - -} /* end of Cudd_ReadStdout */ - - -/**Function******************************************************************** - - Synopsis [Sets the stdout of a manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadStdout Cudd_SetStderr] - -******************************************************************************/ -void -Cudd_SetStdout( - DdManager *dd, - FILE *fp) -{ - dd->out = fp; - -} /* end of Cudd_SetStdout */ - - -/**Function******************************************************************** - - Synopsis [Reads the stderr of a manager.] - - Description [Reads the stderr of a manager. This is the file pointer to - which messages normally going to stderr are written. It is initialized - to stderr. Cudd_SetStderr allows the application to redirect it.] - - SideEffects [None] - - SeeAlso [Cudd_SetStderr Cudd_ReadStdout] - -******************************************************************************/ -FILE * -Cudd_ReadStderr( - DdManager *dd) -{ - return(dd->err); - -} /* end of Cudd_ReadStderr */ - - -/**Function******************************************************************** - - Synopsis [Sets the stderr of a manager.] - - Description [] - - SideEffects [None] - - SeeAlso [Cudd_ReadStderr Cudd_SetStdout] - -******************************************************************************/ -void -Cudd_SetStderr( - DdManager *dd, - FILE *fp) -{ - dd->err = fp; - -} /* end of Cudd_SetStderr */ - - -/**Function******************************************************************** - - Synopsis [Returns the threshold for the next dynamic reordering.] - - Description [Returns the threshold for the next dynamic reordering. - The threshold is in terms of number of nodes and is in effect only - if reordering is enabled. The count does not include the dead nodes, - unless the countDead parameter of the manager has been changed from - its default setting.] - - SideEffects [None] - - SeeAlso [Cudd_SetNextReordering] - -******************************************************************************/ -unsigned int -Cudd_ReadNextReordering( - DdManager *dd) -{ - return(dd->nextDyn); - -} /* end of Cudd_ReadNextReordering */ - - -/**Function******************************************************************** - - Synopsis [Sets the threshold for the next dynamic reordering.] - - Description [Sets the threshold for the next dynamic reordering. - The threshold is in terms of number of nodes and is in effect only - if reordering is enabled. The count does not include the dead nodes, - unless the countDead parameter of the manager has been changed from - its default setting.] - - SideEffects [None] - - SeeAlso [Cudd_ReadNextReordering] - -******************************************************************************/ -void -Cudd_SetNextReordering( - DdManager *dd, - unsigned int next) -{ - dd->nextDyn = next; - -} /* end of Cudd_SetNextReordering */ - - -/**Function******************************************************************** - - Synopsis [Reads the number of elementary reordering steps.] - - Description [] - - SideEffects [none] - - SeeAlso [] - -******************************************************************************/ -double -Cudd_ReadSwapSteps( - DdManager *dd) -{ -#ifdef DD_COUNT - return(dd->swapSteps); -#else - return(-1); -#endif - -} /* end of Cudd_ReadSwapSteps */ - - -/**Function******************************************************************** - - Synopsis [Reads the maximum allowed number of live nodes.] - - Description [Reads the maximum allowed number of live nodes. When this - number is exceeded, the package returns NULL.] - - SideEffects [none] - - SeeAlso [Cudd_SetMaxLive] - -******************************************************************************/ -unsigned int -Cudd_ReadMaxLive( - DdManager *dd) -{ - return(dd->maxLive); - -} /* end of Cudd_ReadMaxLive */ - - -/**Function******************************************************************** - - Synopsis [Sets the maximum allowed number of live nodes.] - - Description [Sets the maximum allowed number of live nodes. When this - number is exceeded, the package returns NULL.] - - SideEffects [none] - - SeeAlso [Cudd_ReadMaxLive] - -******************************************************************************/ -void -Cudd_SetMaxLive( - DdManager *dd, - unsigned int maxLive) -{ - dd->maxLive = maxLive; - -} /* end of Cudd_SetMaxLive */ - - -/**Function******************************************************************** - - Synopsis [Reads the maximum allowed memory.] - - Description [Reads the maximum allowed memory. When this - number is exceeded, the package returns NULL.] - - SideEffects [none] - - SeeAlso [Cudd_SetMaxMemory] - -******************************************************************************/ -long -Cudd_ReadMaxMemory( - DdManager *dd) -{ - return(dd->maxmemhard); - -} /* end of Cudd_ReadMaxMemory */ - - -/**Function******************************************************************** - - Synopsis [Sets the maximum allowed memory.] - - Description [Sets the maximum allowed memory. When this - number is exceeded, the package returns NULL.] - - SideEffects [none] - - SeeAlso [Cudd_ReadMaxMemory] - -******************************************************************************/ -void -Cudd_SetMaxMemory( - DdManager *dd, - long maxMemory) -{ - dd->maxmemhard = maxMemory; - -} /* end of Cudd_SetMaxMemory */ - - -/**Function******************************************************************** - - Synopsis [Prevents sifting of a variable.] - - Description [This function sets a flag to prevent sifting of a - variable. Returns 1 if successful; 0 otherwise (i.e., invalid - variable index).] - - SideEffects [Changes the "bindVar" flag in DdSubtable.] - - SeeAlso [Cudd_bddUnbindVar] - -******************************************************************************/ -int -Cudd_bddBindVar( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return(0); - dd->subtables[dd->perm[index]].bindVar = 1; - return(1); - -} /* end of Cudd_bddBindVar */ - - -/**Function******************************************************************** - - Synopsis [Allows the sifting of a variable.] - - Description [This function resets the flag that prevents the sifting - of a variable. In successive variable reorderings, the variable will - NOT be skipped, that is, sifted. Initially all variables can be - sifted. It is necessary to call this function only to re-enable - sifting after a call to Cudd_bddBindVar. Returns 1 if successful; 0 - otherwise (i.e., invalid variable index).] - - SideEffects [Changes the "bindVar" flag in DdSubtable.] - - SeeAlso [Cudd_bddBindVar] - -******************************************************************************/ -int -Cudd_bddUnbindVar( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return(0); - dd->subtables[dd->perm[index]].bindVar = 0; - return(1); - -} /* end of Cudd_bddUnbindVar */ - - -/**Function******************************************************************** - - Synopsis [Tells whether a variable can be sifted.] - - Description [This function returns 1 if a variable is enabled for - sifting. Initially all variables can be sifted. This function returns - 0 only if there has been a previous call to Cudd_bddBindVar for that - variable not followed by a call to Cudd_bddUnbindVar. The function returns - 0 also in the case in which the index of the variable is out of bounds.] - - SideEffects [none] - - SeeAlso [Cudd_bddBindVar Cudd_bddUnbindVar] - -******************************************************************************/ -int -Cudd_bddVarIsBound( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return(0); - return(dd->subtables[dd->perm[index]].bindVar); - -} /* end of Cudd_bddVarIsBound */ - - -/**Function******************************************************************** - - Synopsis [Sets a variable type to primary input.] - - Description [Sets a variable type to primary input. The variable type is - used by lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetPsVar Cudd_bddSetNsVar Cudd_bddIsPiVar] - -******************************************************************************/ -int -Cudd_bddSetPiVar( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return (0); - dd->subtables[dd->perm[index]].varType = CUDD_VAR_PRIMARY_INPUT; - return(1); - -} /* end of Cudd_bddSetPiVar */ - - -/**Function******************************************************************** - - Synopsis [Sets a variable type to present state.] - - Description [Sets a variable type to present state. The variable type is - used by lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetPiVar Cudd_bddSetNsVar Cudd_bddIsPsVar] - -******************************************************************************/ -int -Cudd_bddSetPsVar( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return (0); - dd->subtables[dd->perm[index]].varType = CUDD_VAR_PRESENT_STATE; - return(1); - -} /* end of Cudd_bddSetPsVar */ - - -/**Function******************************************************************** - - Synopsis [Sets a variable type to next state.] - - Description [Sets a variable type to next state. The variable type is - used by lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetPiVar Cudd_bddSetPsVar Cudd_bddIsNsVar] - -******************************************************************************/ -int -Cudd_bddSetNsVar( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return (0); - dd->subtables[dd->perm[index]].varType = CUDD_VAR_NEXT_STATE; - return(1); - -} /* end of Cudd_bddSetNsVar */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a variable is primary input.] - - Description [Checks whether a variable is primary input. Returns 1 if - the variable's type is primary input; 0 if the variable exists but is - not a primary input; -1 if the variable does not exist.] - - SideEffects [none] - - SeeAlso [Cudd_bddSetPiVar Cudd_bddIsPsVar Cudd_bddIsNsVar] - -******************************************************************************/ -int -Cudd_bddIsPiVar( - DdManager *dd /* manager */, - int index /* variable index */) -{ - if (index >= dd->size || index < 0) return -1; - return (dd->subtables[dd->perm[index]].varType == CUDD_VAR_PRIMARY_INPUT); - -} /* end of Cudd_bddIsPiVar */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a variable is present state.] - - Description [Checks whether a variable is present state. Returns 1 if - the variable's type is present state; 0 if the variable exists but is - not a present state; -1 if the variable does not exist.] - - SideEffects [none] - - SeeAlso [Cudd_bddSetPsVar Cudd_bddIsPiVar Cudd_bddIsNsVar] - -******************************************************************************/ -int -Cudd_bddIsPsVar( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return -1; - return (dd->subtables[dd->perm[index]].varType == CUDD_VAR_PRESENT_STATE); - -} /* end of Cudd_bddIsPsVar */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a variable is next state.] - - Description [Checks whether a variable is next state. Returns 1 if - the variable's type is present state; 0 if the variable exists but is - not a present state; -1 if the variable does not exist.] - - SideEffects [none] - - SeeAlso [Cudd_bddSetNsVar Cudd_bddIsPiVar Cudd_bddIsPsVar] - -******************************************************************************/ -int -Cudd_bddIsNsVar( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return -1; - return (dd->subtables[dd->perm[index]].varType == CUDD_VAR_NEXT_STATE); - -} /* end of Cudd_bddIsNsVar */ - - -/**Function******************************************************************** - - Synopsis [Sets a corresponding pair index for a given index.] - - Description [Sets a corresponding pair index for a given index. - These pair indices are present and next state variable. Returns 1 if - successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddReadPairIndex] - -******************************************************************************/ -int -Cudd_bddSetPairIndex( - DdManager *dd /* manager */, - int index /* variable index */, - int pairIndex /* corresponding variable index */) -{ - if (index >= dd->size || index < 0) return(0); - dd->subtables[dd->perm[index]].pairIndex = pairIndex; - return(1); - -} /* end of Cudd_bddSetPairIndex */ - - -/**Function******************************************************************** - - Synopsis [Reads a corresponding pair index for a given index.] - - Description [Reads a corresponding pair index for a given index. - These pair indices are present and next state variable. Returns the - corresponding variable index if the variable exists; -1 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetPairIndex] - -******************************************************************************/ -int -Cudd_bddReadPairIndex( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return -1; - return dd->subtables[dd->perm[index]].pairIndex; - -} /* end of Cudd_bddReadPairIndex */ - - -/**Function******************************************************************** - - Synopsis [Sets a variable to be grouped.] - - Description [Sets a variable to be grouped. This function is used for - lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetVarHardGroup Cudd_bddResetVarToBeGrouped] - -******************************************************************************/ -int -Cudd_bddSetVarToBeGrouped( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(0); - if (dd->subtables[dd->perm[index]].varToBeGrouped <= CUDD_LAZY_SOFT_GROUP) { - dd->subtables[dd->perm[index]].varToBeGrouped = CUDD_LAZY_SOFT_GROUP; - } - return(1); - -} /* end of Cudd_bddSetVarToBeGrouped */ - - -/**Function******************************************************************** - - Synopsis [Sets a variable to be a hard group.] - - Description [Sets a variable to be a hard group. This function is used - for lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetVarToBeGrouped Cudd_bddResetVarToBeGrouped - Cudd_bddIsVarHardGroup] - -******************************************************************************/ -int -Cudd_bddSetVarHardGroup( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(0); - dd->subtables[dd->perm[index]].varToBeGrouped = CUDD_LAZY_HARD_GROUP; - return(1); - -} /* end of Cudd_bddSetVarHardGrouped */ - - -/**Function******************************************************************** - - Synopsis [Resets a variable not to be grouped.] - - Description [Resets a variable not to be grouped. This function is - used for lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddSetVarToBeGrouped Cudd_bddSetVarHardGroup] - -******************************************************************************/ -int -Cudd_bddResetVarToBeGrouped( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(0); - if (dd->subtables[dd->perm[index]].varToBeGrouped <= - CUDD_LAZY_SOFT_GROUP) { - dd->subtables[dd->perm[index]].varToBeGrouped = CUDD_LAZY_NONE; - } - return(1); - -} /* end of Cudd_bddResetVarToBeGrouped */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a variable is set to be grouped.] - - Description [Checks whether a variable is set to be grouped. This - function is used for lazy sifting.] - - SideEffects [none] - - SeeAlso [] - -******************************************************************************/ -int -Cudd_bddIsVarToBeGrouped( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(-1); - if (dd->subtables[dd->perm[index]].varToBeGrouped == CUDD_LAZY_UNGROUP) - return(0); - else - return(dd->subtables[dd->perm[index]].varToBeGrouped); - -} /* end of Cudd_bddIsVarToBeGrouped */ - - -/**Function******************************************************************** - - Synopsis [Sets a variable to be ungrouped.] - - Description [Sets a variable to be ungrouped. This function is used - for lazy sifting. Returns 1 if successful; 0 otherwise.] - - SideEffects [modifies the manager] - - SeeAlso [Cudd_bddIsVarToBeUngrouped] - -******************************************************************************/ -int -Cudd_bddSetVarToBeUngrouped( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(0); - dd->subtables[dd->perm[index]].varToBeGrouped = CUDD_LAZY_UNGROUP; - return(1); - -} /* end of Cudd_bddSetVarToBeGrouped */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a variable is set to be ungrouped.] - - Description [Checks whether a variable is set to be ungrouped. This - function is used for lazy sifting. Returns 1 if the variable is marked - to be ungrouped; 0 if the variable exists, but it is not marked to be - ungrouped; -1 if the variable does not exist.] - - SideEffects [none] - - SeeAlso [Cudd_bddSetVarToBeUngrouped] - -******************************************************************************/ -int -Cudd_bddIsVarToBeUngrouped( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(-1); - return dd->subtables[dd->perm[index]].varToBeGrouped == CUDD_LAZY_UNGROUP; - -} /* end of Cudd_bddIsVarToBeGrouped */ - - -/**Function******************************************************************** - - Synopsis [Checks whether a variable is set to be in a hard group.] - - Description [Checks whether a variable is set to be in a hard group. This - function is used for lazy sifting. Returns 1 if the variable is marked - to be in a hard group; 0 if the variable exists, but it is not marked to be - in a hard group; -1 if the variable does not exist.] - - SideEffects [none] - - SeeAlso [Cudd_bddSetVarHardGroup] - -******************************************************************************/ -int -Cudd_bddIsVarHardGroup( - DdManager *dd, - int index) -{ - if (index >= dd->size || index < 0) return(-1); - if (dd->subtables[dd->perm[index]].varToBeGrouped == CUDD_LAZY_HARD_GROUP) - return(1); - return(0); - -} /* end of Cudd_bddIsVarToBeGrouped */ - - -/*---------------------------------------------------------------------------*/ -/* Definition of internal functions */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Definition of static functions */ -/*---------------------------------------------------------------------------*/ - - -/**Function******************************************************************** - - Synopsis [Fixes a variable group tree.] - - Description [] - - SideEffects [Changes the variable group tree.] - - SeeAlso [] - -******************************************************************************/ -static void -fixVarTree( - MtrNode * treenode, - int * perm, - int size) -{ - treenode->index = treenode->low; - treenode->low = ((int) treenode->index < size) ? - perm[treenode->index] : treenode->index; - if (treenode->child != NULL) - fixVarTree(treenode->child, perm, size); - if (treenode->younger != NULL) - fixVarTree(treenode->younger, perm, size); - return; - -} /* end of fixVarTree */ - - -/**Function******************************************************************** - - Synopsis [Adds multiplicity groups to a ZDD variable group tree.] - - Description [Adds multiplicity groups to a ZDD variable group tree. - Returns 1 if successful; 0 otherwise. This function creates the groups - for set of ZDD variables (whose cardinality is given by parameter - multiplicity) that are created for each BDD variable in - Cudd_zddVarsFromBddVars. The crux of the matter is to determine the index - each new group. (The index of the first variable in the group.) - We first build all the groups for the children of a node, and then deal - with the ZDD variables that are directly attached to the node. The problem - for these is that the tree itself does not provide information on their - position inside the group. While we deal with the children of the node, - therefore, we keep track of all the positions they occupy. The remaining - positions in the tree can be freely used. Also, we keep track of all the - variables placed in the children. All the remaining variables are directly - attached to the group. We can then place any pair of variables not yet - grouped in any pair of available positions in the node.] - - SideEffects [Changes the variable group tree.] - - SeeAlso [Cudd_zddVarsFromBddVars] - -******************************************************************************/ -static int -addMultiplicityGroups( - DdManager *dd /* manager */, - MtrNode *treenode /* current tree node */, - int multiplicity /* how many ZDD vars per BDD var */, - char *vmask /* variable pairs for which a group has been already built */, - char *lmask /* levels for which a group has already been built*/) -{ - int startV, stopV, startL; - int i, j; - MtrNode *auxnode = treenode; - - while (auxnode != NULL) { - if (auxnode->child != NULL) { - addMultiplicityGroups(dd,auxnode->child,multiplicity,vmask,lmask); - } - /* Build remaining groups. */ - startV = dd->permZ[auxnode->index] / multiplicity; - startL = auxnode->low / multiplicity; - stopV = startV + auxnode->size / multiplicity; - /* Walk down vmask starting at startV and build missing groups. */ - for (i = startV, j = startL; i < stopV; i++) { - if (vmask[i] == 0) { - MtrNode *node; - while (lmask[j] == 1) j++; - node = Mtr_MakeGroup(auxnode, j * multiplicity, multiplicity, - MTR_FIXED); - if (node == NULL) { - return(0); - } - node->index = dd->invpermZ[i * multiplicity]; - vmask[i] = 1; - lmask[j] = 1; - } - } - auxnode = auxnode->younger; - } - return(1); - -} /* end of addMultiplicityGroups */ - |