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.
		
		
		
		
		
			
		
			
				
					
					
						
							308 lines
						
					
					
						
							9.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							308 lines
						
					
					
						
							9.9 KiB
						
					
					
				| /**CFile*********************************************************************** | |
|  | |
|   FileName    [cuddInit.c] | |
|  | |
|   PackageName [cudd] | |
|  | |
|   Synopsis    [Functions to initialize and shut down the DD manager.] | |
|  | |
|   Description [External procedures included in this module: | |
| 		<ul> | |
| 		<li> Cudd_Init() | |
| 		<li> Cudd_Quit() | |
| 		</ul> | |
| 	       Internal procedures included in this module: | |
| 		<ul> | |
| 		<li> cuddZddInitUniv() | |
| 		<li> cuddZddFreeUniv() | |
| 		</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: cuddInit.c,v 1.34 2012/02/05 01:07:19 fabio Exp $"; | |
| #endif | |
|  | |
| /*---------------------------------------------------------------------------*/ | |
| /* Macro declarations                                                        */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /**AutomaticStart*************************************************************/ | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Static function prototypes                                                */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /**AutomaticEnd***************************************************************/ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of exported functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Creates a new DD manager.] | |
|  | |
|   Description [Creates a new DD manager, initializes the table, the | |
|   basic constants and the projection functions. If maxMemory is 0, | |
|   Cudd_Init decides suitable values for the maximum size of the cache | |
|   and for the limit for fast unique table growth based on the available | |
|   memory. Returns a pointer to the manager if successful; NULL | |
|   otherwise.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_Quit] | |
|  | |
| ******************************************************************************/ | |
| DdManager * | |
| Cudd_Init( | |
|   unsigned int numVars /* initial number of BDD variables (i.e., subtables) */, | |
|   unsigned int numVarsZ /* initial number of ZDD variables (i.e., subtables) */, | |
|   unsigned int numSlots /* initial size of the unique tables */, | |
|   unsigned int cacheSize /* initial size of the cache */, | |
|   unsigned long maxMemory /* target maximum memory occupation */) | |
| { | |
|     DdManager *unique; | |
|     int i,result; | |
|     DdNode *one, *zero; | |
|     unsigned int maxCacheSize; | |
|     unsigned int looseUpTo; | |
|     extern DD_OOMFP MMoutOfMemory; | |
|     DD_OOMFP saveHandler; | |
| 
 | |
|     if (maxMemory == 0) { | |
| 	maxMemory = getSoftDataLimit(); | |
|     } | |
|     looseUpTo = (unsigned int) ((maxMemory / sizeof(DdNode)) / | |
| 				DD_MAX_LOOSE_FRACTION); | |
|     unique = cuddInitTable(numVars,numVarsZ,numSlots,looseUpTo); | |
|     if (unique == NULL) return(NULL); | |
|     unique->maxmem = (unsigned long) maxMemory / 10 * 9; | |
|     maxCacheSize = (unsigned int) ((maxMemory / sizeof(DdCache)) / | |
| 				   DD_MAX_CACHE_FRACTION); | |
|     result = cuddInitCache(unique,cacheSize,maxCacheSize); | |
|     if (result == 0) return(NULL); | |
| 
 | |
|     saveHandler = MMoutOfMemory; | |
|     MMoutOfMemory = Cudd_OutOfMem; | |
|     unique->stash = ALLOC(char,(maxMemory / DD_STASH_FRACTION) + 4); | |
|     MMoutOfMemory = saveHandler; | |
|     if (unique->stash == NULL) { | |
| 	(void) fprintf(unique->err,"Unable to set aside memory\n"); | |
|     } | |
| 
 | |
|     /* Initialize constants. */ | |
|     unique->one = cuddUniqueConst(unique,1.0); | |
|     if (unique->one == NULL) return(0); | |
|     cuddRef(unique->one); | |
|     unique->zero = cuddUniqueConst(unique,0.0); | |
|     if (unique->zero == NULL) return(0); | |
|     cuddRef(unique->zero); | |
| #ifdef HAVE_IEEE_754 | |
|     if (DD_PLUS_INF_VAL != DD_PLUS_INF_VAL * 3 || | |
| 	DD_PLUS_INF_VAL != DD_PLUS_INF_VAL / 3) { | |
| 	(void) fprintf(unique->err,"Warning: Crippled infinite values\n"); | |
| 	(void) fprintf(unique->err,"Recompile without -DHAVE_IEEE_754\n"); | |
|     } | |
| #endif | |
|     unique->plusinfinity = cuddUniqueConst(unique,DD_PLUS_INF_VAL); | |
|     if (unique->plusinfinity == NULL) return(0); | |
|     cuddRef(unique->plusinfinity); | |
|     unique->minusinfinity = cuddUniqueConst(unique,DD_MINUS_INF_VAL); | |
|     if (unique->minusinfinity == NULL) return(0); | |
|     cuddRef(unique->minusinfinity); | |
|     unique->background = unique->zero; | |
| 
 | |
|     /* The logical zero is different from the CUDD_VALUE_TYPE zero! */ | |
|     one = unique->one; | |
|     zero = Cudd_Not(one); | |
|     /* Create the projection functions. */ | |
|     unique->vars = ALLOC(DdNodePtr,unique->maxSize); | |
|     if (unique->vars == NULL) { | |
| 	unique->errorCode = CUDD_MEMORY_OUT; | |
| 	return(NULL); | |
|     } | |
|     for (i = 0; i < unique->size; i++) { | |
| 	unique->vars[i] = cuddUniqueInter(unique,i,one,zero); | |
| 	if (unique->vars[i] == NULL) return(0); | |
| 	cuddRef(unique->vars[i]); | |
|     } | |
| 
 | |
|     if (unique->sizeZ) | |
| 	cuddZddInitUniv(unique); | |
| 
 | |
|     unique->memused += sizeof(DdNode *) * unique->maxSize; | |
| 
 | |
|     return(unique); | |
| 
 | |
| } /* end of Cudd_Init */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Deletes resources associated with a DD manager.] | |
|  | |
|   Description [Deletes resources associated with a DD manager and | |
|   resets the global statistical counters. (Otherwise, another manaqger | |
|   subsequently created would inherit the stats of this one.)] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [Cudd_Init] | |
|  | |
| ******************************************************************************/ | |
| void | |
| Cudd_Quit( | |
|   DdManager * unique) | |
| { | |
|     if (unique->stash != NULL) FREE(unique->stash); | |
|     cuddFreeTable(unique); | |
| 
 | |
| } /* end of Cudd_Quit */ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of internal functions                                          */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Initializes the ZDD universe.] | |
|  | |
|   Description [Initializes the ZDD universe. Returns 1 if successful; 0 | |
|   otherwise.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [cuddZddFreeUniv] | |
|  | |
| ******************************************************************************/ | |
| int | |
| cuddZddInitUniv( | |
|   DdManager * zdd) | |
| { | |
|     DdNode	*p, *res; | |
|     int		i; | |
| 
 | |
|     zdd->univ = ALLOC(DdNodePtr, zdd->sizeZ); | |
|     if (zdd->univ == NULL) { | |
| 	zdd->errorCode = CUDD_MEMORY_OUT; | |
| 	return(0); | |
|     } | |
| 
 | |
|     res = DD_ONE(zdd); | |
|     cuddRef(res); | |
|     for (i = zdd->sizeZ - 1; i >= 0; i--) { | |
| 	unsigned int index = zdd->invpermZ[i]; | |
| 	p = res; | |
| 	res = cuddUniqueInterZdd(zdd, index, p, p); | |
| 	if (res == NULL) { | |
| 	    Cudd_RecursiveDerefZdd(zdd,p); | |
| 	    FREE(zdd->univ); | |
| 	    return(0); | |
| 	} | |
| 	cuddRef(res); | |
| 	cuddDeref(p); | |
| 	zdd->univ[i] = res; | |
|     } | |
| 
 | |
| #ifdef DD_VERBOSE | |
|     cuddZddP(zdd, zdd->univ[0]); | |
| #endif | |
|  | |
|     return(1); | |
| 
 | |
| } /* end of cuddZddInitUniv */ | |
| 
 | |
| 
 | |
| /**Function******************************************************************** | |
|  | |
|   Synopsis    [Frees the ZDD universe.] | |
|  | |
|   Description [Frees the ZDD universe.] | |
|  | |
|   SideEffects [None] | |
|  | |
|   SeeAlso     [cuddZddInitUniv] | |
|  | |
| ******************************************************************************/ | |
| void | |
| cuddZddFreeUniv( | |
|   DdManager * zdd) | |
| { | |
|     if (zdd->univ) { | |
| 	Cudd_RecursiveDerefZdd(zdd, zdd->univ[0]); | |
| 	FREE(zdd->univ); | |
|     } | |
| 
 | |
| } /* end of cuddZddFreeUniv */ | |
| 
 | |
| 
 | |
| /*---------------------------------------------------------------------------*/ | |
| /* Definition of static functions                                            */ | |
| /*---------------------------------------------------------------------------*/ | |
| 
 |