You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
278 lines
8.5 KiB
278 lines
8.5 KiB
/**CFile***********************************************************************
|
|
|
|
FileName [cuddZddMisc.c]
|
|
|
|
PackageName [cudd]
|
|
|
|
Synopsis [Miscellaneous utility functions for ZDDs.]
|
|
|
|
Description [External procedures included in this module:
|
|
<ul>
|
|
<li> Cudd_zddDagSize()
|
|
<li> Cudd_zddCountMinterm()
|
|
<li> Cudd_zddPrintSubtable()
|
|
</ul>
|
|
Internal procedures included in this module:
|
|
<ul>
|
|
</ul>
|
|
Static procedures included in this module:
|
|
<ul>
|
|
<li> cuddZddDagInt()
|
|
</ul>
|
|
]
|
|
|
|
SeeAlso []
|
|
|
|
Author [Hyong-Kyoon Shin, In-Ho Moon]
|
|
|
|
Copyright [Copyright (c) 1995-2012, Regents of the University of Colorado
|
|
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
|
|
Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
Neither the name of the University of Colorado nor the names of its
|
|
contributors may be used to endorse or promote products derived from
|
|
this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
POSSIBILITY OF SUCH DAMAGE.]
|
|
|
|
******************************************************************************/
|
|
|
|
#include <math.h>
|
|
#include "util.h"
|
|
#include "cuddInt.h"
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Constant declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Stucture declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Type declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Variable declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef lint
|
|
static char rcsid[] DD_UNUSED = "$Id: cuddZddMisc.c,v 1.18 2012/02/05 01:07:19 fabio Exp $";
|
|
#endif
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Macro declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/**AutomaticStart*************************************************************/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Static function prototypes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
static int cuddZddDagInt (DdNode *n, st_table *tab);
|
|
|
|
/**AutomaticEnd***************************************************************/
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Definition of exported functions */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Counts the number of nodes in a ZDD.]
|
|
|
|
Description [Counts the number of nodes in a ZDD. This function
|
|
duplicates Cudd_DagSize and is only retained for compatibility.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso [Cudd_DagSize]
|
|
|
|
******************************************************************************/
|
|
int
|
|
Cudd_zddDagSize(
|
|
DdNode * p_node)
|
|
{
|
|
|
|
int i;
|
|
st_table *table;
|
|
|
|
table = st_init_table(st_ptrcmp, st_ptrhash);
|
|
i = cuddZddDagInt(p_node, table);
|
|
st_free_table(table);
|
|
return(i);
|
|
|
|
} /* end of Cudd_zddDagSize */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Counts the number of minterms of a ZDD.]
|
|
|
|
Description [Counts the number of minterms of the ZDD rooted at
|
|
<code>node</code>. This procedure takes a parameter
|
|
<code>path</code> that specifies how many variables are in the
|
|
support of the function. If the procedure runs out of memory, it
|
|
returns (double) CUDD_OUT_OF_MEM.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso [Cudd_zddCountDouble]
|
|
|
|
******************************************************************************/
|
|
double
|
|
Cudd_zddCountMinterm(
|
|
DdManager * zdd,
|
|
DdNode * node,
|
|
int path)
|
|
{
|
|
double dc_var, minterms;
|
|
|
|
dc_var = (double)((double)(zdd->sizeZ) - (double)path);
|
|
minterms = Cudd_zddCountDouble(zdd, node) / pow(2.0, dc_var);
|
|
return(minterms);
|
|
|
|
} /* end of Cudd_zddCountMinterm */
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Prints the ZDD table.]
|
|
|
|
Description [Prints the ZDD table for debugging purposes.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
******************************************************************************/
|
|
void
|
|
Cudd_zddPrintSubtable(
|
|
DdManager * table)
|
|
{
|
|
int i, j;
|
|
DdNode *z1, *z1_next, *base;
|
|
DdSubtable *ZSubTable;
|
|
|
|
base = table->one;
|
|
for (i = table->sizeZ - 1; i >= 0; i--) {
|
|
ZSubTable = &(table->subtableZ[i]);
|
|
printf("subtable[%d]:\n", i);
|
|
for (j = ZSubTable->slots - 1; j >= 0; j--) {
|
|
z1 = ZSubTable->nodelist[j];
|
|
while (z1 != NIL(DdNode)) {
|
|
(void) fprintf(table->out,
|
|
#if SIZEOF_VOID_P == 8
|
|
"ID = 0x%lx\tindex = %u\tr = %u\t",
|
|
(ptruint) z1 / (ptruint) sizeof(DdNode),
|
|
z1->index, z1->ref);
|
|
#else
|
|
"ID = 0x%x\tindex = %hu\tr = %hu\t",
|
|
(ptruint) z1 / (ptruint) sizeof(DdNode),
|
|
z1->index, z1->ref);
|
|
#endif
|
|
z1_next = cuddT(z1);
|
|
if (Cudd_IsConstant(z1_next)) {
|
|
(void) fprintf(table->out, "T = %d\t\t",
|
|
(z1_next == base));
|
|
}
|
|
else {
|
|
#if SIZEOF_VOID_P == 8
|
|
(void) fprintf(table->out, "T = 0x%lx\t",
|
|
(ptruint) z1_next / (ptruint) sizeof(DdNode));
|
|
#else
|
|
(void) fprintf(table->out, "T = 0x%x\t",
|
|
(ptruint) z1_next / (ptruint) sizeof(DdNode));
|
|
#endif
|
|
}
|
|
z1_next = cuddE(z1);
|
|
if (Cudd_IsConstant(z1_next)) {
|
|
(void) fprintf(table->out, "E = %d\n",
|
|
(z1_next == base));
|
|
}
|
|
else {
|
|
#if SIZEOF_VOID_P == 8
|
|
(void) fprintf(table->out, "E = 0x%lx\n",
|
|
(ptruint) z1_next / (ptruint) sizeof(DdNode));
|
|
#else
|
|
(void) fprintf(table->out, "E = 0x%x\n",
|
|
(ptruint) z1_next / (ptruint) sizeof(DdNode));
|
|
#endif
|
|
}
|
|
|
|
z1_next = z1->next;
|
|
z1 = z1_next;
|
|
}
|
|
}
|
|
}
|
|
putchar('\n');
|
|
|
|
} /* Cudd_zddPrintSubtable */
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Definition of static functions */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/**Function********************************************************************
|
|
|
|
Synopsis [Performs the recursive step of Cudd_zddDagSize.]
|
|
|
|
Description [Performs the recursive step of Cudd_zddDagSize. Does
|
|
not check for out-of-memory conditions.]
|
|
|
|
SideEffects [None]
|
|
|
|
SeeAlso []
|
|
|
|
******************************************************************************/
|
|
static int
|
|
cuddZddDagInt(
|
|
DdNode * n,
|
|
st_table * tab)
|
|
{
|
|
if (n == NIL(DdNode))
|
|
return(0);
|
|
|
|
if (st_is_member(tab, (char *)n) == 1)
|
|
return(0);
|
|
|
|
if (Cudd_IsConstant(n))
|
|
return(0);
|
|
|
|
(void)st_insert(tab, (char *)n, NIL(char));
|
|
return(1 + cuddZddDagInt(cuddT(n), tab) +
|
|
cuddZddDagInt(cuddE(n), tab));
|
|
|
|
} /* cuddZddDagInt */
|