You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							4893 lines
						
					
					
						
							136 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							4893 lines
						
					
					
						
							136 KiB
						
					
					
				| /**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_ReadStartTime() | |
|                 <li> Cudd_ReadElapsedTime() | |
| 		<li> Cudd_SetStartTime() | |
|                 <li> Cudd_ResetStartTime() | |
| 		<li> Cudd_ReadTimeLimit() | |
| 		<li> Cudd_SetTimeLimit() | |
|                 <li> Cudd_UpdateTimeLimit() | |
|                 <li> Cudd_IncreaseTimeLimit() | |
|                 <li> Cudd_UnsetTimeLimit() | |
|                 <li> Cudd_TimeLimited() | |
| 		<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_ReadMaxReorderings() | |
| 		<li> Cudd_SetMaxReorderings() | |
| 		<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_ReadOrderRandomization() | |
|                 <li> Cudd_SetOrderRandomization() | |
| 		<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_PrintGroupedOrder() | |
|                 <li> Cudd_EnableOrderingMonitoring() | |
|                 <li> Cudd_DisableOrderingMonitoring() | |
|                 <li> Cudd_OrderingMonitoring() | |
| 		<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   [Copyright (c) 1995-2012, Regents of the University of Colorado | |
|  | |
|   All rights reserved. | |
|  | |
|   Redistribution and use in source and binary forms, with or without | |
|   modification, are permitted provided that the following conditions | |
|   are met: | |
|  | |
|   Redistributions of source code must retain the above copyright | |
|   notice, this list of conditions and the following disclaimer. | |
|  | |
|   Redistributions in binary form must reproduce the above copyright | |
|   notice, this list of conditions and the following disclaimer in the | |
|   documentation and/or other materials provided with the distribution. | |
|  | |
|   Neither the name of the University of Colorado nor the names of its | |
|   contributors may be used to endorse or promote products derived from | |
|   this software without specific prior written permission. | |
|  | |
|   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
|   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
|   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | |
|   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | |
|   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | |
|   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | |
|   BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
|   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
|   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
|   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | |
|   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
|   POSSIBILITY OF SUCH DAMAGE.] | |
|  | |
| ******************************************************************************/ | |
| 
 | |
