SVF
cuddAPI.c
Go to the documentation of this file.
1 
212 #include "CUDD/util.h"
213 #include "CUDD/cuddInt.h"
214 
215 /*---------------------------------------------------------------------------*/
216 /* Constant declarations */
217 /*---------------------------------------------------------------------------*/
218 
219 /*---------------------------------------------------------------------------*/
220 /* Stucture declarations */
221 /*---------------------------------------------------------------------------*/
222 
223 /*---------------------------------------------------------------------------*/
224 /* Type declarations */
225 /*---------------------------------------------------------------------------*/
226 
227 /*---------------------------------------------------------------------------*/
228 /* Variable declarations */
229 /*---------------------------------------------------------------------------*/
230 
231 #ifndef lint
232 static char rcsid[] DD_UNUSED = "$Id: cuddAPI.c,v 1.64 2012/02/05 01:07:18 fabio Exp $";
233 #endif
234 
235 /*---------------------------------------------------------------------------*/
236 /* Macro declarations */
237 /*---------------------------------------------------------------------------*/
238 
241 /*---------------------------------------------------------------------------*/
242 /* Static function prototypes */
243 /*---------------------------------------------------------------------------*/
244 
245 static void fixVarTree (MtrNode *treenode, int *perm, int size);
246 static int addMultiplicityGroups (DdManager *dd, MtrNode *treenode, int multiplicity, char *vmask, char *lmask);
247 
251 /*---------------------------------------------------------------------------*/
252 /* Definition of exported functions */
253 /*---------------------------------------------------------------------------*/
254 
255 
272 DdNode *
274  DdManager * dd)
275 {
276  DdNode *res;
277 
278  if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL);
279  do {
280  dd->reordered = 0;
281  res = cuddUniqueInter(dd,dd->size,DD_ONE(dd),DD_ZERO(dd));
282  } while (dd->reordered == 1);
283 
284  return(res);
285 
286 } /* end of Cudd_addNewVar */
287 
288 
303 DdNode *
305  DdManager * dd,
306  int level)
307 {
308  DdNode *res;
309 
310  if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL);
311  if (level >= dd->size) return(Cudd_addIthVar(dd,level));
312  if (!cuddInsertSubtables(dd,1,level)) return(NULL);
313  do {
314  dd->reordered = 0;
315  res = cuddUniqueInter(dd,dd->size - 1,DD_ONE(dd),DD_ZERO(dd));
316  } while (dd->reordered == 1);
317 
318  return(res);
319 
320 } /* end of Cudd_addNewVarAtLevel */
321 
322 
336 DdNode *
338  DdManager * dd)
339 {
340  DdNode *res;
341 
342  if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL);
343  res = cuddUniqueInter(dd,dd->size,dd->one,Cudd_Not(dd->one));
344 
345  return(res);
346 
347 } /* end of Cudd_bddNewVar */
348 
349 
364 DdNode *
366  DdManager * dd,
367  int level)
368 {
369  DdNode *res;
370 
371  if ((unsigned int) dd->size >= CUDD_MAXINDEX - 1) return(NULL);
372  if (level >= dd->size) return(Cudd_bddIthVar(dd,level));
373  if (!cuddInsertSubtables(dd,1,level)) return(NULL);
374  res = dd->vars[dd->size - 1];
375 
376  return(res);
377 
378 } /* end of Cudd_bddNewVarAtLevel */
379 
380 
397 DdNode *
399  DdManager * dd,
400  int i)
401 {
402  DdNode *res;
403 
404  if ((unsigned int) i >= CUDD_MAXINDEX - 1) return(NULL);
405  do {
406  dd->reordered = 0;
407  res = cuddUniqueInter(dd,i,DD_ONE(dd),DD_ZERO(dd));
408  } while (dd->reordered == 1);
409 
410  return(res);
411 
412 } /* end of Cudd_addIthVar */
413 
414 
429 DdNode *
431  DdManager * dd,
432  int i)
433 {
434  DdNode *res;
435 
436  if ((unsigned int) i >= CUDD_MAXINDEX - 1) return(NULL);
437  if (i < dd->size) {
438  res = dd->vars[i];
439  } else {
440  res = cuddUniqueInter(dd,i,dd->one,Cudd_Not(dd->one));
441  }
442 
443  return(res);
444 
445 } /* end of Cudd_bddIthVar */
446 
447 
461 DdNode *
463  DdManager * dd,
464  int i)
465 {
466  DdNode *res;
467  DdNode *zvar;
468  DdNode *lower;
469  int j;
470 
471  if ((unsigned int) i >= CUDD_MAXINDEX - 1) return(NULL);
472 
473  /* The i-th variable function has the following structure:
474  ** at the level corresponding to index i there is a node whose "then"
475  ** child points to the universe, and whose "else" child points to zero.
476  ** Above that level there are nodes with identical children.
477  */
478 
479  /* First we build the node at the level of index i. */
480  lower = (i < dd->sizeZ - 1) ? dd->univ[dd->permZ[i]+1] : DD_ONE(dd);
481  do {
482  dd->reordered = 0;
483  zvar = cuddUniqueInterZdd(dd, i, lower, DD_ZERO(dd));
484  } while (dd->reordered == 1);
485 
486  if (zvar == NULL)
487  return(NULL);
488  cuddRef(zvar);
489 
490  /* Now we add the "filler" nodes above the level of index i. */
491  for (j = dd->permZ[i] - 1; j >= 0; j--) {
492  do {
493  dd->reordered = 0;
494  res = cuddUniqueInterZdd(dd, dd->invpermZ[j], zvar, zvar);
495  } while (dd->reordered == 1);
496  if (res == NULL) {
497  Cudd_RecursiveDerefZdd(dd,zvar);
498  return(NULL);
499  }
500  cuddRef(res);
501  Cudd_RecursiveDerefZdd(dd,zvar);
502  zvar = res;
503  }
504  cuddDeref(zvar);
505  return(zvar);
506 
507 } /* end of Cudd_zddIthVar */
508 
509 
532 int
534  DdManager * dd /* DD manager */,
535  int multiplicity /* how many ZDD variables are created for each BDD variable */)
536 {
537  int res;
538  int i, j;
539  int allnew;
540  int *permutation;
541 
542  if (multiplicity < 1) return(0);
543  allnew = dd->sizeZ == 0;
544  if (dd->size * multiplicity > dd->sizeZ) {
545  res = cuddResizeTableZdd(dd,dd->size * multiplicity - 1);
546  if (res == 0) return(0);
547  }
548  /* Impose the order of the BDD variables to the ZDD variables. */
549  if (allnew) {
550  for (i = 0; i < dd->size; i++) {
551  for (j = 0; j < multiplicity; j++) {
552  dd->permZ[i * multiplicity + j] =
553  dd->perm[i] * multiplicity + j;
554  dd->invpermZ[dd->permZ[i * multiplicity + j]] =
555  i * multiplicity + j;
556  }
557  }
558  for (i = 0; i < dd->sizeZ; i++) {
559  dd->univ[i]->index = dd->invpermZ[i];
560  }
561  } else {
562  permutation = ALLOC(int,dd->sizeZ);
563  if (permutation == NULL) {
565  return(0);
566  }
567  for (i = 0; i < dd->size; i++) {
568  for (j = 0; j < multiplicity; j++) {
569  permutation[i * multiplicity + j] =
570  dd->invperm[i] * multiplicity + j;
571  }
572  }
573  for (i = dd->size * multiplicity; i < dd->sizeZ; i++) {
574  permutation[i] = i;
575  }
576  res = Cudd_zddShuffleHeap(dd, permutation);
577  FREE(permutation);
578  if (res == 0) return(0);
579  }
580  /* Copy and expand the variable group tree if it exists. */
581  if (dd->treeZ != NULL) {
582  Cudd_FreeZddTree(dd);
583  }
584  if (dd->tree != NULL) {
585  dd->treeZ = Mtr_CopyTree(dd->tree, multiplicity);
586  if (dd->treeZ == NULL) return(0);
587  } else if (multiplicity > 1) {
588  dd->treeZ = Mtr_InitGroupTree(0, dd->sizeZ);
589  if (dd->treeZ == NULL) return(0);
590  dd->treeZ->index = dd->invpermZ[0];
591  }
592  /* Create groups for the ZDD variables derived from the same BDD variable.
593  */
594  if (multiplicity > 1) {
595  char *vmask, *lmask;
596 
597  vmask = ALLOC(char, dd->size);
598  if (vmask == NULL) {
600  return(0);
601  }
602  lmask = ALLOC(char, dd->size);
603  if (lmask == NULL) {
605  return(0);
606  }
607  for (i = 0; i < dd->size; i++) {
608  vmask[i] = lmask[i] = 0;
609  }
610  res = addMultiplicityGroups(dd,dd->treeZ,multiplicity,vmask,lmask);
611  FREE(vmask);
612  FREE(lmask);
613  if (res == 0) return(0);
614  }
615  return(1);
616 
617 } /* end of Cudd_zddVarsFromBddVars */
618 
619 
633 DdNode *
635  DdManager * dd,
636  CUDD_VALUE_TYPE c)
637 {
638  return(cuddUniqueConst(dd,c));
639 
640 } /* end of Cudd_addConst */
641 
642 
658 int
660  DdNode *f)
661 {
662  return(f == DD_NON_CONSTANT || !Cudd_IsConstant(f));
663 
664 } /* end of Cudd_IsNonConstant */
665 
666 
680 unsigned long
682  DdManager * unique)
683 {
684  return unique->startTime;
685 
686 } /* end of Cudd_ReadStartTime */
687 
688 
700 unsigned long
702  DdManager * unique)
703 {
704  return util_cpu_time() - unique->startTime;
705 
706 } /* end of Cudd_ReadElapsedTime */
707 
708 
721 void
723  DdManager * unique,
724  unsigned long st)
725 {
726  unique->startTime = st;
727 
728 } /* end of Cudd_SetStartTime */
729 
730 
742 void
744  DdManager * unique)
745 {
746  unique->startTime = util_cpu_time();
747 
748 } /* end of Cudd_ResetStartTime */
749 
750 
764 unsigned long
766  DdManager * unique)
767 {
768  return unique->timeLimit;
769 
770 } /* end of Cudd_ReadTimeLimit */
771 
772 
785 void
787  DdManager * unique,
788  unsigned long tl)
789 {
790  unique->timeLimit = tl;
791 
792 } /* end of Cudd_SetTimeLimit */
793 
794 
808 void
810  DdManager * unique)
811 {
812  unsigned long elapsed;
813  if (unique->timeLimit == ~0UL)
814  return;
815  elapsed = util_cpu_time() - unique->startTime;
816  if (unique->timeLimit >= elapsed) {
817  unique->timeLimit -= elapsed;
818  } else {
819  unique->timeLimit = 0;
820  }
821 
822 } /* end of Cudd_UpdateTimeLimit */
823 
824 
837 void
839  DdManager * unique,
840  unsigned long increase)
841 {
842  if (unique->timeLimit == ~0UL)
843  unique->timeLimit = increase;
844  else
845  unique->timeLimit += increase;
846 
847 } /* end of Cudd_IncreaseTimeLimit */
848 
849 
863 void
865  DdManager * unique)
866 {
867  unique->timeLimit = ~0UL;
868 
869 } /* end of Cudd_UnsetTimeLimit */
870 
871 
884 int
886  DdManager * unique)
887 {
888  return unique->timeLimit != ~0UL;
889 
890 } /* end of Cudd_TimeLimited */
891 
892 
908 void
910  DdManager * unique,
911  Cudd_ReorderingType method)
912 {
913  unique->autoDyn = 1;
914  if (method != CUDD_REORDER_SAME) {
915  unique->autoMethod = method;
916  }
917 #ifndef DD_NO_DEATH_ROW
918  /* If reordering is enabled, using the death row causes too many
919  ** invocations. Hence, we shrink the death row to just one entry.
920  */
921  cuddClearDeathRow(unique);
922  unique->deathRowDepth = 1;
923  unique->deadMask = unique->deathRowDepth - 1;
924  if ((unsigned) unique->nextDead > unique->deadMask) {
925  unique->nextDead = 0;
926  }
927  unique->deathRow = REALLOC(DdNodePtr, unique->deathRow,
928  unique->deathRowDepth);
929 #endif
930  return;
931 
932 } /* end of Cudd_AutodynEnable */
933 
934 
947 void
949  DdManager * unique)
950 {
951  unique->autoDyn = 0;
952  return;
953 
954 } /* end of Cudd_AutodynDisable */
955 
956 
974 int
976  DdManager * unique,
977  Cudd_ReorderingType * method)
978 {
979  *method = unique->autoMethod;
980  return(unique->autoDyn);
981 
982 } /* end of Cudd_ReorderingStatus */
983 
984 
999 void
1001  DdManager * unique,
1002  Cudd_ReorderingType method)
1003 {
1004  unique->autoDynZ = 1;
1005  if (method != CUDD_REORDER_SAME) {
1006  unique->autoMethodZ = method;
1007  }
1008  return;
1009 
1010 } /* end of Cudd_AutodynEnableZdd */
1011 
1012 
1025 void
1027  DdManager * unique)
1028 {
1029  unique->autoDynZ = 0;
1030  return;
1031 
1032 } /* end of Cudd_AutodynDisableZdd */
1033 
1034 
1051 int
1053  DdManager * unique,
1054  Cudd_ReorderingType * method)
1055 {
1056  *method = unique->autoMethodZ;
1057  return(unique->autoDynZ);
1058 
1059 } /* end of Cudd_ReorderingStatusZdd */
1060 
1061 
1076 int
1078  DdManager * unique)
1079 {
1080  return(unique->realign);
1081 
1082 } /* end of Cudd_zddRealignmentEnabled */
1083 
1084 
1106 void
1108  DdManager * unique)
1109 {
1110  unique->realign = 1;
1111  return;
1112 
1113 } /* end of Cudd_zddRealignEnable */
1114 
1115 
1128 void
1130  DdManager * unique)
1131 {
1132  unique->realign = 0;
1133  return;
1134 
1135 } /* end of Cudd_zddRealignDisable */
1136 
1137 
1152 int
1154  DdManager * unique)
1155 {
1156  return(unique->realignZ);
1157 
1158 } /* end of Cudd_bddRealignmentEnabled */
1159 
1160 
1182 void
1184  DdManager * unique)
1185 {
1186  unique->realignZ = 1;
1187  return;
1188 
1189 } /* end of Cudd_bddRealignEnable */
1190 
1191 
1204 void
1206  DdManager * unique)
1207 {
1208  unique->realignZ = 0;
1209  return;
1210 
1211 } /* end of Cudd_bddRealignDisable */
1212 
1213 
1226 DdNode *
1228  DdManager * dd)
1229 {
1230  return(dd->one);
1231 
1232 } /* end of Cudd_ReadOne */
1233 
1234 
1249 DdNode *
1251  DdManager * dd,
1252  int i)
1253 {
1254  if (i < 0)
1255  return(NULL);
1256  return(i < dd->sizeZ ? dd->univ[i] : DD_ONE(dd));
1257 
1258 } /* end of Cudd_ReadZddOne */
1259 
1260 
1261 
1275 DdNode *
1277  DdManager * dd)
1278 {
1279  return(DD_ZERO(dd));
1280 
1281 } /* end of Cudd_ReadZero */
1282 
1283 
1297 DdNode *
1299  DdManager * dd)
1300 {
1301  return(Cudd_Not(DD_ONE(dd)));
1302 
1303 } /* end of Cudd_ReadLogicZero */
1304 
1305 
1315 DdNode *
1317  DdManager * dd)
1318 {
1319  return(dd->plusinfinity);
1320 
1321 } /* end of Cudd_ReadPlusInfinity */
1322 
1323 
1333 DdNode *
1335  DdManager * dd)
1336 {
1337  return(dd->minusinfinity);
1338 
1339 } /* end of Cudd_ReadMinusInfinity */
1340 
1341 
1351 DdNode *
1353  DdManager * dd)
1354 {
1355  return(dd->background);
1356 
1357 } /* end of Cudd_ReadBackground */
1358 
1359 
1370 void
1372  DdManager * dd,
1373  DdNode * bck)
1374 {
1375  dd->background = bck;
1376 
1377 } /* end of Cudd_SetBackground */
1378 
1379 
1391 unsigned int
1393  DdManager * dd)
1394 {
1395  return(dd->cacheSlots);
1396 
1397 } /* end of Cudd_ReadCacheSlots */
1398 
1399 
1414 double
1416  DdManager * dd)
1417 {
1418  unsigned long used = 0;
1419  int slots = dd->cacheSlots;
1420  DdCache *cache = dd->cache;
1421  int i;
1422 
1423  for (i = 0; i < slots; i++) {
1424  used += cache[i].h != 0;
1425  }
1426 
1427  return((double)used / (double) dd->cacheSlots);
1428 
1429 } /* end of Cudd_ReadCacheUsedSlots */
1430 
1431 
1443 double
1445  DdManager * dd)
1446 {
1447  return(dd->cacheHits + dd->cacheMisses +
1448  dd->totCachehits + dd->totCacheMisses);
1449 
1450 } /* end of Cudd_ReadCacheLookUps */
1451 
1452 
1464 double
1466  DdManager * dd)
1467 {
1468  return(dd->cacheHits + dd->totCachehits);
1469 
1470 } /* end of Cudd_ReadCacheHits */
1471 
1472 
1485 double
1487  DdManager * dd)
1488 {
1489 #ifdef DD_COUNT
1490  return(dd->recursiveCalls);
1491 #else
1492  return(-1.0);
1493 #endif
1494 
1495 } /* end of Cudd_ReadRecursiveCalls */
1496 
1497 
1498 
1511 unsigned int
1513  DdManager * dd)
1514 {
1515  /* Internally, the package manipulates the ratio of hits to
1516  ** misses instead of the ratio of hits to accesses. */
1517  return((unsigned int) (0.5 + 100 * dd->minHit / (1 + dd->minHit)));
1518 
1519 } /* end of Cudd_ReadMinHit */
1520 
1521 
1537 void
1539  DdManager * dd,
1540  unsigned int hr)
1541 {
1542  /* Internally, the package manipulates the ratio of hits to
1543  ** misses instead of the ratio of hits to accesses. */
1544  dd->minHit = (double) hr / (100.0 - (double) hr);
1545 
1546 } /* end of Cudd_SetMinHit */
1547 
1548 
1560 unsigned int
1562  DdManager * dd)
1563 {
1564  return(dd->looseUpTo);
1565 
1566 } /* end of Cudd_ReadLooseUpTo */
1567 
1568 
1584 void
1586  DdManager * dd,
1587  unsigned int lut)
1588 {
1589  if (lut == 0) {
1590  unsigned long datalimit = getSoftDataLimit();
1591  lut = (unsigned int) (datalimit / (sizeof(DdNode) *
1593  }
1594  dd->looseUpTo = lut;
1595 
1596 } /* end of Cudd_SetLooseUpTo */
1597 
1598 
1610 unsigned int
1612  DdManager * dd)
1613 {
1614  return(2 * dd->cacheSlots + dd->cacheSlack);
1615 
1616 } /* end of Cudd_ReadMaxCache */
1617 
1618 
1630 unsigned int
1632  DdManager * dd)
1633 {
1634  return(dd->maxCacheHard);
1635 
1636 } /* end of Cudd_ReadMaxCache */
1637 
1638 
1654 void
1656  DdManager * dd,
1657  unsigned int mc)
1658 {
1659  if (mc == 0) {
1660  unsigned long datalimit = getSoftDataLimit();
1661  mc = (unsigned int) (datalimit / (sizeof(DdCache) *
1663  }
1664  dd->maxCacheHard = mc;
1665 
1666 } /* end of Cudd_SetMaxCacheHard */
1667 
1668 
1680 int
1682  DdManager * dd)
1683 {
1684  return(dd->size);
1685 
1686 } /* end of Cudd_ReadSize */
1687 
1688 
1700 int
1702  DdManager * dd)
1703 {
1704  return(dd->sizeZ);
1705 
1706 } /* end of Cudd_ReadZddSize */
1707 
1708 
1719 unsigned int
1721  DdManager * dd)
1722 {
1723  return(dd->slots);
1724 
1725 } /* end of Cudd_ReadSlots */
1726 
1727 
1742 double
1744  DdManager * dd)
1745 {
1746  unsigned long used = 0;
1747  int i, j;
1748  int size = dd->size;
1749  DdNodePtr *nodelist;
1750  DdSubtable *subtable;
1751  DdNode *node;
1752  DdNode *sentinel = &(dd->sentinel);
1753 
1754  /* Scan each BDD/ADD subtable. */
1755  for (i = 0; i < size; i++) {
1756  subtable = &(dd->subtables[i]);
1757  nodelist = subtable->nodelist;
1758  for (j = 0; (unsigned) j < subtable->slots; j++) {
1759  node = nodelist[j];
1760  if (node != sentinel) {
1761  used++;
1762  }
1763  }
1764  }
1765 
1766  /* Scan the ZDD subtables. */
1767  size = dd->sizeZ;
1768 
1769  for (i = 0; i < size; i++) {
1770  subtable = &(dd->subtableZ[i]);
1771  nodelist = subtable->nodelist;
1772  for (j = 0; (unsigned) j < subtable->slots; j++) {
1773  node = nodelist[j];
1774  if (node != NULL) {
1775  used++;
1776  }
1777  }
1778  }
1779 
1780  /* Constant table. */
1781  subtable = &(dd->constants);
1782  nodelist = subtable->nodelist;
1783  for (j = 0; (unsigned) j < subtable->slots; j++) {
1784  node = nodelist[j];
1785  if (node != NULL) {
1786  used++;
1787  }
1788  }
1789 
1790  return((double)used / (double) dd->slots);
1791 
1792 } /* end of Cudd_ReadUsedSlots */
1793 
1794 
1811 double
1813  DdManager * dd)
1814 {
1815  int i;
1816  int size = dd->size;
1817  DdSubtable *subtable;
1818  double empty = 0.0;
1819 
1820  /* To each subtable we apply the corollary to Theorem 8.5 (occupancy
1821  ** distribution) from Sedgewick and Flajolet's Analysis of Algorithms.
1822  ** The corollary says that for a table with M buckets and a load ratio
1823  ** of r, the expected number of empty buckets is asymptotically given
1824  ** by M * exp(-r).
1825  */
1826 
1827  /* Scan each BDD/ADD subtable. */
1828  for (i = 0; i < size; i++) {
1829  subtable = &(dd->subtables[i]);
1830  empty += (double) subtable->slots *
1831  exp(-(double) subtable->keys / (double) subtable->slots);
1832  }
1833 
1834  /* Scan the ZDD subtables. */
1835  size = dd->sizeZ;
1836 
1837  for (i = 0; i < size; i++) {
1838  subtable = &(dd->subtableZ[i]);
1839  empty += (double) subtable->slots *
1840  exp(-(double) subtable->keys / (double) subtable->slots);
1841  }
1842 
1843  /* Constant table. */
1844  subtable = &(dd->constants);
1845  empty += (double) subtable->slots *
1846  exp(-(double) subtable->keys / (double) subtable->slots);
1847 
1848  return(1.0 - empty / (double) dd->slots);
1849 
1850 } /* end of Cudd_ExpectedUsedSlots */
1851 
1852 
1865 unsigned int
1867  DdManager * dd)
1868 {
1869  return(dd->keys);
1870 
1871 } /* end of Cudd_ReadKeys */
1872 
1873 
1885 unsigned int
1887  DdManager * dd)
1888 {
1889  return(dd->dead);
1890 
1891 } /* end of Cudd_ReadDead */
1892 
1893 
1909 unsigned int
1911  DdManager * dd)
1912 {
1913  return(dd->minDead);
1914 
1915 } /* end of Cudd_ReadMinDead */
1916 
1917 
1935 unsigned int
1937  DdManager * dd)
1938 {
1939  return(dd->reorderings);
1940 
1941 } /* end of Cudd_ReadReorderings */
1942 
1943 
1956 unsigned int
1958  DdManager * dd)
1959 {
1960  return(dd->maxReorderings);
1961 
1962 } /* end of Cudd_ReadMaxReorderings */
1963 
1964 
1977 void
1979  DdManager * dd, unsigned int mr)
1980 {
1981  dd->maxReorderings = mr;
1982 
1983 } /* end of Cudd_SetMaxReorderings */
1984 
1985 
1999 long
2001  DdManager * dd)
2002 {
2003  return(dd->reordTime);
2004 
2005 } /* end of Cudd_ReadReorderingTime */
2006 
2007 
2022 int
2024  DdManager * dd)
2025 {
2026  return(dd->garbageCollections);
2027 
2028 } /* end of Cudd_ReadGarbageCollections */
2029 
2030 
2043 long
2045  DdManager * dd)
2046 {
2047  return(dd->GCTime);
2048 
2049 } /* end of Cudd_ReadGarbageCollectionTime */
2050 
2051 
2065 double
2067  DdManager * dd)
2068 {
2069 #ifdef DD_STATS
2070  return(dd->nodesFreed);
2071 #else
2072  return(-1.0);
2073 #endif
2074 
2075 } /* end of Cudd_ReadNodesFreed */
2076 
2077 
2091 double
2093  DdManager * dd)
2094 {
2095 #ifdef DD_STATS
2096  return(dd->nodesDropped);
2097 #else
2098  return(-1.0);
2099 #endif
2100 
2101 } /* end of Cudd_ReadNodesDropped */
2102 
2103 
2117 double
2119  DdManager * dd)
2120 {
2121 #ifdef DD_UNIQUE_PROFILE
2122  return(dd->uniqueLookUps);
2123 #else
2124  return(-1.0);
2125 #endif
2126 
2127 } /* end of Cudd_ReadUniqueLookUps */
2128 
2129 
2146 double
2148  DdManager * dd)
2149 {
2150 #ifdef DD_UNIQUE_PROFILE
2151  return(dd->uniqueLinks);
2152 #else
2153  return(-1.0);
2154 #endif
2155 
2156 } /* end of Cudd_ReadUniqueLinks */
2157 
2158 
2172 int
2174  DdManager * dd)
2175 {
2176  return(dd->siftMaxVar);
2177 
2178 } /* end of Cudd_ReadSiftMaxVar */
2179 
2180 
2194 void
2196  DdManager * dd,
2197  int smv)
2198 {
2199  dd->siftMaxVar = smv;
2200 
2201 } /* end of Cudd_SetSiftMaxVar */
2202 
2203 
2219 int
2221  DdManager * dd)
2222 {
2223  return(dd->siftMaxSwap);
2224 
2225 } /* end of Cudd_ReadSiftMaxSwap */
2226 
2227 
2243 void
2245  DdManager * dd,
2246  int sms)
2247 {
2248  dd->siftMaxSwap = sms;
2249 
2250 } /* end of Cudd_SetSiftMaxSwap */
2251 
2252 
2269 double
2271  DdManager * dd)
2272 {
2273  return(dd->maxGrowth);
2274 
2275 } /* end of Cudd_ReadMaxGrowth */
2276 
2277 
2294 void
2296  DdManager * dd,
2297  double mg)
2298 {
2299  dd->maxGrowth = mg;
2300 
2301 } /* end of Cudd_SetMaxGrowth */
2302 
2303 
2320 double
2322  DdManager * dd)
2323 {
2324  return(dd->maxGrowthAlt);
2325 
2326 } /* end of Cudd_ReadMaxGrowthAlternate */
2327 
2328 
2345 void
2347  DdManager * dd,
2348  double mg)
2349 {
2350  dd->maxGrowthAlt = mg;
2351 
2352 } /* end of Cudd_SetMaxGrowthAlternate */
2353 
2354 
2369 int
2371  DdManager * dd)
2372 {
2373  return(dd->reordCycle);
2374 
2375 } /* end of Cudd_ReadReorderingCycle */
2376 
2377 
2392 void
2394  DdManager * dd,
2395  int cycle)
2396 {
2397  dd->reordCycle = cycle;
2398 
2399 } /* end of Cudd_SetReorderingCycle */
2400 
2401 
2413 MtrNode *
2415  DdManager * dd)
2416 {
2417  return(dd->tree);
2418 
2419 } /* end of Cudd_ReadTree */
2420 
2421 
2433 void
2435  DdManager * dd,
2436  MtrNode * tree)
2437 {
2438  if (dd->tree != NULL) {
2439  Mtr_FreeTree(dd->tree);
2440  }
2441  dd->tree = tree;
2442  if (tree == NULL) return;
2443 
2444  fixVarTree(tree, dd->perm, dd->size);
2445  return;
2446 
2447 } /* end of Cudd_SetTree */
2448 
2449 
2461 void
2463  DdManager * dd)
2464 {
2465  if (dd->tree != NULL) {
2466  Mtr_FreeTree(dd->tree);
2467  dd->tree = NULL;
2468  }
2469  return;
2470 
2471 } /* end of Cudd_FreeTree */
2472 
2473 
2485 MtrNode *
2487  DdManager * dd)
2488 {
2489  return(dd->treeZ);
2490 
2491 } /* end of Cudd_ReadZddTree */
2492 
2493 
2505 void
2507  DdManager * dd,
2508  MtrNode * tree)
2509 {
2510  if (dd->treeZ != NULL) {
2511  Mtr_FreeTree(dd->treeZ);
2512  }
2513  dd->treeZ = tree;
2514  if (tree == NULL) return;
2515 
2516  fixVarTree(tree, dd->permZ, dd->sizeZ);
2517  return;
2518 
2519 } /* end of Cudd_SetZddTree */
2520 
2521 
2533 void
2535  DdManager * dd)
2536 {
2537  if (dd->treeZ != NULL) {
2538  Mtr_FreeTree(dd->treeZ);
2539  dd->treeZ = NULL;
2540  }
2541  return;
2542 
2543 } /* end of Cudd_FreeZddTree */
2544 
2545 
2558 unsigned int
2560  DdNode * node)
2561 {
2562  return((unsigned int) Cudd_Regular(node)->index);
2563 
2564 } /* end of Cudd_NodeReadIndex */
2565 
2566 
2582 int
2584  DdManager * dd,
2585  int i)
2586 {
2587  if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX);
2588  if (i < 0 || i >= dd->size) return(-1);
2589  return(dd->perm[i]);
2590 
2591 } /* end of Cudd_ReadPerm */
2592 
2593 
2609 int
2611  DdManager * dd,
2612  int i)
2613 {
2614  if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX);
2615  if (i < 0 || i >= dd->sizeZ) return(-1);
2616  return(dd->permZ[i]);
2617 
2618 } /* end of Cudd_ReadPermZdd */
2619 
2620 
2635 int
2637  DdManager * dd,
2638  int i)
2639 {
2640  if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX);
2641  if (i < 0 || i >= dd->size) return(-1);
2642  return(dd->invperm[i]);
2643 
2644 } /* end of Cudd_ReadInvPerm */
2645 
2646 
2661 int
2663  DdManager * dd,
2664  int i)
2665 {
2666  if (i == CUDD_CONST_INDEX) return(CUDD_CONST_INDEX);
2667  if (i < 0 || i >= dd->sizeZ) return(-1);
2668  return(dd->invpermZ[i]);
2669 
2670 } /* end of Cudd_ReadInvPermZdd */
2671 
2672 
2688 DdNode *
2690  DdManager * dd,
2691  int i)
2692 {
2693  if (i < 0 || i > dd->size) return(NULL);
2694  return(dd->vars[i]);
2695 
2696 } /* end of Cudd_ReadVars */
2697 
2698 
2713  DdManager * dd)
2714 {
2715  return(dd->epsilon);
2716 
2717 } /* end of Cudd_ReadEpsilon */
2718 
2719 
2732 void
2734  DdManager * dd,
2735  CUDD_VALUE_TYPE ep)
2736 {
2737  dd->epsilon = ep;
2738 
2739 } /* end of Cudd_SetEpsilon */
2740 
2741 
2757  DdManager * dd)
2758 {
2759  return(dd->groupcheck);
2760 
2761 } /* end of Cudd_ReadGroupCheck */
2762 
2763 
2777 void
2779  DdManager * dd,
2781 {
2782  dd->groupcheck = gc;
2783 
2784 } /* end of Cudd_SetGroupcheck */
2785 
2786 
2798 int
2800  DdManager * dd)
2801 {
2802  return(dd->gcEnabled);
2803 
2804 } /* end of Cudd_GarbageCollectionEnabled */
2805 
2806 
2820 void
2822  DdManager * dd)
2823 {
2824  dd->gcEnabled = 1;
2825 
2826 } /* end of Cudd_EnableGarbageCollection */
2827 
2828 
2844 void
2846  DdManager * dd)
2847 {
2848  dd->gcEnabled = 0;
2849 
2850 } /* end of Cudd_DisableGarbageCollection */
2851 
2852 
2866 int
2868  DdManager * dd)
2869 {
2870  return(dd->countDead == 0 ? 1 : 0);
2871 
2872 } /* end of Cudd_DeadAreCounted */
2873 
2874 
2889 void
2891  DdManager * dd)
2892 {
2893  dd->countDead = 0;
2894 
2895 } /* end of Cudd_TurnOnCountDead */
2896 
2897 
2914 void
2916  DdManager * dd)
2917 {
2918  dd->countDead = ~0;
2919 
2920 } /* end of Cudd_TurnOffCountDead */
2921 
2922 
2938 int
2940  DdManager * dd)
2941 {
2942  return(dd->recomb);
2943 
2944 } /* end of Cudd_ReadRecomb */
2945 
2946 
2963 void
2965  DdManager * dd,
2966  int recomb)
2967 {
2968  dd->recomb = recomb;
2969 
2970 } /* end of Cudd_SetRecomb */
2971 
2972 
2991 int
2993  DdManager * dd)
2994 {
2995  return(dd->symmviolation);
2996 
2997 } /* end of Cudd_ReadSymmviolation */
2998 
2999 
3018 void
3020  DdManager * dd,
3021  int symmviolation)
3022 {
3023  dd->symmviolation = symmviolation;
3024 
3025 } /* end of Cudd_SetSymmviolation */
3026 
3027 
3045 int
3047  DdManager * dd)
3048 {
3049  return(dd->arcviolation);
3050 
3051 } /* end of Cudd_ReadArcviolation */
3052 
3053 
3071 void
3073  DdManager * dd,
3074  int arcviolation)
3075 {
3076  dd->arcviolation = arcviolation;
3077 
3078 } /* end of Cudd_SetArcviolation */
3079 
3080 
3098 int
3100  DdManager * dd)
3101 {
3102  return(dd->populationSize);
3103 
3104 } /* end of Cudd_ReadPopulationSize */
3105 
3106 
3124 void
3126  DdManager * dd,
3127  int populationSize)
3128 {
3129  dd->populationSize = populationSize;
3130 
3131 } /* end of Cudd_SetPopulationSize */
3132 
3133 
3151 int
3153  DdManager * dd)
3154 {
3155  return(dd->numberXovers);
3156 
3157 } /* end of Cudd_ReadNumberXovers */
3158 
3159 
3177 void
3179  DdManager * dd,
3180  int numberXovers)
3181 {
3182  dd->numberXovers = numberXovers;
3183 
3184 } /* end of Cudd_SetNumberXovers */
3185 
3186 
3200 unsigned int
3202  DdManager * dd)
3203 {
3204  return(dd->randomizeOrder);
3205 
3206 } /* end of Cudd_ReadOrderRandomization */
3207 
3208 
3220 void
3222  DdManager * dd,
3223  unsigned int factor)
3224 {
3225  dd->randomizeOrder = factor;
3226 
3227 } /* end of Cudd_SetOrderRandomization */
3228 
3229 
3241 unsigned long
3243  DdManager * dd)
3244 {
3245  return(dd->memused);
3246 
3247 } /* end of Cudd_ReadMemoryInUse */
3248 
3249 
3262 int
3264  DdManager * dd,
3265  FILE * fp)
3266 {
3267  int retval;
3268  Cudd_ReorderingType autoMethod, autoMethodZ;
3269 
3270  /* Modifiable parameters. */
3271  retval = fprintf(fp,"**** CUDD modifiable parameters ****\n");
3272  if (retval == EOF) return(0);
3273  retval = fprintf(fp,"Hard limit for cache size: %u\n",
3274  Cudd_ReadMaxCacheHard(dd));
3275  if (retval == EOF) return(0);
3276  retval = fprintf(fp,"Cache hit threshold for resizing: %u%%\n",
3277  Cudd_ReadMinHit(dd));
3278  if (retval == EOF) return(0);
3279  retval = fprintf(fp,"Garbage collection enabled: %s\n",
3280  Cudd_GarbageCollectionEnabled(dd) ? "yes" : "no");
3281  if (retval == EOF) return(0);
3282  retval = fprintf(fp,"Limit for fast unique table growth: %u\n",
3283  Cudd_ReadLooseUpTo(dd));
3284  if (retval == EOF) return(0);
3285  retval = fprintf(fp,
3286  "Maximum number of variables sifted per reordering: %d\n",
3287  Cudd_ReadSiftMaxVar(dd));
3288  if (retval == EOF) return(0);
3289  retval = fprintf(fp,
3290  "Maximum number of variable swaps per reordering: %d\n",
3291  Cudd_ReadSiftMaxSwap(dd));
3292  if (retval == EOF) return(0);
3293  retval = fprintf(fp,"Maximum growth while sifting a variable: %g\n",
3294  Cudd_ReadMaxGrowth(dd));
3295  if (retval == EOF) return(0);
3296  retval = fprintf(fp,"Dynamic reordering of BDDs enabled: %s\n",
3297  Cudd_ReorderingStatus(dd,&autoMethod) ? "yes" : "no");
3298  if (retval == EOF) return(0);
3299  retval = fprintf(fp,"Default BDD reordering method: %d\n",
3300  (int) autoMethod);
3301  if (retval == EOF) return(0);
3302  retval = fprintf(fp,"Dynamic reordering of ZDDs enabled: %s\n",
3303  Cudd_ReorderingStatusZdd(dd,&autoMethodZ) ? "yes" : "no");
3304  if (retval == EOF) return(0);
3305  retval = fprintf(fp,"Default ZDD reordering method: %d\n",
3306  (int) autoMethodZ);
3307  if (retval == EOF) return(0);
3308  retval = fprintf(fp,"Realignment of ZDDs to BDDs enabled: %s\n",
3309  Cudd_zddRealignmentEnabled(dd) ? "yes" : "no");
3310  if (retval == EOF) return(0);
3311  retval = fprintf(fp,"Realignment of BDDs to ZDDs enabled: %s\n",
3312  Cudd_bddRealignmentEnabled(dd) ? "yes" : "no");
3313  if (retval == EOF) return(0);
3314  retval = fprintf(fp,"Dead nodes counted in triggering reordering: %s\n",
3315  Cudd_DeadAreCounted(dd) ? "yes" : "no");
3316  if (retval == EOF) return(0);
3317  retval = fprintf(fp,"Group checking criterion: %d\n",
3318  (int) Cudd_ReadGroupcheck(dd));
3319  if (retval == EOF) return(0);
3320  retval = fprintf(fp,"Recombination threshold: %d\n", Cudd_ReadRecomb(dd));
3321  if (retval == EOF) return(0);
3322  retval = fprintf(fp,"Symmetry violation threshold: %d\n",
3324  if (retval == EOF) return(0);
3325  retval = fprintf(fp,"Arc violation threshold: %d\n",
3326  Cudd_ReadArcviolation(dd));
3327  if (retval == EOF) return(0);
3328  retval = fprintf(fp,"GA population size: %d\n",
3330  if (retval == EOF) return(0);
3331  retval = fprintf(fp,"Number of crossovers for GA: %d\n",
3332  Cudd_ReadNumberXovers(dd));
3333  if (retval == EOF) return(0);
3334  retval = fprintf(fp,"Next reordering threshold: %u\n",
3336  if (retval == EOF) return(0);
3337 
3338  /* Non-modifiable parameters. */
3339  retval = fprintf(fp,"**** CUDD non-modifiable parameters ****\n");
3340  if (retval == EOF) return(0);
3341  retval = fprintf(fp,"Memory in use: %lu\n", Cudd_ReadMemoryInUse(dd));
3342  if (retval == EOF) return(0);
3343  retval = fprintf(fp,"Peak number of nodes: %ld\n",
3345  if (retval == EOF) return(0);
3346  retval = fprintf(fp,"Peak number of live nodes: %d\n",
3348  if (retval == EOF) return(0);
3349  retval = fprintf(fp,"Number of BDD variables: %d\n", dd->size);
3350  if (retval == EOF) return(0);
3351  retval = fprintf(fp,"Number of ZDD variables: %d\n", dd->sizeZ);
3352  if (retval == EOF) return(0);
3353  retval = fprintf(fp,"Number of cache entries: %u\n", dd->cacheSlots);
3354  if (retval == EOF) return(0);
3355  retval = fprintf(fp,"Number of cache look-ups: %.0f\n",
3356  Cudd_ReadCacheLookUps(dd));
3357  if (retval == EOF) return(0);
3358  retval = fprintf(fp,"Number of cache hits: %.0f\n",
3359  Cudd_ReadCacheHits(dd));
3360  if (retval == EOF) return(0);
3361  retval = fprintf(fp,"Number of cache insertions: %.0f\n",
3362  dd->cacheinserts);
3363  if (retval == EOF) return(0);
3364  retval = fprintf(fp,"Number of cache collisions: %.0f\n",
3365  dd->cachecollisions);
3366  if (retval == EOF) return(0);
3367  retval = fprintf(fp,"Number of cache deletions: %.0f\n",
3368  dd->cachedeletions);
3369  if (retval == EOF) return(0);
3370  retval = cuddCacheProfile(dd,fp);
3371  if (retval == 0) return(0);
3372  retval = fprintf(fp,"Soft limit for cache size: %u\n",
3373  Cudd_ReadMaxCache(dd));
3374  if (retval == EOF) return(0);
3375  retval = fprintf(fp,"Number of buckets in unique table: %u\n", dd->slots);
3376  if (retval == EOF) return(0);
3377  retval = fprintf(fp,"Used buckets in unique table: %.2f%% (expected %.2f%%)\n",
3378  100.0 * Cudd_ReadUsedSlots(dd),
3379  100.0 * Cudd_ExpectedUsedSlots(dd));
3380  if (retval == EOF) return(0);
3381 #ifdef DD_UNIQUE_PROFILE
3382  retval = fprintf(fp,"Unique lookups: %.0f\n", dd->uniqueLookUps);
3383  if (retval == EOF) return(0);
3384  retval = fprintf(fp,"Unique links: %.0f (%g per lookup)\n",
3385  dd->uniqueLinks, dd->uniqueLinks / dd->uniqueLookUps);
3386  if (retval == EOF) return(0);
3387 #endif
3388  retval = fprintf(fp,"Number of BDD and ADD nodes: %u\n", dd->keys);
3389  if (retval == EOF) return(0);
3390  retval = fprintf(fp,"Number of ZDD nodes: %u\n", dd->keysZ);
3391  if (retval == EOF) return(0);
3392  retval = fprintf(fp,"Number of dead BDD and ADD nodes: %u\n", dd->dead);
3393  if (retval == EOF) return(0);
3394  retval = fprintf(fp,"Number of dead ZDD nodes: %u\n", dd->deadZ);
3395  if (retval == EOF) return(0);
3396  retval = fprintf(fp,"Total number of nodes allocated: %.0f\n",
3397  dd->allocated);
3398  if (retval == EOF) return(0);
3399  retval = fprintf(fp,"Total number of nodes reclaimed: %.0f\n",
3400  dd->reclaimed);
3401  if (retval == EOF) return(0);
3402 #ifdef DD_STATS
3403  retval = fprintf(fp,"Nodes freed: %.0f\n", dd->nodesFreed);
3404  if (retval == EOF) return(0);
3405  retval = fprintf(fp,"Nodes dropped: %.0f\n", dd->nodesDropped);
3406  if (retval == EOF) return(0);
3407 #endif
3408 #ifdef DD_COUNT
3409  retval = fprintf(fp,"Number of recursive calls: %.0f\n",
3411  if (retval == EOF) return(0);
3412 #endif
3413  retval = fprintf(fp,"Garbage collections so far: %d\n",
3415  if (retval == EOF) return(0);
3416  retval = fprintf(fp,"Time for garbage collection: %.2f sec\n",
3417  ((double)Cudd_ReadGarbageCollectionTime(dd)/1000.0));
3418  if (retval == EOF) return(0);
3419  retval = fprintf(fp,"Reorderings so far: %d\n", dd->reorderings);
3420  if (retval == EOF) return(0);
3421  retval = fprintf(fp,"Time for reordering: %.2f sec\n",
3422  ((double)Cudd_ReadReorderingTime(dd)/1000.0));
3423  if (retval == EOF) return(0);
3424 #ifdef DD_COUNT
3425  retval = fprintf(fp,"Node swaps in reordering: %.0f\n",
3426  Cudd_ReadSwapSteps(dd));
3427  if (retval == EOF) return(0);
3428 #endif
3429 
3430  return(1);
3431 
3432 } /* end of Cudd_PrintInfo */
3433 
3434 
3448 long
3450  DdManager * dd)
3451 {
3452  long count = 0;
3453  DdNodePtr *scan = dd->memoryList;
3454 
3455  while (scan != NULL) {
3456  count += DD_MEM_CHUNK;
3457  scan = (DdNodePtr *) *scan;
3458  }
3459  return(count);
3460 
3461 } /* end of Cudd_ReadPeakNodeCount */
3462 
3463 
3475 int
3477  DdManager * dd)
3478 {
3479  unsigned int live = dd->keys - dd->dead;
3480 
3481  if (live > dd->peakLiveNodes) {
3482  dd->peakLiveNodes = live;
3483  }
3484  return((int)dd->peakLiveNodes);
3485 
3486 } /* end of Cudd_ReadPeakLiveNodeCount */
3487 
3488 
3503 long
3505  DdManager * dd)
3506 {
3507  long count;
3508  int i;
3509 
3510 #ifndef DD_NO_DEATH_ROW
3511  cuddClearDeathRow(dd);
3512 #endif
3513 
3514  count = (long) (dd->keys - dd->dead);
3515 
3516  /* Count isolated projection functions. Their number is subtracted
3517  ** from the node count because they are not part of the BDDs.
3518  */
3519  for (i=0; i < dd->size; i++) {
3520  if (dd->vars[i]->ref == 1) count--;
3521  }
3522  /* Subtract from the count the unused constants. */
3523  if (DD_ZERO(dd)->ref == 1) count--;
3524  if (DD_PLUS_INFINITY(dd)->ref == 1) count--;
3525  if (DD_MINUS_INFINITY(dd)->ref == 1) count--;
3526 
3527  return(count);
3528 
3529 } /* end of Cudd_ReadNodeCount */
3530 
3531 
3532 
3545 long
3547  DdManager * dd)
3548 {
3549  return((long)(dd->keysZ - dd->deadZ + 2));
3550 
3551 } /* end of Cudd_zddReadNodeCount */
3552 
3553 
3568 int
3570  DdManager * dd,
3571  DD_HFP f,
3572  Cudd_HookType where)
3573 {
3574  DdHook **hook, *nextHook, *newHook;
3575 
3576  switch (where) {
3577  case CUDD_PRE_GC_HOOK:
3578  hook = &(dd->preGCHook);
3579  break;
3580  case CUDD_POST_GC_HOOK:
3581  hook = &(dd->postGCHook);
3582  break;
3584  hook = &(dd->preReorderingHook);
3585  break;
3587  hook = &(dd->postReorderingHook);
3588  break;
3589  default:
3590  return(0);
3591  }
3592  /* Scan the list and find whether the function is already there.
3593  ** If so, just return. */
3594  nextHook = *hook;
3595  while (nextHook != NULL) {
3596  if (nextHook->f == f) {
3597  return(2);
3598  }
3599  hook = &(nextHook->next);
3600  nextHook = nextHook->next;
3601  }
3602  /* The function was not in the list. Create a new item and append it
3603  ** to the end of the list. */
3604  newHook = ALLOC(DdHook,1);
3605  if (newHook == NULL) {
3606  dd->errorCode = CUDD_MEMORY_OUT;
3607  return(0);
3608  }
3609  newHook->next = NULL;
3610  newHook->f = f;
3611  *hook = newHook;
3612  return(1);
3613 
3614 } /* end of Cudd_AddHook */
3615 
3616 
3630 int
3632  DdManager * dd,
3633  DD_HFP f,
3634  Cudd_HookType where)
3635 {
3636  DdHook **hook, *nextHook;
3637 
3638  switch (where) {
3639  case CUDD_PRE_GC_HOOK:
3640  hook = &(dd->preGCHook);
3641  break;
3642  case CUDD_POST_GC_HOOK:
3643  hook = &(dd->postGCHook);
3644  break;
3646  hook = &(dd->preReorderingHook);
3647  break;
3649  hook = &(dd->postReorderingHook);
3650  break;
3651  default:
3652  return(0);
3653  }
3654  nextHook = *hook;
3655  while (nextHook != NULL) {
3656  if (nextHook->f == f) {
3657  *hook = nextHook->next;
3658  FREE(nextHook);
3659  return(1);
3660  }
3661  hook = &(nextHook->next);
3662  nextHook = nextHook->next;
3663  }
3664 
3665  return(0);
3666 
3667 } /* end of Cudd_RemoveHook */
3668 
3669 
3683 int
3685  DdManager * dd,
3686  DD_HFP f,
3687  Cudd_HookType where)
3688 {
3689  DdHook *hook;
3690 
3691  switch (where) {
3692  case CUDD_PRE_GC_HOOK:
3693  hook = dd->preGCHook;
3694  break;
3695  case CUDD_POST_GC_HOOK:
3696  hook = dd->postGCHook;
3697  break;
3699  hook = dd->preReorderingHook;
3700  break;
3702  hook = dd->postReorderingHook;
3703  break;
3704  default:
3705  return(0);
3706  }
3707  /* Scan the list and find whether the function is already there. */
3708  while (hook != NULL) {
3709  if (hook->f == f) {
3710  return(1);
3711  }
3712  hook = hook->next;
3713  }
3714  return(0);
3715 
3716 } /* end of Cudd_IsInHook */
3717 
3718 
3732 int
3734  DdManager *dd,
3735  const char *str,
3736  void *data)
3737 {
3739  int retval;
3740 
3741  retval = fprintf(dd->out,"%s reordering with ", str);
3742  if (retval == EOF) return(0);
3743  switch (method) {
3751  retval = fprintf(dd->out,"converging ");
3752  if (retval == EOF) return(0);
3753  break;
3754  default:
3755  break;
3756  }
3757  switch (method) {
3758  case CUDD_REORDER_RANDOM:
3760  retval = fprintf(dd->out,"random");
3761  break;
3762  case CUDD_REORDER_SIFT:
3764  retval = fprintf(dd->out,"sifting");
3765  break;
3768  retval = fprintf(dd->out,"symmetric sifting");
3769  break;
3771  retval = fprintf(dd->out,"lazy sifting");
3772  break;
3775  retval = fprintf(dd->out,"group sifting");
3776  break;
3777  case CUDD_REORDER_WINDOW2:
3778  case CUDD_REORDER_WINDOW3:
3779  case CUDD_REORDER_WINDOW4:
3783  retval = fprintf(dd->out,"window");
3784  break;
3786  retval = fprintf(dd->out,"annealing");
3787  break;
3788  case CUDD_REORDER_GENETIC:
3789  retval = fprintf(dd->out,"genetic");
3790  break;
3791  case CUDD_REORDER_LINEAR:
3793  retval = fprintf(dd->out,"linear sifting");
3794  break;
3795  case CUDD_REORDER_EXACT:
3796  retval = fprintf(dd->out,"exact");
3797  break;
3798  default:
3799  return(0);
3800  }
3801  if (retval == EOF) return(0);
3802 
3803  retval = fprintf(dd->out,": from %ld to ... ", strcmp(str, "BDD") == 0 ?
3805  if (retval == EOF) return(0);
3806  fflush(dd->out);
3807  return(1);
3808 
3809 } /* end of Cudd_StdPreReordHook */
3810 
3811 
3825 int
3827  DdManager *dd,
3828  const char *str,
3829  void *data)
3830 {
3831  unsigned long initialTime = (long) data;
3832  int retval;
3833  unsigned long finalTime = util_cpu_time();
3834  double totalTimeSec = (double)(finalTime - initialTime) / 1000.0;
3835 
3836  retval = fprintf(dd->out,"%ld nodes in %g sec\n", strcmp(str, "BDD") == 0 ?
3838  totalTimeSec);
3839  if (retval == EOF) return(0);
3840  retval = fflush(dd->out);
3841  if (retval == EOF) return(0);
3842  return(1);
3843 
3844 } /* end of Cudd_StdPostReordHook */
3845 
3846 
3860 int
3862  DdManager *dd)
3863 {
3865  return(0);
3866  }
3868  return(0);
3869  }
3870  return(1);
3871 
3872 } /* end of Cudd_EnableReorderingReporting */
3873 
3874 
3888 int
3890  DdManager *dd)
3891 {
3893  return(0);
3894  }
3896  return(0);
3897  }
3898  return(1);
3899 
3900 } /* end of Cudd_DisableReorderingReporting */
3901 
3902 
3915 int
3917  DdManager *dd)
3918 {
3920 
3921 } /* end of Cudd_ReorderingReporting */
3922 
3923 
3938 int
3940  DdManager * dd,
3941  const char *str,
3942  void *data)
3943 {
3944  int isBdd = strcmp(str, "ZDD");
3945  MtrNode *tree = isBdd ? dd->tree : dd->treeZ;
3946  int *invperm = isBdd ? dd->invperm : dd->invpermZ;
3947  int size = isBdd ? dd->size : dd->sizeZ;
3948  if (tree == NULL) {
3949  int i, retval;
3950  for (i=0; i < size; i++) {
3951  retval = fprintf(dd->out, "%c%d", i==0 ? '(' : ',', invperm[i]);
3952  if (retval == EOF) return(0);
3953  }
3954  retval = fprintf(dd->out,")\n");
3955  return (retval != EOF);
3956  } else {
3957  return Mtr_PrintGroupedOrder(tree,invperm,dd->out);
3958  }
3959 
3960 } /* end of Cudd_PrintGroupedOrder */
3961 
3962 
3976 int
3978  DdManager *dd)
3979 {
3981  return(0);
3982  }
3984  return(0);
3985  }
3987  return(0);
3988  }
3990  return(0);
3991  }
3992  return(1);
3993 
3994 } /* end of Cudd_EnableOrderingMonitoring */
3995 
3996 
4010 int
4012  DdManager *dd)
4013 {
4015  return(0);
4016  }
4018  return(0);
4019  }
4021  return(0);
4022  }
4024  return(0);
4025  }
4026  return(1);
4027 
4028 } /* end of Cudd_DisableOrderingMonitoring */
4029 
4030 
4043 int
4045  DdManager *dd)
4046 {
4048 
4049 } /* end of Cudd_OrderingMonitoring */
4050 
4051 
4066  DdManager *dd)
4067 {
4068  return(dd->errorCode);
4069 
4070 } /* end of Cudd_ReadErrorCode */
4071 
4072 
4084 void
4086  DdManager *dd)
4087 {
4088  dd->errorCode = CUDD_NO_ERROR;
4089 
4090 } /* end of Cudd_ClearErrorCode */
4091 
4092 
4106 FILE *
4108  DdManager *dd)
4109 {
4110  return(dd->out);
4111 
4112 } /* end of Cudd_ReadStdout */
4113 
4114 
4126 void
4128  DdManager *dd,
4129  FILE *fp)
4130 {
4131  dd->out = fp;
4132 
4133 } /* end of Cudd_SetStdout */
4134 
4135 
4149 FILE *
4151  DdManager *dd)
4152 {
4153  return(dd->err);
4154 
4155 } /* end of Cudd_ReadStderr */
4156 
4157 
4169 void
4171  DdManager *dd,
4172  FILE *fp)
4173 {
4174  dd->err = fp;
4175 
4176 } /* end of Cudd_SetStderr */
4177 
4178 
4194 unsigned int
4196  DdManager *dd)
4197 {
4198  return(dd->nextDyn);
4199 
4200 } /* end of Cudd_ReadNextReordering */
4201 
4202 
4218 void
4220  DdManager *dd,
4221  unsigned int next)
4222 {
4223  dd->nextDyn = next;
4224 
4225 } /* end of Cudd_SetNextReordering */
4226 
4227 
4239 double
4241  DdManager *dd)
4242 {
4243 #ifdef DD_COUNT
4244  return(dd->swapSteps);
4245 #else
4246  return(-1);
4247 #endif
4248 
4249 } /* end of Cudd_ReadSwapSteps */
4250 
4251 
4264 unsigned int
4266  DdManager *dd)
4267 {
4268  return(dd->maxLive);
4269 
4270 } /* end of Cudd_ReadMaxLive */
4271 
4272 
4285 void
4287  DdManager *dd,
4288  unsigned int maxLive)
4289 {
4290  dd->maxLive = maxLive;
4291 
4292 } /* end of Cudd_SetMaxLive */
4293 
4294 
4307 unsigned long
4309  DdManager *dd)
4310 {
4311  return(dd->maxmemhard);
4312 
4313 } /* end of Cudd_ReadMaxMemory */
4314 
4315 
4328 void
4330  DdManager *dd,
4331  unsigned long maxMemory)
4332 {
4333  dd->maxmemhard = maxMemory;
4334 
4335 } /* end of Cudd_SetMaxMemory */
4336 
4337 
4351 int
4353  DdManager *dd /* manager */,
4354  int index /* variable index */)
4355 {
4356  if (index >= dd->size || index < 0) return(0);
4357  dd->subtables[dd->perm[index]].bindVar = 1;
4358  return(1);
4359 
4360 } /* end of Cudd_bddBindVar */
4361 
4362 
4379 int
4381  DdManager *dd /* manager */,
4382  int index /* variable index */)
4383 {
4384  if (index >= dd->size || index < 0) return(0);
4385  dd->subtables[dd->perm[index]].bindVar = 0;
4386  return(1);
4387 
4388 } /* end of Cudd_bddUnbindVar */
4389 
4390 
4406 int
4408  DdManager *dd /* manager */,
4409  int index /* variable index */)
4410 {
4411  if (index >= dd->size || index < 0) return(0);
4412  return(dd->subtables[dd->perm[index]].bindVar);
4413 
4414 } /* end of Cudd_bddVarIsBound */
4415 
4416 
4429 int
4431  DdManager *dd /* manager */,
4432  int index /* variable index */)
4433 {
4434  if (index >= dd->size || index < 0) return (0);
4435  dd->subtables[dd->perm[index]].varType = CUDD_VAR_PRIMARY_INPUT;
4436  return(1);
4437 
4438 } /* end of Cudd_bddSetPiVar */
4439 
4440 
4453 int
4455  DdManager *dd /* manager */,
4456  int index /* variable index */)
4457 {
4458  if (index >= dd->size || index < 0) return (0);
4459  dd->subtables[dd->perm[index]].varType = CUDD_VAR_PRESENT_STATE;
4460  return(1);
4461 
4462 } /* end of Cudd_bddSetPsVar */
4463 
4464 
4477 int
4479  DdManager *dd /* manager */,
4480  int index /* variable index */)
4481 {
4482  if (index >= dd->size || index < 0) return (0);
4483  dd->subtables[dd->perm[index]].varType = CUDD_VAR_NEXT_STATE;
4484  return(1);
4485 
4486 } /* end of Cudd_bddSetNsVar */
4487 
4488 
4502 int
4504  DdManager *dd /* manager */,
4505  int index /* variable index */)
4506 {
4507  if (index >= dd->size || index < 0) return -1;
4508  return (dd->subtables[dd->perm[index]].varType == CUDD_VAR_PRIMARY_INPUT);
4509 
4510 } /* end of Cudd_bddIsPiVar */
4511 
4512 
4526 int
4528  DdManager *dd,
4529  int index)
4530 {
4531  if (index >= dd->size || index < 0) return -1;
4532  return (dd->subtables[dd->perm[index]].varType == CUDD_VAR_PRESENT_STATE);
4533 
4534 } /* end of Cudd_bddIsPsVar */
4535 
4536 
4550 int
4552  DdManager *dd,
4553  int index)
4554 {
4555  if (index >= dd->size || index < 0) return -1;
4556  return (dd->subtables[dd->perm[index]].varType == CUDD_VAR_NEXT_STATE);
4557 
4558 } /* end of Cudd_bddIsNsVar */
4559 
4560 
4574 int
4576  DdManager *dd /* manager */,
4577  int index /* variable index */,
4578  int pairIndex /* corresponding variable index */)
4579 {
4580  if (index >= dd->size || index < 0) return(0);
4581  dd->subtables[dd->perm[index]].pairIndex = pairIndex;
4582  return(1);
4583 
4584 } /* end of Cudd_bddSetPairIndex */
4585 
4586 
4600 int
4602  DdManager *dd,
4603  int index)
4604 {
4605  if (index >= dd->size || index < 0) return -1;
4606  return dd->subtables[dd->perm[index]].pairIndex;
4607 
4608 } /* end of Cudd_bddReadPairIndex */
4609 
4610 
4623 int
4625  DdManager *dd,
4626  int index)
4627 {
4628  if (index >= dd->size || index < 0) return(0);
4629  if (dd->subtables[dd->perm[index]].varToBeGrouped <= CUDD_LAZY_SOFT_GROUP) {
4631  }
4632  return(1);
4633 
4634 } /* end of Cudd_bddSetVarToBeGrouped */
4635 
4636 
4650 int
4652  DdManager *dd,
4653  int index)
4654 {
4655  if (index >= dd->size || index < 0) return(0);
4657  return(1);
4658 
4659 } /* end of Cudd_bddSetVarHardGrouped */
4660 
4661 
4674 int
4676  DdManager *dd,
4677  int index)
4678 {
4679  if (index >= dd->size || index < 0) return(0);
4680  if (dd->subtables[dd->perm[index]].varToBeGrouped <=
4682  dd->subtables[dd->perm[index]].varToBeGrouped = CUDD_LAZY_NONE;
4683  }
4684  return(1);
4685 
4686 } /* end of Cudd_bddResetVarToBeGrouped */
4687 
4688 
4701 int
4703  DdManager *dd,
4704  int index)
4705 {
4706  if (index >= dd->size || index < 0) return(-1);
4707  if (dd->subtables[dd->perm[index]].varToBeGrouped == CUDD_LAZY_UNGROUP)
4708  return(0);
4709  else
4710  return(dd->subtables[dd->perm[index]].varToBeGrouped);
4711 
4712 } /* end of Cudd_bddIsVarToBeGrouped */
4713 
4714 
4727 int
4729  DdManager *dd,
4730  int index)
4731 {
4732  if (index >= dd->size || index < 0) return(0);
4733  dd->subtables[dd->perm[index]].varToBeGrouped = CUDD_LAZY_UNGROUP;
4734  return(1);
4735 
4736 } /* end of Cudd_bddSetVarToBeGrouped */
4737 
4738 
4753 int
4755  DdManager *dd,
4756  int index)
4757 {
4758  if (index >= dd->size || index < 0) return(-1);
4759  return dd->subtables[dd->perm[index]].varToBeGrouped == CUDD_LAZY_UNGROUP;
4760 
4761 } /* end of Cudd_bddIsVarToBeGrouped */
4762 
4763 
4778 int
4780  DdManager *dd,
4781  int index)
4782 {
4783  if (index >= dd->size || index < 0) return(-1);
4784  if (dd->subtables[dd->perm[index]].varToBeGrouped == CUDD_LAZY_HARD_GROUP)
4785  return(1);
4786  return(0);
4787 
4788 } /* end of Cudd_bddIsVarToBeGrouped */
4789 
4790 
4791 /*---------------------------------------------------------------------------*/
4792 /* Definition of internal functions */
4793 /*---------------------------------------------------------------------------*/
4794 
4795 /*---------------------------------------------------------------------------*/
4796 /* Definition of static functions */
4797 /*---------------------------------------------------------------------------*/
4798 
4799 
4811 static void
4813  MtrNode * treenode,
4814  int * perm,
4815  int size)
4816 {
4817  treenode->index = treenode->low;
4818  treenode->low = ((int) treenode->index < size) ?
4819  perm[treenode->index] : treenode->index;
4820  if (treenode->child != NULL)
4821  fixVarTree(treenode->child, perm, size);
4822  if (treenode->younger != NULL)
4823  fixVarTree(treenode->younger, perm, size);
4824  return;
4825 
4826 } /* end of fixVarTree */
4827 
4828 
4854 static int
4856  DdManager *dd /* manager */,
4857  MtrNode *treenode /* current tree node */,
4858  int multiplicity /* how many ZDD vars per BDD var */,
4859  char *vmask /* variable pairs for which a group has been already built */,
4860  char *lmask /* levels for which a group has already been built*/)
4861 {
4862  int startV, stopV, startL;
4863  int i, j;
4864  MtrNode *auxnode = treenode;
4865 
4866  while (auxnode != NULL) {
4867  if (auxnode->child != NULL) {
4868  addMultiplicityGroups(dd,auxnode->child,multiplicity,vmask,lmask);
4869  }
4870  /* Build remaining groups. */
4871  startV = dd->permZ[auxnode->index] / multiplicity;
4872  startL = auxnode->low / multiplicity;
4873  stopV = startV + auxnode->size / multiplicity;
4874  /* Walk down vmask starting at startV and build missing groups. */
4875  for (i = startV, j = startL; i < stopV; i++) {
4876  if (vmask[i] == 0) {
4877  MtrNode *node;
4878  while (lmask[j] == 1) j++;
4879  node = Mtr_MakeGroup(auxnode, j * multiplicity, multiplicity,
4880  MTR_FIXED);
4881  if (node == NULL) {
4882  return(0);
4883  }
4884  node->index = dd->invpermZ[i * multiplicity];
4885  vmask[i] = 1;
4886  lmask[j] = 1;
4887  }
4888  }
4889  auxnode = auxnode->younger;
4890  }
4891  return(1);
4892 
4893 } /* end of addMultiplicityGroups */
int Cudd_bddIsPiVar(DdManager *dd, int index)
Definition: cuddAPI.c:4503
long Cudd_ReadNodeCount(DdManager *dd)
Definition: cuddAPI.c:3504
int Cudd_bddResetVarToBeGrouped(DdManager *dd, int index)
Definition: cuddAPI.c:4675
DdNode * Cudd_bddNewVarAtLevel(DdManager *dd, int level)
Definition: cuddAPI.c:365
DdHalfWord ref
Definition: cudd.h:272
void Cudd_ResetStartTime(DdManager *unique)
Definition: cuddAPI.c:743
#define cuddRef(n)
Definition: cuddInt.h:557
Cudd_AggregationType groupcheck
Definition: cuddInt.h:410
unsigned int keys
Definition: cuddInt.h:314
MtrNode * Cudd_ReadZddTree(DdManager *dd)
Definition: cuddAPI.c:2486
void Cudd_RecursiveDerefZdd(DdManager *table, DdNode *n)
Definition: cuddRef.c:381
DdNode * Cudd_ReadZero(DdManager *dd)
Definition: cuddAPI.c:1276
unsigned int Cudd_ReadDead(DdManager *dd)
Definition: cuddAPI.c:1886
DdNode * Cudd_ReadZddOne(DdManager *dd, int i)
Definition: cuddAPI.c:1250
void Cudd_SetMinHit(DdManager *dd, unsigned int hr)
Definition: cuddAPI.c:1538
void Cudd_SetStdout(DdManager *dd, FILE *fp)
Definition: cuddAPI.c:4127
void Cudd_SetMaxCacheHard(DdManager *dd, unsigned int mc)
Definition: cuddAPI.c:1655
void Cudd_UnsetTimeLimit(DdManager *unique)
Definition: cuddAPI.c:864
#define cuddDeref(n)
Definition: cuddInt.h:577
int Cudd_OrderingMonitoring(DdManager *dd)
Definition: cuddAPI.c:4044
unsigned long reordTime
Definition: cuddInt.h:434
Cudd_AggregationType
Definition: cudd.h:180
int Cudd_StdPostReordHook(DdManager *dd, const char *str, void *data)
Definition: cuddAPI.c:3826
int strcmp()
int Cudd_bddIsPsVar(DdManager *dd, int index)
Definition: cuddAPI.c:4527
Cudd_ReorderingType autoMethod
Definition: cuddInt.h:402
int Cudd_bddReadPairIndex(DdManager *dd, int index)
Definition: cuddAPI.c:4601
unsigned int peakLiveNodes
Definition: cuddInt.h:445
void Cudd_SetArcviolation(DdManager *dd, int arcviolation)
Definition: cuddAPI.c:3072
void Cudd_SetTimeLimit(DdManager *unique, unsigned long tl)
Definition: cuddAPI.c:786
double allocated
Definition: cuddInt.h:365
DdNode * Cudd_zddIthVar(DdManager *dd, int i)
Definition: cuddAPI.c:462
int Cudd_bddUnbindVar(DdManager *dd, int index)
Definition: cuddAPI.c:4380
int Cudd_ReadSiftMaxSwap(DdManager *dd)
Definition: cuddAPI.c:2220
Definition: cudd.h:270
void Cudd_SetStderr(DdManager *dd, FILE *fp)
Definition: cuddAPI.c:4170
#define Cudd_Not(node)
Definition: cudd.h:354
#define DD_MAX_CACHE_FRACTION
Definition: cuddInt.h:141
unsigned int deadZ
Definition: cuddInt.h:356
void Cudd_TurnOffCountDead(DdManager *dd)
Definition: cuddAPI.c:2915
MtrHalfWord size
Definition: mtr.h:129
DdNode * Cudd_ReadBackground(DdManager *dd)
Definition: cuddAPI.c:1352
#define FREE(obj)
Definition: util.h:80
void Cudd_SetMaxGrowth(DdManager *dd, double mg)
Definition: cuddAPI.c:2295
double Cudd_ExpectedUsedSlots(DdManager *dd)
Definition: cuddAPI.c:1812
int siftMaxSwap
Definition: cuddInt.h:396
void Cudd_SetBackground(DdManager *dd, DdNode *bck)
Definition: cuddAPI.c:1371
DdHook * preReorderingHook
Definition: cuddInt.h:421
unsigned deadMask
Definition: cuddInt.h:387
unsigned long startTime
Definition: cuddInt.h:426
void Cudd_SetTree(DdManager *dd, MtrNode *tree)
Definition: cuddAPI.c:2434
int * invpermZ
Definition: cuddInt.h:372
int reordCycle
Definition: cuddInt.h:399
unsigned int Cudd_ReadMaxCache(DdManager *dd)
Definition: cuddAPI.c:1611
long Cudd_ReadPeakNodeCount(DdManager *dd)
Definition: cuddAPI.c:3449
DdNode * cuddUniqueConst(DdManager *unique, CUDD_VALUE_TYPE value)
Definition: cuddTable.c:1479
int Cudd_ReorderingStatusZdd(DdManager *unique, Cudd_ReorderingType *method)
Definition: cuddAPI.c:1052
int Cudd_StdPreReordHook(DdManager *dd, const char *str, void *data)
Definition: cuddAPI.c:3733
int size
Definition: cuddInt.h:345
int Cudd_ReadRecomb(DdManager *dd)
Definition: cuddAPI.c:2939
int Cudd_bddBindVar(DdManager *dd, int index)
Definition: cuddAPI.c:4352
int Cudd_bddSetPairIndex(DdManager *dd, int index, int pairIndex)
Definition: cuddAPI.c:4575
double Cudd_ReadSwapSteps(DdManager *dd)
Definition: cuddAPI.c:4240
#define Cudd_IsConstant(node)
Definition: cudd.h:339
unsigned int maxCacheHard
Definition: cuddInt.h:343
Cudd_ErrorType
Definition: cudd.h:216
unsigned int slots
Definition: cuddInt.h:352
DdNode * Cudd_ReadLogicZero(DdManager *dd)
Definition: cuddAPI.c:1298
ptruint h
Definition: cuddInt.h:303
#define Cudd_Regular(node)
Definition: cudd.h:384
unsigned int Cudd_ReadOrderRandomization(DdManager *dd)
Definition: cuddAPI.c:3201
#define DD_MAX_LOOSE_FRACTION
Definition: cuddInt.h:139
double maxGrowthAlt
Definition: cuddInt.h:398
int Cudd_bddSetNsVar(DdManager *dd, int index)
Definition: cuddAPI.c:4478
int realign
Definition: cuddInt.h:404
int Cudd_ReadZddSize(DdManager *dd)
Definition: cuddAPI.c:1701
void Cudd_SetZddTree(DdManager *dd, MtrNode *tree)
Definition: cuddAPI.c:2506
double maxGrowth
Definition: cuddInt.h:397
int Cudd_IsNonConstant(DdNode *f)
Definition: cuddAPI.c:659
unsigned int Cudd_ReadCacheSlots(DdManager *dd)
Definition: cuddAPI.c:1392
int Cudd_AddHook(DdManager *dd, DD_HFP f, Cudd_HookType where)
Definition: cuddAPI.c:3569
Cudd_AggregationType Cudd_ReadGroupcheck(DdManager *dd)
Definition: cuddAPI.c:2756
unsigned int Cudd_ReadMaxCacheHard(DdManager *dd)
Definition: cuddAPI.c:1631
FILE * err
Definition: cuddInt.h:424
int garbageCollections
Definition: cuddInt.h:432
int Cudd_bddIsNsVar(DdManager *dd, int index)
Definition: cuddAPI.c:4551
int populationSize
Definition: cuddInt.h:414
void Cudd_FreeZddTree(DdManager *dd)
Definition: cuddAPI.c:2534
double Cudd_ReadNodesDropped(DdManager *dd)
Definition: cuddAPI.c:2092
int Cudd_GarbageCollectionEnabled(DdManager *dd)
Definition: cuddAPI.c:2799
unsigned int Cudd_ReadMinHit(DdManager *dd)
Definition: cuddAPI.c:1512
int Cudd_DeadAreCounted(DdManager *dd)
Definition: cuddAPI.c:2867
int cuddCacheProfile(DdManager *table, FILE *fp)
Definition: cuddCache.c:749
void Mtr_FreeTree(MtrNode *node)
Definition: mtrBasic.c:187
void Cudd_bddRealignEnable(DdManager *unique)
Definition: cuddAPI.c:1183
#define MTR_FIXED
Definition: mtr.h:97
int Cudd_bddSetVarHardGroup(DdManager *dd, int index)
Definition: cuddAPI.c:4651
unsigned int Cudd_ReadSlots(DdManager *dd)
Definition: cuddAPI.c:1720
unsigned long Cudd_ReadMemoryInUse(DdManager *dd)
Definition: cuddAPI.c:3242
void Cudd_AutodynDisable(DdManager *unique)
Definition: cuddAPI.c:948
DdNode * Cudd_ReadVars(DdManager *dd, int i)
Definition: cuddAPI.c:2689
Cudd_ReorderingType autoMethodZ
Definition: cuddInt.h:403
int bindVar
Definition: cuddInt.h:318
void Cudd_bddRealignDisable(DdManager *unique)
Definition: cuddAPI.c:1205
void Cudd_ClearErrorCode(DdManager *dd)
Definition: cuddAPI.c:4085
DdNode * Cudd_addNewVar(DdManager *dd)
Definition: cuddAPI.c:273
DdSubtable * subtables
Definition: cuddInt.h:349
int * permZ
Definition: cuddInt.h:370
double cachecollisions
Definition: cuddInt.h:437
void Cudd_TurnOnCountDead(DdManager *dd)
Definition: cuddAPI.c:2890
int Cudd_IsInHook(DdManager *dd, DD_HFP f, Cudd_HookType where)
Definition: cuddAPI.c:3684
MtrNode * tree
Definition: cuddInt.h:408
int Cudd_bddSetPsVar(DdManager *dd, int index)
Definition: cuddAPI.c:4454
int Cudd_DisableOrderingMonitoring(DdManager *dd)
Definition: cuddAPI.c:4011
Cudd_ErrorType Cudd_ReadErrorCode(DdManager *dd)
Definition: cuddAPI.c:4065
DdNode * Cudd_ReadMinusInfinity(DdManager *dd)
Definition: cuddAPI.c:1334
DD_HFP f
Definition: cuddInt.h:241
int Cudd_ReadArcviolation(DdManager *dd)
Definition: cuddAPI.c:3046
DdNode ** deathRow
Definition: cuddInt.h:384
double cacheinserts
Definition: cuddInt.h:438
double Cudd_ReadUniqueLinks(DdManager *dd)
Definition: cuddAPI.c:2147
void Cudd_SetOrderRandomization(DdManager *dd, unsigned int factor)
Definition: cuddAPI.c:3221
void Cudd_UpdateTimeLimit(DdManager *unique)
Definition: cuddAPI.c:809
void Cudd_SetGroupcheck(DdManager *dd, Cudd_AggregationType gc)
Definition: cuddAPI.c:2778
#define DD_MINUS_INFINITY(dd)
Definition: cuddInt.h:908
DdNode * Cudd_bddIthVar(DdManager *dd, int i)
Definition: cuddAPI.c:430
void Cudd_SetSiftMaxVar(DdManager *dd, int smv)
Definition: cuddAPI.c:2195
void Cudd_DisableGarbageCollection(DdManager *dd)
Definition: cuddAPI.c:2845
int Cudd_PrintGroupedOrder(DdManager *dd, const char *str, void *data)
Definition: cuddAPI.c:3939
void Cudd_AutodynEnable(DdManager *unique, Cudd_ReorderingType method)
Definition: cuddAPI.c:909
unsigned int countDead
Definition: cuddInt.h:407
struct MtrNode * younger
Definition: mtr.h:134
unsigned int randomizeOrder
Definition: cuddInt.h:416
Cudd_VariableType varType
Definition: cuddInt.h:320
int reordered
Definition: cuddInt.h:392
unsigned int nextDyn
Definition: cuddInt.h:406
unsigned int dead
Definition: cuddInt.h:355
unsigned int Cudd_ReadKeys(DdManager *dd)
Definition: cuddAPI.c:1866
void Cudd_AutodynEnableZdd(DdManager *unique, Cudd_ReorderingType method)
Definition: cuddAPI.c:1000
unsigned int cacheSlots
Definition: cuddInt.h:337
void Cudd_SetMaxMemory(DdManager *dd, unsigned long maxMemory)
Definition: cuddAPI.c:4329
unsigned int maxLive
Definition: cuddInt.h:357
int recomb
Definition: cuddInt.h:411
DdNode sentinel
Definition: cuddInt.h:328
MtrHalfWord index
Definition: mtr.h:130
int Cudd_zddShuffleHeap(DdManager *table, int *permutation)
Definition: cuddZddReord.c:300
Cudd_HookType
Definition: cudd.h:201
DdHook * postReorderingHook
Definition: cuddInt.h:422
int Cudd_TimeLimited(DdManager *unique)
Definition: cuddAPI.c:885
unsigned int keys
Definition: cuddInt.h:353
int Cudd_ReadReorderingCycle(DdManager *dd)
Definition: cuddAPI.c:2370
#define ALLOC(type, num)
Definition: util.h:76
int Cudd_EnableOrderingMonitoring(DdManager *dd)
Definition: cuddAPI.c:3977
FILE * out
Definition: cuddInt.h:423
int cuddResizeTableZdd(DdManager *unique, int index)
Definition: cuddTable.c:2270
int Cudd_ReadSymmviolation(DdManager *dd)
Definition: cuddAPI.c:2992
void Cudd_EnableGarbageCollection(DdManager *dd)
Definition: cuddAPI.c:2821
int realignZ
Definition: cuddInt.h:405
DdCache * cache
Definition: cuddInt.h:336
int Cudd_PrintInfo(DdManager *dd, FILE *fp)
Definition: cuddAPI.c:3263
DdNode * Cudd_addNewVarAtLevel(DdManager *dd, int level)
Definition: cuddAPI.c:304
void Cudd_SetPopulationSize(DdManager *dd, int populationSize)
Definition: cuddAPI.c:3125
Cudd_LazyGroupType varToBeGrouped
Definition: cuddInt.h:323
int cuddInsertSubtables(DdManager *unique, int n, int level)
Definition: cuddTable.c:1824
void Cudd_SetRecomb(DdManager *dd, int recomb)
Definition: cuddAPI.c:2964
double totCacheMisses
Definition: cuddInt.h:436
static int addMultiplicityGroups(DdManager *dd, MtrNode *treenode, int multiplicity, char *vmask, char *lmask)
Definition: cuddAPI.c:4855
int(* DD_HFP)(DdManager *, const char *, void *)
Definition: cudd.h:299
int Cudd_EnableReorderingReporting(DdManager *dd)
Definition: cuddAPI.c:3861
unsigned int Cudd_ReadMaxReorderings(DdManager *dd)
Definition: cuddAPI.c:1957
DdNode * Cudd_bddNewVar(DdManager *dd)
Definition: cuddAPI.c:337
unsigned int Cudd_ReadNextReordering(DdManager *dd)
Definition: cuddAPI.c:4195
void Cudd_SetSymmviolation(DdManager *dd, int symmviolation)
Definition: cuddAPI.c:3019
int gcEnabled
Definition: cuddInt.h:360
unsigned int Cudd_ReadMinDead(DdManager *dd)
Definition: cuddAPI.c:1910
int symmviolation
Definition: cuddInt.h:412
int numberXovers
Definition: cuddInt.h:415
double Cudd_ReadCacheLookUps(DdManager *dd)
Definition: cuddAPI.c:1444
unsigned long getSoftDataLimit(void)
Definition: datalimit.c:35
#define CUDD_CONST_INDEX
Definition: cudd.h:113
void Cudd_SetMaxGrowthAlternate(DdManager *dd, double mg)
Definition: cuddAPI.c:2346
DdNode * Cudd_ReadPlusInfinity(DdManager *dd)
Definition: cuddAPI.c:1316
DdNode ** nodelist
Definition: cuddInt.h:311
void Cudd_SetNumberXovers(DdManager *dd, int numberXovers)
Definition: cuddAPI.c:3178
int Cudd_ReadPopulationSize(DdManager *dd)
Definition: cuddAPI.c:3099
long Cudd_zddReadNodeCount(DdManager *dd)
Definition: cuddAPI.c:3546
double Cudd_ReadMaxGrowthAlternate(DdManager *dd)
Definition: cuddAPI.c:2321
int Cudd_bddRealignmentEnabled(DdManager *unique)
Definition: cuddAPI.c:1153
int Cudd_bddSetVarToBeUngrouped(DdManager *dd, int index)
Definition: cuddAPI.c:4728
double cacheHits
Definition: cuddInt.h:340
DdNode * cuddUniqueInterZdd(DdManager *unique, int index, DdNode *T, DdNode *E)
Definition: cuddTable.c:1372
int Cudd_ReadSize(DdManager *dd)
Definition: cuddAPI.c:1681
MtrHalfWord low
Definition: mtr.h:128
double Cudd_ReadCacheUsedSlots(DdManager *dd)
Definition: cuddAPI.c:1415
int Cudd_ReadPeakLiveNodeCount(DdManager *dd)
Definition: cuddAPI.c:3476
int Cudd_ReadPerm(DdManager *dd, int i)
Definition: cuddAPI.c:2583
void Cudd_SetReorderingCycle(DdManager *dd, int cycle)
Definition: cuddAPI.c:2393
void Cudd_SetMaxLive(DdManager *dd, unsigned int maxLive)
Definition: cuddAPI.c:4286
int cacheSlack
Definition: cuddInt.h:342
long util_cpu_time(void)
Definition: cpu_time.c:34
int Cudd_bddSetVarToBeGrouped(DdManager *dd, int index)
Definition: cuddAPI.c:4624
double Cudd_ReadUsedSlots(DdManager *dd)
Definition: cuddAPI.c:1743
int nextDead
Definition: cuddInt.h:386
Definition: mtr.h:126
void Cudd_SetNextReordering(DdManager *dd, unsigned int next)
Definition: cuddAPI.c:4219
int Cudd_bddVarIsBound(DdManager *dd, int index)
Definition: cuddAPI.c:4407
unsigned int Cudd_ReadReorderings(DdManager *dd)
Definition: cuddAPI.c:1936
unsigned long GCTime
Definition: cuddInt.h:433
void Cudd_AutodynDisableZdd(DdManager *unique)
Definition: cuddAPI.c:1026
int Cudd_bddIsVarToBeGrouped(DdManager *dd, int index)
Definition: cuddAPI.c:4702
DdNode ** memoryList
Definition: cuddInt.h:380
unsigned int maxReorderings
Definition: cuddInt.h:394
int Cudd_zddVarsFromBddVars(DdManager *dd, int multiplicity)
Definition: cuddAPI.c:533
unsigned int Cudd_ReadMaxLive(DdManager *dd)
Definition: cuddAPI.c:4265
double Cudd_ReadCacheHits(DdManager *dd)
Definition: cuddAPI.c:1465
unsigned long memused
Definition: cuddInt.h:429
int siftMaxVar
Definition: cuddInt.h:395
int Cudd_ReorderingReporting(DdManager *dd)
Definition: cuddAPI.c:3916
void Cudd_SetSiftMaxSwap(DdManager *dd, int sms)
Definition: cuddAPI.c:2244
int Cudd_zddRealignmentEnabled(DdManager *unique)
Definition: cuddAPI.c:1077
unsigned int ptruint
Definition: cuddInt.h:250
unsigned int Cudd_ReadLooseUpTo(DdManager *dd)
Definition: cuddAPI.c:1561
DdNode * Cudd_addIthVar(DdManager *dd, int i)
Definition: cuddAPI.c:398
int Mtr_PrintGroupedOrder(MtrNode *root, int *invperm, FILE *fp)
Definition: mtrGroup.c:662
#define CUDD_VALUE_TYPE
Definition: cudd.h:90
int deathRowDepth
Definition: cuddInt.h:385
MtrNode * Mtr_InitGroupTree(int lower, int size)
Definition: mtrGroup.c:120
int Cudd_ReadSiftMaxVar(DdManager *dd)
Definition: cuddAPI.c:2173
int Cudd_bddIsVarHardGroup(DdManager *dd, int index)
Definition: cuddAPI.c:4779
long Cudd_ReadReorderingTime(DdManager *dd)
Definition: cuddAPI.c:2000
double Cudd_ReadMaxGrowth(DdManager *dd)
Definition: cuddAPI.c:2270
struct DdHook * next
Definition: cuddInt.h:242
int Cudd_ReadGarbageCollections(DdManager *dd)
Definition: cuddAPI.c:2023
#define REALLOC(type, obj, num)
Definition: util.h:78
int Cudd_ReadNumberXovers(DdManager *dd)
Definition: cuddAPI.c:3152
MtrNode * Cudd_ReadTree(DdManager *dd)
Definition: cuddAPI.c:2414
unsigned long Cudd_ReadMaxMemory(DdManager *dd)
Definition: cuddAPI.c:4308
void cuddClearDeathRow(DdManager *table)
Definition: cuddRef.c:722
int Cudd_ReadPermZdd(DdManager *dd, int i)
Definition: cuddAPI.c:2610
int sizeZ
Definition: cuddInt.h:346
DdHalfWord index
Definition: cudd.h:271
unsigned int looseUpTo
Definition: cuddInt.h:361
unsigned int slots
Definition: cuddInt.h:313
unsigned int reorderings
Definition: cuddInt.h:393
DdNode ** vars
Definition: cuddInt.h:373
double cacheMisses
Definition: cuddInt.h:339
unsigned long maxmemhard
Definition: cuddInt.h:431
DdHook * postGCHook
Definition: cuddInt.h:420
int Cudd_ReorderingStatus(DdManager *unique, Cudd_ReorderingType *method)
Definition: cuddAPI.c:975
int pairIndex
Definition: cuddInt.h:321
double Cudd_ReadUniqueLookUps(DdManager *dd)
Definition: cuddAPI.c:2118
double minHit
Definition: cuddInt.h:341
int Cudd_ReadInvPermZdd(DdManager *dd, int i)
Definition: cuddAPI.c:2662
CUDD_VALUE_TYPE epsilon
Definition: cuddInt.h:390
DdNode * one
Definition: cuddInt.h:329
#define CUDD_MAXINDEX
Definition: cudd.h:108
double Cudd_ReadNodesFreed(DdManager *dd)
Definition: cuddAPI.c:2066
MtrNode * treeZ
Definition: cuddInt.h:409
int autoDynZ
Definition: cuddInt.h:401
void Cudd_SetLooseUpTo(DdManager *dd, unsigned int lut)
Definition: cuddAPI.c:1585
#define DD_PLUS_INFINITY(dd)
Definition: cuddInt.h:894
DdNode * plusinfinity
Definition: cuddInt.h:331
DdNode * Cudd_ReadOne(DdManager *dd)
Definition: cuddAPI.c:1227
unsigned long Cudd_ReadElapsedTime(DdManager *unique)
Definition: cuddAPI.c:701
DdNode * Cudd_addConst(DdManager *dd, CUDD_VALUE_TYPE c)
Definition: cuddAPI.c:634
int Cudd_DisableReorderingReporting(DdManager *dd)
Definition: cuddAPI.c:3889
void Cudd_SetMaxReorderings(DdManager *dd, unsigned int mr)
Definition: cuddAPI.c:1978
int arcviolation
Definition: cuddInt.h:413
void Cudd_FreeTree(DdManager *dd)
Definition: cuddAPI.c:2462
void Cudd_zddRealignDisable(DdManager *unique)
Definition: cuddAPI.c:1129
int Cudd_bddSetPiVar(DdManager *dd, int index)
Definition: cuddAPI.c:4430
int * invperm
Definition: cuddInt.h:371
DdSubtable constants
Definition: cuddInt.h:351
double cachedeletions
Definition: cuddInt.h:440
DdNode * minusinfinity
Definition: cuddInt.h:332
void Cudd_SetEpsilon(DdManager *dd, CUDD_VALUE_TYPE ep)
Definition: cuddAPI.c:2733
#define DD_MEM_CHUNK
Definition: cuddInt.h:105
FILE * Cudd_ReadStdout(DdManager *dd)
Definition: cuddAPI.c:4107
MtrNode * Mtr_MakeGroup(MtrNode *root, unsigned int low, unsigned int high, unsigned int flags)
Definition: mtrGroup.c:156
int autoDyn
Definition: cuddInt.h:400
static void fixVarTree(MtrNode *treenode, int *perm, int size)
Definition: cuddAPI.c:4812
static DdNode * empty
Definition: cuddZddLin.c:94
#define DD_ONE(dd)
Definition: cuddInt.h:864
unsigned int keysZ
Definition: cuddInt.h:354
unsigned int Cudd_NodeReadIndex(DdNode *node)
Definition: cuddAPI.c:2559
MtrNode * Mtr_CopyTree(MtrNode *node, int expansion)
Definition: mtrBasic.c:214
DdHook * preGCHook
Definition: cuddInt.h:419
double Cudd_ReadRecursiveCalls(DdManager *dd)
Definition: cuddAPI.c:1486
Cudd_ReorderingType
Definition: cudd.h:147
static char rcsid [] DD_UNUSED
Definition: cuddAPI.c:232
long Cudd_ReadGarbageCollectionTime(DdManager *dd)
Definition: cuddAPI.c:2044
struct MtrNode * child
Definition: mtr.h:132
int * perm
Definition: cuddInt.h:369
unsigned long timeLimit
Definition: cuddInt.h:427
int Cudd_RemoveHook(DdManager *dd, DD_HFP f, Cudd_HookType where)
Definition: cuddAPI.c:3631
int Cudd_bddIsVarToBeUngrouped(DdManager *dd, int index)
Definition: cuddAPI.c:4754
Cudd_ErrorType errorCode
Definition: cuddInt.h:425
DdNode * cuddUniqueInter(DdManager *unique, int index, DdNode *T, DdNode *E)
Definition: cuddTable.c:1137
CUDD_VALUE_TYPE Cudd_ReadEpsilon(DdManager *dd)
Definition: cuddAPI.c:2712
unsigned int minDead
Definition: cuddInt.h:358
unsigned long Cudd_ReadStartTime(DdManager *unique)
Definition: cuddAPI.c:681
void Cudd_zddRealignEnable(DdManager *unique)
Definition: cuddAPI.c:1107
unsigned long Cudd_ReadTimeLimit(DdManager *unique)
Definition: cuddAPI.c:765
int Cudd_ReadInvPerm(DdManager *dd, int i)
Definition: cuddAPI.c:2636
double reclaimed
Definition: cuddInt.h:367
FILE * Cudd_ReadStderr(DdManager *dd)
Definition: cuddAPI.c:4150
void Cudd_IncreaseTimeLimit(DdManager *unique, unsigned long increase)
Definition: cuddAPI.c:838
DdNode * background
Definition: cuddInt.h:333
void Cudd_SetStartTime(DdManager *unique, unsigned long st)
Definition: cuddAPI.c:722
DdSubtable * subtableZ
Definition: cuddInt.h:350
double totCachehits
Definition: cuddInt.h:435
DdNode ** univ
Definition: cuddInt.h:375
#define DD_NON_CONSTANT
Definition: cuddInt.h:124
#define DD_ZERO(dd)
Definition: cuddInt.h:880