summaryrefslogtreecommitdiffstats
path: root/src/bdd/cudd/cuddApa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bdd/cudd/cuddApa.c')
-rw-r--r--src/bdd/cudd/cuddApa.c930
1 files changed, 0 insertions, 930 deletions
diff --git a/src/bdd/cudd/cuddApa.c b/src/bdd/cudd/cuddApa.c
deleted file mode 100644
index 47ab51e8..00000000
--- a/src/bdd/cudd/cuddApa.c
+++ /dev/null
@@ -1,930 +0,0 @@
-/**CFile***********************************************************************
-
- FileName [cuddApa.c]
-
- PackageName [cudd]
-
- Synopsis [Arbitrary precision arithmetic functions.]
-
- Description [External procedures included in this module:
- <ul>
- <li>
- </ul>
- Internal procedures included in this module:
- <ul>
- <li> ()
- </ul>
- Static procedures included in this module:
- <ul>
- <li> ()
- </ul>]
-
- Author [Fabio Somenzi]
-
- Copyright [This file was created at the University of Colorado at
- Boulder. The University of Colorado at Boulder makes no warranty
- about the suitability of this software for any purpose. It is
- presented on an AS IS basis.]
-
-******************************************************************************/
-
-#include "util_hack.h"
-#include "cuddInt.h"
-
-/*---------------------------------------------------------------------------*/
-/* Constant declarations */
-/*---------------------------------------------------------------------------*/
-
-/*---------------------------------------------------------------------------*/
-/* Stucture declarations */
-/*---------------------------------------------------------------------------*/
-
-/*---------------------------------------------------------------------------*/
-/* Type declarations */
-/*---------------------------------------------------------------------------*/
-
-/*---------------------------------------------------------------------------*/
-/* Variable declarations */
-/*---------------------------------------------------------------------------*/
-
-#ifndef lint
-static char rcsid[] DD_UNUSED = "$Id: cuddApa.c,v 1.1.1.1 2003/02/24 22:23:51 wjiang Exp $";
-#endif
-
-static DdNode *background, *zero;
-
-/*---------------------------------------------------------------------------*/
-/* Macro declarations */
-/*---------------------------------------------------------------------------*/
-
-
-/**AutomaticStart*************************************************************/
-
-/*---------------------------------------------------------------------------*/
-/* Static function prototypes */
-/*---------------------------------------------------------------------------*/
-
-static DdApaNumber cuddApaCountMintermAux ARGS((DdNode * node, int digits, DdApaNumber max, DdApaNumber min, st_table * table));
-static enum st_retval cuddApaStCountfree ARGS((char * key, char * value, char * arg));
-
-/**AutomaticEnd***************************************************************/
-
-
-/*---------------------------------------------------------------------------*/
-/* Definition of exported functions */
-/*---------------------------------------------------------------------------*/
-
-
-/**Function********************************************************************
-
- Synopsis [Finds the number of digits for an arbitrary precision
- integer.]
-
- Description [Finds the number of digits for an arbitrary precision
- integer given the maximum number of binary digits. The number of
- binary digits should be positive. Returns the number of digits if
- successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso []
-
-******************************************************************************/
-int
-Cudd_ApaNumberOfDigits(
- int binaryDigits)
-{
- int digits;
-
- digits = binaryDigits / DD_APA_BITS;
- if ((digits * DD_APA_BITS) != binaryDigits)
- digits++;
- return(digits);
-
-} /* end of Cudd_ApaNumberOfDigits */
-
-
-/**Function********************************************************************
-
- Synopsis [Allocates memory for an arbitrary precision integer.]
-
- Description [Allocates memory for an arbitrary precision
- integer. Returns a pointer to the allocated memory if successful;
- NULL otherwise.]
-
- SideEffects [None]
-
- SeeAlso []
-
-******************************************************************************/
-DdApaNumber
-Cudd_NewApaNumber(
- int digits)
-{
- return(ALLOC(DdApaDigit, digits));
-
-} /* end of Cudd_NewApaNumber */
-
-
-/**Function********************************************************************
-
- Synopsis [Makes a copy of an arbitrary precision integer.]
-
- Description [Makes a copy of an arbitrary precision integer.]
-
- SideEffects [Changes parameter <code>dest</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-void
-Cudd_ApaCopy(
- int digits,
- DdApaNumber source,
- DdApaNumber dest)
-{
- int i;
-
- for (i = 0; i < digits; i++) {
- dest[i] = source[i];
- }
-
-} /* end of Cudd_ApaCopy */
-
-
-/**Function********************************************************************
-
- Synopsis [Adds two arbitrary precision integers.]
-
- Description [Adds two arbitrary precision integers. Returns the
- carry out of the most significant digit.]
-
- SideEffects [The result of the sum is stored in parameter <code>sum</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-DdApaDigit
-Cudd_ApaAdd(
- int digits,
- DdApaNumber a,
- DdApaNumber b,
- DdApaNumber sum)
-{
- int i;
- DdApaDoubleDigit partial = 0;
-
- for (i = digits - 1; i >= 0; i--) {
- partial = a[i] + b[i] + DD_MSDIGIT(partial);
- sum[i] = (DdApaDigit) DD_LSDIGIT(partial);
- }
- return(DD_MSDIGIT(partial));
-
-} /* end of Cudd_ApaAdd */
-
-
-/**Function********************************************************************
-
- Synopsis [Subtracts two arbitrary precision integers.]
-
- Description [Subtracts two arbitrary precision integers. Returns the
- borrow out of the most significant digit.]
-
- SideEffects [The result of the subtraction is stored in parameter
- <code>diff</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-DdApaDigit
-Cudd_ApaSubtract(
- int digits,
- DdApaNumber a,
- DdApaNumber b,
- DdApaNumber diff)
-{
- int i;
- DdApaDoubleDigit partial = DD_APA_BASE;
-
- for (i = digits - 1; i >= 0; i--) {
- partial = a[i] - b[i] + DD_MSDIGIT(partial) + DD_APA_MASK;
- diff[i] = (DdApaDigit) DD_LSDIGIT(partial);
- }
- return(DD_MSDIGIT(partial) - 1);
-
-} /* end of Cudd_ApaSubtract */
-
-
-/**Function********************************************************************
-
- Synopsis [Divides an arbitrary precision integer by a digit.]
-
- Description [Divides an arbitrary precision integer by a digit.]
-
- SideEffects [The quotient is returned in parameter <code>quotient</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-DdApaDigit
-Cudd_ApaShortDivision(
- int digits,
- DdApaNumber dividend,
- DdApaDigit divisor,
- DdApaNumber quotient)
-{
- int i;
- DdApaDigit remainder;
- DdApaDoubleDigit partial;
-
- remainder = 0;
- for (i = 0; i < digits; i++) {
- partial = remainder * DD_APA_BASE + dividend[i];
- quotient[i] = (DdApaDigit) (partial/(DdApaDoubleDigit)divisor);
- remainder = (DdApaDigit) (partial % divisor);
- }
-
- return(remainder);
-
-} /* end of Cudd_ApaShortDivision */
-
-
-/**Function********************************************************************
-
- Synopsis [Divides an arbitrary precision integer by an integer.]
-
- Description [Divides an arbitrary precision integer by a 32-bit
- unsigned integer. Returns the remainder of the division. This
- procedure relies on the assumption that the number of bits of a
- DdApaDigit plus the number of bits of an unsigned int is less the
- number of bits of the mantissa of a double. This guarantees that the
- product of a DdApaDigit and an unsigned int can be represented
- without loss of precision by a double. On machines where this
- assumption is not satisfied, this procedure will malfunction.]
-
- SideEffects [The quotient is returned in parameter <code>quotient</code>.]
-
- SeeAlso [Cudd_ApaShortDivision]
-
-******************************************************************************/
-unsigned int
-Cudd_ApaIntDivision(
- int digits,
- DdApaNumber dividend,
- unsigned int divisor,
- DdApaNumber quotient)
-{
- int i;
- double partial;
- unsigned int remainder = 0;
- double ddiv = (double) divisor;
-
- for (i = 0; i < digits; i++) {
- partial = (double) remainder * DD_APA_BASE + dividend[i];
- quotient[i] = (DdApaDigit) (partial / ddiv);
- remainder = (unsigned int) (partial - ((double)quotient[i] * ddiv));
- }
-
- return(remainder);
-
-} /* end of Cudd_ApaIntDivision */
-
-
-/**Function********************************************************************
-
- Synopsis [Shifts right an arbitrary precision integer by one binary
- place.]
-
- Description [Shifts right an arbitrary precision integer by one
- binary place. The most significant binary digit of the result is
- taken from parameter <code>in</code>.]
-
- SideEffects [The result is returned in parameter <code>b</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-void
-Cudd_ApaShiftRight(
- int digits,
- DdApaDigit in,
- DdApaNumber a,
- DdApaNumber b)
-{
- int i;
-
- for (i = digits - 1; i > 0; i--) {
- b[i] = (a[i] >> 1) | ((a[i-1] & 1) << (DD_APA_BITS - 1));
- }
- b[0] = (a[0] >> 1) | (in << (DD_APA_BITS - 1));
-
-} /* end of Cudd_ApaShiftRight */
-
-
-/**Function********************************************************************
-
- Synopsis [Sets an arbitrary precision integer to a one-digit literal.]
-
- Description [Sets an arbitrary precision integer to a one-digit literal.]
-
- SideEffects [The result is returned in parameter <code>number</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-void
-Cudd_ApaSetToLiteral(
- int digits,
- DdApaNumber number,
- DdApaDigit literal)
-{
- int i;
-
- for (i = 0; i < digits - 1; i++)
- number[i] = 0;
- number[digits - 1] = literal;
-
-} /* end of Cudd_ApaSetToLiteral */
-
-
-/**Function********************************************************************
-
- Synopsis [Sets an arbitrary precision integer to a power of two.]
-
- Description [Sets an arbitrary precision integer to a power of
- two. If the power of two is too large to be represented, the number
- is set to 0.]
-
- SideEffects [The result is returned in parameter <code>number</code>.]
-
- SeeAlso []
-
-******************************************************************************/
-void
-Cudd_ApaPowerOfTwo(
- int digits,
- DdApaNumber number,
- int power)
-{
- int i;
- int index;
-
- for (i = 0; i < digits; i++)
- number[i] = 0;
- i = digits - 1 - power / DD_APA_BITS;
- if (i < 0) return;
- index = power & (DD_APA_BITS - 1);
- number[i] = 1 << index;
-
-} /* end of Cudd_ApaPowerOfTwo */
-
-
-/**Function********************************************************************
-
- Synopsis [Compares two arbitrary precision integers.]
-
- Description [Compares two arbitrary precision integers. Returns 1 if
- the first number is larger; 0 if they are equal; -1 if the second
- number is larger.]
-
- SideEffects [None]
-
- SeeAlso []
-
-******************************************************************************/
-int
-Cudd_ApaCompare(
- int digitsFirst,
- DdApaNumber first,
- int digitsSecond,
- DdApaNumber second)
-{
- int i;
- int firstNZ, secondNZ;
-
- /* Find first non-zero in both numbers. */
- for (firstNZ = 0; firstNZ < digitsFirst; firstNZ++)
- if (first[firstNZ] != 0) break;
- for (secondNZ = 0; secondNZ < digitsSecond; secondNZ++)
- if (second[secondNZ] != 0) break;
- if (digitsFirst - firstNZ > digitsSecond - secondNZ) return(1);
- else if (digitsFirst - firstNZ < digitsSecond - secondNZ) return(-1);
- for (i = 0; i < digitsFirst - firstNZ; i++) {
- if (first[firstNZ + i] > second[secondNZ + i]) return(1);
- else if (first[firstNZ + i] < second[secondNZ + i]) return(-1);
- }
- return(0);
-
-} /* end of Cudd_ApaCompare */
-
-
-/**Function********************************************************************
-
- Synopsis [Compares the ratios of two arbitrary precision integers to two
- unsigned ints.]
-
- Description [Compares the ratios of two arbitrary precision integers
- to two unsigned ints. Returns 1 if the first number is larger; 0 if
- they are equal; -1 if the second number is larger.]
-
- SideEffects [None]
-
- SeeAlso []
-
-******************************************************************************/
-int
-Cudd_ApaCompareRatios(
- int digitsFirst,
- DdApaNumber firstNum,
- unsigned int firstDen,
- int digitsSecond,
- DdApaNumber secondNum,
- unsigned int secondDen)
-{
- int result;
- DdApaNumber first, second;
- unsigned int firstRem, secondRem;
-
- first = Cudd_NewApaNumber(digitsFirst);
- firstRem = Cudd_ApaIntDivision(digitsFirst,firstNum,firstDen,first);
- second = Cudd_NewApaNumber(digitsSecond);
- secondRem = Cudd_ApaIntDivision(digitsSecond,secondNum,secondDen,second);
- result = Cudd_ApaCompare(digitsFirst,first,digitsSecond,second);
- if (result == 0) {
- if ((double)firstRem/firstDen > (double)secondRem/secondDen)
- return(1);
- else if ((double)firstRem/firstDen < (double)secondRem/secondDen)
- return(-1);
- }
- return(result);
-
-} /* end of Cudd_ApaCompareRatios */
-
-
-/**Function********************************************************************
-
- Synopsis [Prints an arbitrary precision integer in hexadecimal format.]
-
- Description [Prints an arbitrary precision integer in hexadecimal format.
- Returns 1 if successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso [Cudd_ApaPrintDecimal Cudd_ApaPrintExponential]
-
-******************************************************************************/
-int
-Cudd_ApaPrintHex(
- FILE * fp,
- int digits,
- DdApaNumber number)
-{
- int i, result;
-
- for (i = 0; i < digits; i++) {
- result = fprintf(fp,DD_APA_HEXPRINT,number[i]);
- if (result == EOF)
- return(0);
- }
- return(1);
-
-} /* end of Cudd_ApaPrintHex */
-
-
-/**Function********************************************************************
-
- Synopsis [Prints an arbitrary precision integer in decimal format.]
-
- Description [Prints an arbitrary precision integer in decimal format.
- Returns 1 if successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso [Cudd_ApaPrintHex Cudd_ApaPrintExponential]
-
-******************************************************************************/
-int
-Cudd_ApaPrintDecimal(
- FILE * fp,
- int digits,
- DdApaNumber number)
-{
- int i, result;
- DdApaDigit remainder;
- DdApaNumber work;
- unsigned char *decimal;
- int leadingzero;
- int decimalDigits = (int) (digits * log10((double) DD_APA_BASE)) + 1;
-
- work = Cudd_NewApaNumber(digits);
- if (work == NULL)
- return(0);
- decimal = ALLOC(unsigned char, decimalDigits);
- if (decimal == NULL) {
- FREE(work);
- return(0);
- }
- Cudd_ApaCopy(digits,number,work);
- for (i = decimalDigits - 1; i >= 0; i--) {
- remainder = Cudd_ApaShortDivision(digits,work,(DdApaDigit) 10,work);
- decimal[i] = remainder;
- }
- FREE(work);
-
- leadingzero = 1;
- for (i = 0; i < decimalDigits; i++) {
- leadingzero = leadingzero && (decimal[i] == 0);
- if ((!leadingzero) || (i == (decimalDigits - 1))) {
- result = fprintf(fp,"%1d",decimal[i]);
- if (result == EOF) {
- FREE(decimal);
- return(0);
- }
- }
- }
- FREE(decimal);
- return(1);
-
-} /* end of Cudd_ApaPrintDecimal */
-
-
-/**Function********************************************************************
-
- Synopsis [Prints an arbitrary precision integer in exponential format.]
-
- Description [Prints an arbitrary precision integer in exponential format.
- Returns 1 if successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso [Cudd_ApaPrintHex Cudd_ApaPrintDecimal]
-
-******************************************************************************/
-int
-Cudd_ApaPrintExponential(
- FILE * fp,
- int digits,
- DdApaNumber number,
- int precision)
-{
- int i, first, last, result;
- DdApaDigit remainder;
- DdApaNumber work;
- unsigned char *decimal;
- int decimalDigits = (int) (digits * log10((double) DD_APA_BASE)) + 1;
-
- work = Cudd_NewApaNumber(digits);
- if (work == NULL)
- return(0);
- decimal = ALLOC(unsigned char, decimalDigits);
- if (decimal == NULL) {
- FREE(work);
- return(0);
- }
- Cudd_ApaCopy(digits,number,work);
- first = decimalDigits - 1;
- for (i = decimalDigits - 1; i >= 0; i--) {
- remainder = Cudd_ApaShortDivision(digits,work,(DdApaDigit) 10,work);
- decimal[i] = remainder;
- if (remainder != 0) first = i; /* keep track of MS non-zero */
- }
- FREE(work);
- last = ddMin(first + precision, decimalDigits);
-
- for (i = first; i < last; i++) {
- result = fprintf(fp,"%s%1d",i == first+1 ? "." : "", decimal[i]);
- if (result == EOF) {
- FREE(decimal);
- return(0);
- }
- }
- FREE(decimal);
- result = fprintf(fp,"e+%d",decimalDigits - first - 1);
- if (result == EOF) {
- return(0);
- }
- return(1);
-
-} /* end of Cudd_ApaPrintExponential */
-
-
-/**Function********************************************************************
-
- Synopsis [Counts the number of minterms of a DD.]
-
- Description [Counts the number of minterms of a DD. The function is
- assumed to depend on nvars variables. The minterm count is
- represented as an arbitrary precision unsigned integer, to allow for
- any number of variables CUDD supports. Returns a pointer to the
- array representing the number of minterms of the function rooted at
- node if successful; NULL otherwise.]
-
- SideEffects [The number of digits of the result is returned in
- parameter <code>digits</code>.]
-
- SeeAlso [Cudd_CountMinterm]
-
-******************************************************************************/
-DdApaNumber
-Cudd_ApaCountMinterm(
- DdManager * manager,
- DdNode * node,
- int nvars,
- int * digits)
-{
- DdApaNumber max, min;
- st_table *table;
- DdApaNumber i,count;
-
- background = manager->background;
- zero = Cudd_Not(manager->one);
-
- *digits = Cudd_ApaNumberOfDigits(nvars+1);
- max = Cudd_NewApaNumber(*digits);
- if (max == NULL) {
- return(NULL);
- }
- Cudd_ApaPowerOfTwo(*digits,max,nvars);
- min = Cudd_NewApaNumber(*digits);
- if (min == NULL) {
- FREE(max);
- return(NULL);
- }
- Cudd_ApaSetToLiteral(*digits,min,0);
- table = st_init_table(st_ptrcmp,st_ptrhash);
- if (table == NULL) {
- FREE(max);
- FREE(min);
- return(NULL);
- }
- i = cuddApaCountMintermAux(Cudd_Regular(node),*digits,max,min,table);
- if (i == NULL) {
- FREE(max);
- FREE(min);
- st_foreach(table, cuddApaStCountfree, NULL);
- st_free_table(table);
- return(NULL);
- }
- count = Cudd_NewApaNumber(*digits);
- if (count == NULL) {
- FREE(max);
- FREE(min);
- st_foreach(table, cuddApaStCountfree, NULL);
- st_free_table(table);
- if (Cudd_Regular(node)->ref == 1) FREE(i);
- return(NULL);
- }
- if (Cudd_IsComplement(node)) {
- (void) Cudd_ApaSubtract(*digits,max,i,count);
- } else {
- Cudd_ApaCopy(*digits,i,count);
- }
- FREE(max);
- FREE(min);
- st_foreach(table, cuddApaStCountfree, NULL);
- st_free_table(table);
- if (Cudd_Regular(node)->ref == 1) FREE(i);
- return(count);
-
-} /* end of Cudd_ApaCountMinterm */
-
-
-/**Function********************************************************************
-
- Synopsis [Prints the number of minterms of a BDD or ADD using
- arbitrary precision arithmetic.]
-
- Description [Prints the number of minterms of a BDD or ADD using
- arbitrary precision arithmetic. Returns 1 if successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso [Cudd_ApaPrintMintermExp]
-
-******************************************************************************/
-int
-Cudd_ApaPrintMinterm(
- FILE * fp,
- DdManager * dd,
- DdNode * node,
- int nvars)
-{
- int digits;
- int result;
- DdApaNumber count;
-
- count = Cudd_ApaCountMinterm(dd,node,nvars,&digits);
- if (count == NULL)
- return(0);
- result = Cudd_ApaPrintDecimal(fp,digits,count);
- FREE(count);
- if (fprintf(fp,"\n") == EOF) {
- return(0);
- }
- return(result);
-
-} /* end of Cudd_ApaPrintMinterm */
-
-
-/**Function********************************************************************
-
- Synopsis [Prints the number of minterms of a BDD or ADD in exponential
- format using arbitrary precision arithmetic.]
-
- Description [Prints the number of minterms of a BDD or ADD in
- exponential format using arbitrary precision arithmetic. Parameter
- precision controls the number of signficant digits printed. Returns
- 1 if successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso [Cudd_ApaPrintMinterm]
-
-******************************************************************************/
-int
-Cudd_ApaPrintMintermExp(
- FILE * fp,
- DdManager * dd,
- DdNode * node,
- int nvars,
- int precision)
-{
- int digits;
- int result;
- DdApaNumber count;
-
- count = Cudd_ApaCountMinterm(dd,node,nvars,&digits);
- if (count == NULL)
- return(0);
- result = Cudd_ApaPrintExponential(fp,digits,count,precision);
- FREE(count);
- if (fprintf(fp,"\n") == EOF) {
- return(0);
- }
- return(result);
-
-} /* end of Cudd_ApaPrintMintermExp */
-
-
-/**Function********************************************************************
-
- Synopsis [Prints the density of a BDD or ADD using
- arbitrary precision arithmetic.]
-
- Description [Prints the density of a BDD or ADD using
- arbitrary precision arithmetic. Returns 1 if successful; 0 otherwise.]
-
- SideEffects [None]
-
- SeeAlso []
-
-******************************************************************************/
-int
-Cudd_ApaPrintDensity(
- FILE * fp,
- DdManager * dd,
- DdNode * node,
- int nvars)
-{
- int digits;
- int result;
- DdApaNumber count,density;
- unsigned int size, remainder, fractional;
-
- count = Cudd_ApaCountMinterm(dd,node,nvars,&digits);
- if (count == NULL)
- return(0);
- size = Cudd_DagSize(node);
- density = Cudd_NewApaNumber(digits);
- remainder = Cudd_ApaIntDivision(digits,count,size,density);
- result = Cudd_ApaPrintDecimal(fp,digits,density);
- FREE(count);
- FREE(density);
- fractional = (unsigned int)((double)remainder / size * 1000000);
- if (fprintf(fp,".%u\n", fractional) == EOF) {
- return(0);
- }
- return(result);
-
-} /* end of Cudd_ApaPrintDensity */
-
-
-/*---------------------------------------------------------------------------*/
-/* Definition of internal functions */
-/*---------------------------------------------------------------------------*/
-
-
-/*---------------------------------------------------------------------------*/
-/* Definition of static functions */
-/*---------------------------------------------------------------------------*/
-
-
-/**Function********************************************************************
-
- Synopsis [Performs the recursive step of Cudd_ApaCountMinterm.]
-
- Description [Performs the recursive step of Cudd_ApaCountMinterm.
- It is based on the following identity. Let |f| be the
- number of minterms of f. Then:
- <xmp>
- |f| = (|f0|+|f1|)/2
- </xmp>
- where f0 and f1 are the two cofactors of f.
- Uses the identity <code>|f'| = max - |f|</code>.
- The procedure expects the argument "node" to be a regular pointer, and
- guarantees this condition is met in the recursive calls.
- For efficiency, the result of a call is cached only if the node has
- a reference count greater than 1.
- Returns the number of minterms of the function rooted at node.]
-
- SideEffects [None]
-
-******************************************************************************/
-static DdApaNumber
-cuddApaCountMintermAux(
- DdNode * node,
- int digits,
- DdApaNumber max,
- DdApaNumber min,
- st_table * table)
-{
- DdNode *Nt, *Ne;
- DdApaNumber mint, mint1, mint2;
- DdApaDigit carryout;
-
- if (cuddIsConstant(node)) {
- if (node == background || node == zero) {
- return(min);
- } else {
- return(max);
- }
- }
- if (node->ref > 1 && st_lookup(table, (char *)node, (char **)&mint)) {
- return(mint);
- }
-
- Nt = cuddT(node); Ne = cuddE(node);
-
- mint1 = cuddApaCountMintermAux(Nt, digits, max, min, table);
- if (mint1 == NULL) return(NULL);
- mint2 = cuddApaCountMintermAux(Cudd_Regular(Ne), digits, max, min, table);
- if (mint2 == NULL) {
- if (Nt->ref == 1) FREE(mint1);
- return(NULL);
- }
- mint = Cudd_NewApaNumber(digits);
- if (mint == NULL) {
- if (Nt->ref == 1) FREE(mint1);
- if (Cudd_Regular(Ne)->ref == 1) FREE(mint2);
- return(NULL);
- }
- if (Cudd_IsComplement(Ne)) {
- (void) Cudd_ApaSubtract(digits,max,mint2,mint);
- carryout = Cudd_ApaAdd(digits,mint1,mint,mint);
- } else {
- carryout = Cudd_ApaAdd(digits,mint1,mint2,mint);
- }
- Cudd_ApaShiftRight(digits,carryout,mint,mint);
- /* If the refernce count of a child is 1, its minterm count
- ** hasn't been stored in table. Therefore, it must be explicitly
- ** freed here. */
- if (Nt->ref == 1) FREE(mint1);
- if (Cudd_Regular(Ne)->ref == 1) FREE(mint2);
-
- if (node->ref > 1) {
- if (st_insert(table, (char *)node, (char *)mint) == ST_OUT_OF_MEM) {
- FREE(mint);
- return(NULL);
- }
- }
- return(mint);
-
-} /* end of cuddApaCountMintermAux */
-
-
-/**Function********************************************************************
-
- Synopsis [Frees the memory used to store the minterm counts recorded
- in the visited table.]
-
- Description [Frees the memory used to store the minterm counts
- recorded in the visited table. Returns ST_CONTINUE.]
-
- SideEffects [None]
-
-******************************************************************************/
-static enum st_retval
-cuddApaStCountfree(
- char * key,
- char * value,
- char * arg)
-{
- DdApaNumber d;
-
- d = (DdApaNumber) value;
- FREE(d);
- return(ST_CONTINUE);
-
-} /* end of cuddApaStCountfree */
-
-