SVF
cuddInit.c
Go to the documentation of this file.
1 
59 #include "CUDD/util.h"
60 #include "CUDD/cuddInt.h"
61 
62 /*---------------------------------------------------------------------------*/
63 /* Constant declarations */
64 /*---------------------------------------------------------------------------*/
65 
66 
67 /*---------------------------------------------------------------------------*/
68 /* Stucture declarations */
69 /*---------------------------------------------------------------------------*/
70 
71 
72 /*---------------------------------------------------------------------------*/
73 /* Type declarations */
74 /*---------------------------------------------------------------------------*/
75 
76 
77 /*---------------------------------------------------------------------------*/
78 /* Variable declarations */
79 /*---------------------------------------------------------------------------*/
80 
81 #ifndef lint
82 static char rcsid[] DD_UNUSED = "$Id: cuddInit.c,v 1.34 2012/02/05 01:07:19 fabio Exp $";
83 #endif
84 
85 /*---------------------------------------------------------------------------*/
86 /* Macro declarations */
87 /*---------------------------------------------------------------------------*/
88 
89 
92 /*---------------------------------------------------------------------------*/
93 /* Static function prototypes */
94 /*---------------------------------------------------------------------------*/
95 
96 
100 /*---------------------------------------------------------------------------*/
101 /* Definition of exported functions */
102 /*---------------------------------------------------------------------------*/
103 
120 DdManager *
122  unsigned int numVars /* initial number of BDD variables (i.e., subtables) */,
123  unsigned int numVarsZ /* initial number of ZDD variables (i.e., subtables) */,
124  unsigned int numSlots /* initial size of the unique tables */,
125  unsigned int cacheSize /* initial size of the cache */,
126  unsigned long maxMemory /* target maximum memory occupation */)
127 {
128  DdManager *unique;
129  int i,result;
130  DdNode *one, *zero;
131  unsigned int maxCacheSize;
132  unsigned int looseUpTo;
133  extern DD_OOMFP MMoutOfMemory;
134  DD_OOMFP saveHandler;
135 
136  if (maxMemory == 0) {
137  maxMemory = getSoftDataLimit();
138  }
139  looseUpTo = (unsigned int) ((maxMemory / sizeof(DdNode)) /
141  unique = cuddInitTable(numVars,numVarsZ,numSlots,looseUpTo);
142  if (unique == NULL) return(NULL);
143  unique->maxmem = (unsigned long) maxMemory / 10 * 9;
144  maxCacheSize = (unsigned int) ((maxMemory / sizeof(DdCache)) /
146  result = cuddInitCache(unique,cacheSize,maxCacheSize);
147  if (result == 0) return(NULL);
148 
149  saveHandler = MMoutOfMemory;
150  MMoutOfMemory = Cudd_OutOfMem;
151  unique->stash = ALLOC(char,(maxMemory / DD_STASH_FRACTION) + 4);
152  MMoutOfMemory = saveHandler;
153  if (unique->stash == NULL) {
154  (void) fprintf(unique->err,"Unable to set aside memory\n");
155  }
156 
157  /* Initialize constants. */
158  unique->one = cuddUniqueConst(unique,1.0);
159  if (unique->one == NULL) return(0);
160  cuddRef(unique->one);
161  unique->zero = cuddUniqueConst(unique,0.0);
162  if (unique->zero == NULL) return(0);
163  cuddRef(unique->zero);
164 #ifdef HAVE_IEEE_754
165  if (DD_PLUS_INF_VAL != DD_PLUS_INF_VAL * 3 ||
167  (void) fprintf(unique->err,"Warning: Crippled infinite values\n");
168  (void) fprintf(unique->err,"Recompile without -DHAVE_IEEE_754\n");
169  }
170 #endif
171  unique->plusinfinity = cuddUniqueConst(unique,DD_PLUS_INF_VAL);
172  if (unique->plusinfinity == NULL) return(0);
173  cuddRef(unique->plusinfinity);
175  if (unique->minusinfinity == NULL) return(0);
176  cuddRef(unique->minusinfinity);
177  unique->background = unique->zero;
178 
179  /* The logical zero is different from the CUDD_VALUE_TYPE zero! */
180  one = unique->one;
181  zero = Cudd_Not(one);
182  /* Create the projection functions. */
183  unique->vars = ALLOC(DdNodePtr,unique->maxSize);
184  if (unique->vars == NULL) {
185  unique->errorCode = CUDD_MEMORY_OUT;
186  return(NULL);
187  }
188  for (i = 0; i < unique->size; i++) {
189  unique->vars[i] = cuddUniqueInter(unique,i,one,zero);
190  if (unique->vars[i] == NULL) return(0);
191  cuddRef(unique->vars[i]);
192  }
193 
194  if (unique->sizeZ)
195  cuddZddInitUniv(unique);
196 
197  unique->memused += sizeof(DdNode *) * unique->maxSize;
198 
199  return(unique);
200 
201 } /* end of Cudd_Init */
202 
203 
217 void
219  DdManager * unique)
220 {
221  if (unique->stash != NULL) FREE(unique->stash);
222  cuddFreeTable(unique);
223 
224 } /* end of Cudd_Quit */
225 
226 
227 /*---------------------------------------------------------------------------*/
228 /* Definition of internal functions */
229 /*---------------------------------------------------------------------------*/
230 
231 
244 int
246  DdManager * zdd)
247 {
248  DdNode *p, *res;
249  int i;
250 
251  zdd->univ = ALLOC(DdNodePtr, zdd->sizeZ);
252  if (zdd->univ == NULL) {
253  zdd->errorCode = CUDD_MEMORY_OUT;
254  return(0);
255  }
256 
257  res = DD_ONE(zdd);
258  cuddRef(res);
259  for (i = zdd->sizeZ - 1; i >= 0; i--) {
260  unsigned int index = zdd->invpermZ[i];
261  p = res;
262  res = cuddUniqueInterZdd(zdd, index, p, p);
263  if (res == NULL) {
264  Cudd_RecursiveDerefZdd(zdd,p);
265  FREE(zdd->univ);
266  return(0);
267  }
268  cuddRef(res);
269  cuddDeref(p);
270  zdd->univ[i] = res;
271  }
272 
273 #ifdef DD_VERBOSE
274  cuddZddP(zdd, zdd->univ[0]);
275 #endif
276 
277  return(1);
278 
279 } /* end of cuddZddInitUniv */
280 
281 
293 void
295  DdManager * zdd)
296 {
297  if (zdd->univ) {
298  Cudd_RecursiveDerefZdd(zdd, zdd->univ[0]);
299  FREE(zdd->univ);
300  }
301 
302 } /* end of cuddZddFreeUniv */
303 
304 
305 /*---------------------------------------------------------------------------*/
306 /* Definition of static functions */
307 /*---------------------------------------------------------------------------*/
308 
#define cuddRef(n)
Definition: cuddInt.h:557
void Cudd_RecursiveDerefZdd(DdManager *table, DdNode *n)
Definition: cuddRef.c:381
int cuddZddInitUniv(DdManager *zdd)
Definition: cuddInit.c:245
#define cuddDeref(n)
Definition: cuddInt.h:577
void Cudd_OutOfMem(long size)
Definition: cuddUtil.c:2845
Definition: cudd.h:270
#define Cudd_Not(node)
Definition: cudd.h:354
#define DD_MAX_CACHE_FRACTION
Definition: cuddInt.h:141
#define FREE(obj)
Definition: util.h:80
int * invpermZ
Definition: cuddInt.h:372
void Cudd_Quit(DdManager *unique)
Definition: cuddInit.c:218
DdNode * cuddUniqueConst(DdManager *unique, CUDD_VALUE_TYPE value)
Definition: cuddTable.c:1479
int size
Definition: cuddInt.h:345
#define DD_STASH_FRACTION
Definition: cuddInt.h:143
DdNode * zero
Definition: cuddInt.h:330
#define DD_MAX_LOOSE_FRACTION
Definition: cuddInt.h:139
FILE * err
Definition: cuddInt.h:424
#define DD_PLUS_INF_VAL
Definition: cuddInt.h:118
DdManager * Cudd_Init(unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int cacheSize, unsigned long maxMemory)
Definition: cuddInit.c:121
void(* DD_OOMFP)(long)
Definition: cudd.h:311
static DdNode * one
Definition: cuddSat.c:105
char * stash
Definition: cuddInt.h:382
#define ALLOC(type, num)
Definition: util.h:76
int maxSize
Definition: cuddInt.h:347
void cuddZddFreeUniv(DdManager *zdd)
Definition: cuddInit.c:294
unsigned long getSoftDataLimit(void)
Definition: datalimit.c:35
DdNode * cuddUniqueInterZdd(DdManager *unique, int index, DdNode *T, DdNode *E)
Definition: cuddTable.c:1372
void(* MMoutOfMemory)(long)
Definition: safe_mem.c:32
DdManager * cuddInitTable(unsigned int numVars, unsigned int numVarsZ, unsigned int numSlots, unsigned int looseUpTo)
Definition: cuddTable.c:380
unsigned long memused
Definition: cuddInt.h:429
int sizeZ
Definition: cuddInt.h:346
DdNode ** vars
Definition: cuddInt.h:373
static DdNode * zero
Definition: cuddSat.c:105
static char rcsid [] DD_UNUSED
Definition: cuddInit.c:82
DdNode * one
Definition: cuddInt.h:329
DdNode * plusinfinity
Definition: cuddInt.h:331
static int result
Definition: cuddGenetic.c:121
unsigned long maxmem
Definition: cuddInt.h:430
DdNode * minusinfinity
Definition: cuddInt.h:332
void cuddFreeTable(DdManager *unique)
Definition: cuddTable.c:692
#define DD_ONE(dd)
Definition: cuddInt.h:864
int cuddInitCache(DdManager *unique, unsigned int cacheSize, unsigned int maxCacheSize)
Definition: cuddCache.c:132
#define DD_MINUS_INF_VAL
Definition: cuddInt.h:122
Cudd_ErrorType errorCode
Definition: cuddInt.h:425
DdNode * cuddUniqueInter(DdManager *unique, int index, DdNode *T, DdNode *E)
Definition: cuddTable.c:1137
int cuddZddP(DdManager *zdd, DdNode *f)
DdNode * background
Definition: cuddInt.h:333
DdNode ** univ
Definition: cuddInt.h:375