| #include "util.h" | |
| #include "cuddInt.h" | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Constant declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Stucture declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Type declarations                                                         */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Variable declarations                                                     */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| #ifndef lint | |
| static char rcsid[] DD_UNUSED = "$Id: cuddAPI.c,v 1.64 2012/02/05 01:07:18 fabio Exp $"; | |
| #endif | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Macro declarations                                                        */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**AutomaticStart*************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Static function prototypes                                                */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| static void fixVarTree (MtrNode *treenode, int *perm, int size); | |
| static int addMultiplicityGroups (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    [Returns the start time of the manager.] | |
|  | |
|   Description [Returns the start time of the manager.  This is initially set | |
|   to the number of milliseconds since the program started, but may be reset by | |
|   the application.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_SetStartTime Cudd_ResetStartTime Cudd_ReadTimeLimit] | |
|  | |
| ******************************************************************************/ | |
| unsigned long | |
| Cudd_ReadStartTime( | |
|   DdManager * unique) | |
| { | |
|     return unique->startTime; | |
| 
 | |
| } /* end of Cudd_ReadStartTime */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Returns the time elapsed since the start time of the manager.] | |
|  | |
|   Description [Returns the time elapsed since the start time of the manager.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadStartTime Cudd_SetStartTime] | |
|  | |
| ******************************************************************************/ | |
| unsigned long | |
| Cudd_ReadElapsedTime( | |
|   DdManager * unique) | |
| { | |
|   return util_cpu_time() - unique->startTime; | |
| 
 | |
| } /* end of Cudd_ReadElapsedTime */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Sets the start time of the manager.] | |
|  | |
|   Description [Sets the start time of the manager.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadStartTime Cudd_ResetStartTime Cudd_ReadElapsedTime | |
|   Cudd_SetTimeLimit] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_SetStartTime( | |
|   DdManager * unique, | |
|   unsigned long st) | |
| { | |
|     unique->startTime = st; | |
| 
 | |
| } /* end of Cudd_SetStartTime */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Resets the start time of the manager.] | |
|  | |
|   Description [Resets the start time of the manager.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadStartTime Cudd_SetStartTime Cudd_SetTimeLimit] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_ResetStartTime( | |
|   DdManager * unique) | |
| { | |
|     unique->startTime = util_cpu_time(); | |
| 
 | |
| } /* end of Cudd_ResetStartTime */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Returns the time limit for the manager.] | |
|  | |
|   Description [Returns the time limit for the manager.  This is initially set | |
|   to a very large number, but may be reset by the application.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_SetTimeLimit Cudd_UpdateTimeLimit Cudd_UnsetTimeLimit | |
|   Cudd_IncreaseTimeLimit Cudd_TimeLimited Cudd_ReadStartTime] | |
|  | |
| ******************************************************************************/ | |
| unsigned long | |
| Cudd_ReadTimeLimit( | |
|   DdManager * unique) | |
| { | |
|     return unique->timeLimit; | |
| 
 | |
| } /* end of Cudd_ReadTimeLimit */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Sets the time limit for the manager.] | |
|  | |
|   Description [Sets the time limit for the manager.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadTimeLimit Cudd_UnsetTimeLimit Cudd_UpdateTimeLimit | |
|   Cudd_IncreaseTimeLimit Cudd_TimeLimited Cudd_SetStartTime] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_SetTimeLimit( | |
|   DdManager * unique, | |
|   unsigned long tl) | |
| { | |
|     unique->timeLimit = tl; | |
| 
 | |
| } /* end of Cudd_SetTimeLimit */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Updates the time limit for the manager.] | |
|  | |
|   Description [Updates the time limit for the manager by subtracting the | |
|   elapsed time from it.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadTimeLimit Cudd_SetTimeLimit Cudd_UnsetTimeLimit | |
|   Cudd_IncreaseTimeLimit Cudd_TimeLimited Cudd_SetStartTime] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_UpdateTimeLimit( | |
|   DdManager * unique) | |
| { | |
|     unsigned long elapsed; | |
|     if (unique->timeLimit == ~0UL) | |
|         return; | |
|     elapsed = util_cpu_time() - unique->startTime; | |
|     if (unique->timeLimit >= elapsed) { | |
|         unique->timeLimit -= elapsed; | |
|     } else { | |
|         unique->timeLimit = 0; | |
|     } | |
| 
 | |
| } /* end of Cudd_UpdateTimeLimit */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Increases the time limit for the manager.] | |
|  | |
|   Description [Increases the time limit for the manager.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadTimeLimit Cudd_SetTimeLimit Cudd_UnsetTimeLimit | |
|   Cudd_UpdateTimeLimit Cudd_TimeLimited Cudd_SetStartTime] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_IncreaseTimeLimit( | |
|   DdManager * unique, | |
|   unsigned long increase) | |
| { | |
|     if (unique->timeLimit == ~0UL) | |
|         unique->timeLimit = increase; | |
|     else | |
|         unique->timeLimit += increase; | |
| 
 | |
| } /* end of Cudd_IncreaseTimeLimit */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Unsets the time limit for the manager.] | |
|  | |
|   Description [Unsets the time limit for the manager.  Actually, sets it to | |
|   a very large value.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadTimeLimit Cudd_SetTimeLimit Cudd_UpdateTimeLimit | |
|   Cudd_IncreaseTimeLimit Cudd_TimeLimited Cudd_SetStartTime] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_UnsetTimeLimit( | |
|   DdManager * unique) | |
| { | |
|     unique->timeLimit = ~0UL; | |
| 
 | |
| } /* end of Cudd_UnsetTimeLimit */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Returns true if the time limit for the manager is set.] | |
|  | |
|   Description [Returns true if the time limit for the manager is set.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadTimeLimit Cudd_SetTimeLimit Cudd_UpdateTimeLimit | |
|   Cudd_UnsetTimeLimit Cudd_IncreaseTimeLimit] | |
|  | |
| ******************************************************************************/ | |
| int | |
| Cudd_TimeLimited( | |
|   DdManager * unique) | |
| { | |
|     return unique->timeLimit != ~0UL; | |
| 
 | |
| } /* end of Cudd_TimeLimited */ | |
| 
 | |
| 
 | |
| /**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) { | |
| 	unsigned 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.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadMaxCacheHard] | |
|  | |
| ******************************************************************************/ | |
| 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) { | |
| 	unsigned 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 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] | |
|  | |
| ******************************************************************************/ | |
| unsigned int | |
| Cudd_ReadReorderings( | |
|   DdManager * dd) | |
| { | |
|     return(dd->reorderings); | |
| 
 | |
| } /* end of Cudd_ReadReorderings */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Returns the maximum number of times reordering may be invoked.] | |
|  | |
|   Description [Returns the maximum number of times reordering may be invoked in | |
|   this manager.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso [Cudd_ReadReorderings Cudd_SetMaxReorderings Cudd_ReduceHeap] | |
|  | |
| ******************************************************************************/ | |
| unsigned int | |
| Cudd_ReadMaxReorderings( | |
|   DdManager * dd) | |
| { | |
|     return(dd->maxReorderings); | |
| 
 | |
| } /* end of Cudd_ReadMaxReorderings */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Sets the maximum number of times reordering may be invoked.] | |
|  | |
|   Description [Sets the maximum number of times reordering may be invoked in | |
|   this manager.  The default value is (practically) infinite.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso [Cudd_ReadReorderings Cudd_ReadMaxReorderings Cudd_ReduceHeap] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_SetMaxReorderings( | |
|   DdManager * dd, unsigned int mr) | |
| { | |
|     dd->maxReorderings = mr; | |
| 
 | |
| } /* end of Cudd_SetMaxReorderings */ | |
| 
 | |
| 
 | |
| /**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 order randomization factor.] | |
|  | |
|   Description [Returns the order randomization factor.  If non-zero this | |
|   factor is used to determine a perturbation of the next reordering threshold. | |
|   Larger factors cause larger perturbations.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_SetOrderRandomization] | |
|  | |
| ******************************************************************************/ | |
| unsigned int | |
| Cudd_ReadOrderRandomization( | |
|   DdManager * dd) | |
| { | |
|     return(dd->randomizeOrder); | |
| 
 | |
| } /* end of Cudd_ReadOrderRandomization */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Sets the order randomization factor.] | |
|  | |
|   Description [] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_ReadOrderRandomization] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_SetOrderRandomization( | |
|   DdManager * dd, | |
|   unsigned int factor) | |
| { | |
|     dd->randomizeOrder = factor; | |
| 
 | |
| } /* end of Cudd_SetOrderRandomization */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Returns the memory in use by the manager measured in bytes.] | |
|  | |
|   Description [] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [] | |
|  | |
| ******************************************************************************/ | |
| unsigned 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", | |
| 		     (int) 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", | |
| 		     (int) 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", | |
| 		     (int) 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: %lu\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); | |
| #ifdef 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 | |
| #ifdef 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); | |
| #ifdef 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.] | |
|  | |
|   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 = (long) (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((long)(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, | |
|   DD_HFP f, | |
|   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, | |
|   DD_HFP f, | |
|   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, | |
|   DD_HFP f, | |
|   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, | |
|   const 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, | |
|   const char *str, | |
|   void *data) | |
| { | |
|     unsigned long initialTime = (long) data; | |
|     int retval; | |
|     unsigned 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    [Hook function to print the current variable order.] | |
|  | |
|   Description [Hook function to print the current variable order.  It may be | |
|   called before or after reordering. Prints on the manager's stdout a | |
|   parenthesized list that describes the variable groups. | |
|   Returns 1 if successful; 0 otherwise.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_StdPreReordHook] | |
|  | |
| ******************************************************************************/ | |
| int | |
| Cudd_PrintGroupedOrder( | |
|   DdManager * dd, | |
|   const char *str, | |
|   void *data) | |
| { | |
|     int isBdd = strcmp(str, "ZDD"); | |
|     MtrNode *tree = isBdd ? dd->tree : dd->treeZ; | |
|     int *invperm = isBdd ? dd->invperm : dd->invpermZ; | |
|     int size = isBdd ? dd->size : dd->sizeZ; | |
|     if (tree == NULL) { | |
|         int i, retval; | |
|         for (i=0; i < size; i++) { | |
|             retval = fprintf(dd->out, "%c%d", i==0 ? '(' : ',', invperm[i]); | |
|             if (retval == EOF) return(0); | |
|         } | |
|         retval = fprintf(dd->out,")\n"); | |
|         return (retval != EOF); | |
|     } else { | |
|         return Mtr_PrintGroupedOrder(tree,invperm,dd->out); | |
|     } | |
|          | |
| } /* end of Cudd_PrintGroupedOrder */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Enables monitoring of ordering.] | |
|  | |
|   Description [Enables monitoring of ordering. | |
|   Returns 1 if successful; 0 otherwise.] | |
|  | |
|   SideEffects [Installs functions in the pre-reordering and post-reordering | |
|   hooks.] | |
|  | |
|   SeeAlso     [Cudd_EnableReorderingReporting] | |
|  | |
| ******************************************************************************/ | |
| int | |
| Cudd_EnableOrderingMonitoring( | |
|   DdManager *dd) | |
| { | |
|     if (!Cudd_AddHook(dd, Cudd_PrintGroupedOrder, CUDD_PRE_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     if (!Cudd_AddHook(dd, Cudd_StdPreReordHook, CUDD_PRE_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     if (!Cudd_AddHook(dd, Cudd_StdPostReordHook, CUDD_POST_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     if (!Cudd_AddHook(dd, Cudd_PrintGroupedOrder, CUDD_POST_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     return(1); | |
| 
 | |
| } /* end of Cudd_EnableOrderingMonitoring */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Disables monitoring of ordering.] | |
|  | |
|   Description [Disables monitoring of ordering. | |
|   Returns 1 if successful; 0 otherwise.] | |
|  | |
|   SideEffects [Removes functions from the pre-reordering and post-reordering | |
|   hooks.] | |
|  | |
|   SeeAlso     [Cudd_EnableOrderingMonitoring] | |
|  | |
| ******************************************************************************/ | |
| int | |
| Cudd_DisableOrderingMonitoring( | |
|   DdManager *dd) | |
| { | |
|     if (!Cudd_RemoveHook(dd, Cudd_StdPreReordHook, CUDD_PRE_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     if (!Cudd_RemoveHook(dd, Cudd_PrintGroupedOrder, CUDD_PRE_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     if (!Cudd_RemoveHook(dd, Cudd_PrintGroupedOrder, CUDD_POST_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     if (!Cudd_RemoveHook(dd, Cudd_StdPostReordHook, CUDD_POST_REORDERING_HOOK)) { | |
| 	return(0); | |
|     } | |
|     return(1); | |
| 
 | |
| } /* end of Cudd_DisableOrderingMonitoring */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Returns 1 if monitoring of ordering is enabled.] | |
|  | |
|   Description [Returns 1 if monitoring of ordering is enabled; | |
|   0 otherwise.] | |
|  | |
|   SideEffects [none] | |
|  | |
|   SeeAlso     [Cudd_EnableOrderingMonitoring Cudd_DisableOrderingMonitoring] | |
|  | |
| ******************************************************************************/ | |
| int | |
| Cudd_OrderingMonitoring( | |
|   DdManager *dd) | |
| { | |
|     return(Cudd_IsInHook(dd, Cudd_PrintGroupedOrder, CUDD_PRE_REORDERING_HOOK)); | |
| 
 | |
| } /* end of Cudd_OrderingMonitoring */ | |
| 
 | |
| 
 | |
| /**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] | |
|  | |
| ******************************************************************************/ | |
| unsigned 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, | |
|   unsigned 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 */
 |