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.
		
		
		
		
		
			
		
			
				
					
					
						
							357 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							357 lines
						
					
					
						
							10 KiB
						
					
					
				
								/**CFile***********************************************************************
							 | 
						|
								
							 | 
						|
								  FileName    [cuddZddCount.c]
							 | 
						|
								
							 | 
						|
								  PackageName [cudd]
							 | 
						|
								
							 | 
						|
								  Synopsis    [Procedures to count the number of minterms of a ZDD.]
							 | 
						|
								
							 | 
						|
								  Description [External procedures included in this module:
							 | 
						|
										    <ul>
							 | 
						|
										    <li> Cudd_zddCount();
							 | 
						|
										    <li> Cudd_zddCountDouble();
							 | 
						|
										    </ul>
							 | 
						|
									       Internal procedures included in this module:
							 | 
						|
										    <ul>
							 | 
						|
										    </ul>
							 | 
						|
									       Static procedures included in this module:
							 | 
						|
										    <ul>
							 | 
						|
								       		    <li> cuddZddCountStep();
							 | 
						|
										    <li> cuddZddCountDoubleStep();
							 | 
						|
										    <li> st_zdd_count_dbl_free()
							 | 
						|
										    <li> st_zdd_countfree()
							 | 
						|
										    </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 "util.h"
							 | 
						|
								#include "cuddInt.h"
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Constant declarations                                                     */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Stucture declarations                                                     */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Type declarations                                                         */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Variable declarations                                                     */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								#ifndef lint
							 | 
						|
								static char rcsid[] DD_UNUSED = "$Id: cuddZddCount.c,v 1.15 2012/02/05 01:07:19 fabio Exp $";
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Macro declarations                                                        */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								#ifdef __cplusplus
							 | 
						|
								extern "C" {
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								/**AutomaticStart*************************************************************/
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Static function prototypes                                                */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								static int cuddZddCountStep (DdNode *P, st_table *table, DdNode *base, DdNode *empty);
							 | 
						|
								static double cuddZddCountDoubleStep (DdNode *P, st_table *table, DdNode *base, DdNode *empty);
							 | 
						|
								static enum st_retval st_zdd_countfree (char *key, char *value, char *arg);
							 | 
						|
								static enum st_retval st_zdd_count_dbl_free (char *key, char *value, char *arg);
							 | 
						|
								
							 | 
						|
								/**AutomaticEnd***************************************************************/
							 | 
						|
								
							 | 
						|
								#ifdef __cplusplus
							 | 
						|
								}
							 | 
						|
								#endif
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Definition of exported functions                                          */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**Function********************************************************************
							 | 
						|
								
							 | 
						|
								  Synopsis [Counts the number of minterms in a ZDD.]
							 | 
						|
								
							 | 
						|
								  Description [Returns an integer representing the number of minterms
							 | 
						|
								  in a ZDD.]
							 | 
						|
								
							 | 
						|
								  SideEffects [None]
							 | 
						|
								
							 | 
						|
								  SeeAlso     [Cudd_zddCountDouble]
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								int
							 | 
						|
								Cudd_zddCount(
							 | 
						|
								  DdManager * zdd,
							 | 
						|
								  DdNode * P)
							 | 
						|
								{
							 | 
						|
								    st_table	*table;
							 | 
						|
								    int		res;
							 | 
						|
								    DdNode	*base, *empty;
							 | 
						|
								
							 | 
						|
								    base  = DD_ONE(zdd);
							 | 
						|
								    empty = DD_ZERO(zdd);
							 | 
						|
								    table = st_init_table(st_ptrcmp, st_ptrhash);
							 | 
						|
								    if (table == NULL) return(CUDD_OUT_OF_MEM);
							 | 
						|
								    res = cuddZddCountStep(P, table, base, empty);
							 | 
						|
								    if (res == CUDD_OUT_OF_MEM) {
							 | 
						|
									zdd->errorCode = CUDD_MEMORY_OUT;
							 | 
						|
								    }
							 | 
						|
								    st_foreach(table, st_zdd_countfree, NIL(char));
							 | 
						|
								    st_free_table(table);
							 | 
						|
								
							 | 
						|
								    return(res);
							 | 
						|
								
							 | 
						|
								} /* end of Cudd_zddCount */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**Function********************************************************************
							 | 
						|
								
							 | 
						|
								  Synopsis [Counts the number of minterms of a ZDD.]
							 | 
						|
								
							 | 
						|
								  Description [Counts the number of minterms of a ZDD. The result is
							 | 
						|
								  returned as a double. If the procedure runs out of memory, it
							 | 
						|
								  returns (double) CUDD_OUT_OF_MEM. This procedure is used in
							 | 
						|
								  Cudd_zddCountMinterm.]
							 | 
						|
								
							 | 
						|
								  SideEffects [None]
							 | 
						|
								
							 | 
						|
								  SeeAlso     [Cudd_zddCountMinterm Cudd_zddCount]
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								double
							 | 
						|
								Cudd_zddCountDouble(
							 | 
						|
								  DdManager * zdd,
							 | 
						|
								  DdNode * P)
							 | 
						|
								{
							 | 
						|
								    st_table	*table;
							 | 
						|
								    double	res;
							 | 
						|
								    DdNode	*base, *empty;
							 | 
						|
								
							 | 
						|
								    base  = DD_ONE(zdd);
							 | 
						|
								    empty = DD_ZERO(zdd);
							 | 
						|
								    table = st_init_table(st_ptrcmp, st_ptrhash);
							 | 
						|
								    if (table == NULL) return((double)CUDD_OUT_OF_MEM);
							 | 
						|
								    res = cuddZddCountDoubleStep(P, table, base, empty);
							 | 
						|
								    if (res == (double)CUDD_OUT_OF_MEM) {
							 | 
						|
									zdd->errorCode = CUDD_MEMORY_OUT;
							 | 
						|
								    }
							 | 
						|
								    st_foreach(table, st_zdd_count_dbl_free, NIL(char));
							 | 
						|
								    st_free_table(table);
							 | 
						|
								
							 | 
						|
								    return(res);
							 | 
						|
								
							 | 
						|
								} /* end of Cudd_zddCountDouble */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Definition of internal functions                                          */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Definition of static functions                                            */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**Function********************************************************************
							 | 
						|
								
							 | 
						|
								  Synopsis [Performs the recursive step of Cudd_zddCount.]
							 | 
						|
								
							 | 
						|
								  Description []
							 | 
						|
								
							 | 
						|
								  SideEffects [None]
							 | 
						|
								
							 | 
						|
								  SeeAlso     []
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								static int
							 | 
						|
								cuddZddCountStep(
							 | 
						|
								  DdNode * P,
							 | 
						|
								  st_table * table,
							 | 
						|
								  DdNode * base,
							 | 
						|
								  DdNode * empty)
							 | 
						|
								{
							 | 
						|
								    int		res;
							 | 
						|
								    int		*dummy;
							 | 
						|
								
							 | 
						|
								    if (P == empty)
							 | 
						|
									return(0);
							 | 
						|
								    if (P == base)
							 | 
						|
									return(1);
							 | 
						|
								
							 | 
						|
								    /* Check cache. */
							 | 
						|
								    if (st_lookup(table, P, &dummy)) {
							 | 
						|
									res = *dummy;
							 | 
						|
									return(res);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    res = cuddZddCountStep(cuddE(P), table, base, empty) +
							 | 
						|
									cuddZddCountStep(cuddT(P), table, base, empty);
							 | 
						|
								
							 | 
						|
								    dummy = ALLOC(int, 1);
							 | 
						|
								    if (dummy == NULL) {
							 | 
						|
									return(CUDD_OUT_OF_MEM);
							 | 
						|
								    }
							 | 
						|
								    *dummy = res;
							 | 
						|
								    if (st_insert(table, (char *)P, (char *)dummy) == ST_OUT_OF_MEM) {
							 | 
						|
									FREE(dummy);
							 | 
						|
									return(CUDD_OUT_OF_MEM);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return(res);
							 | 
						|
								
							 | 
						|
								} /* end of cuddZddCountStep */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**Function********************************************************************
							 | 
						|
								
							 | 
						|
								  Synopsis [Performs the recursive step of Cudd_zddCountDouble.]
							 | 
						|
								
							 | 
						|
								  Description []
							 | 
						|
								
							 | 
						|
								  SideEffects [None]
							 | 
						|
								
							 | 
						|
								  SeeAlso     []
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								static double
							 | 
						|
								cuddZddCountDoubleStep(
							 | 
						|
								  DdNode * P,
							 | 
						|
								  st_table * table,
							 | 
						|
								  DdNode * base,
							 | 
						|
								  DdNode * empty)
							 | 
						|
								{
							 | 
						|
								    double	res;
							 | 
						|
								    double	*dummy;
							 | 
						|
								
							 | 
						|
								    if (P == empty)
							 | 
						|
									return((double)0.0);
							 | 
						|
								    if (P == base)
							 | 
						|
									return((double)1.0);
							 | 
						|
								
							 | 
						|
								    /* Check cache */
							 | 
						|
								    if (st_lookup(table, P, &dummy)) {
							 | 
						|
									res = *dummy;
							 | 
						|
									return(res);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    res = cuddZddCountDoubleStep(cuddE(P), table, base, empty) +
							 | 
						|
									cuddZddCountDoubleStep(cuddT(P), table, base, empty);
							 | 
						|
								
							 | 
						|
								    dummy = ALLOC(double, 1);
							 | 
						|
								    if (dummy == NULL) {
							 | 
						|
									return((double)CUDD_OUT_OF_MEM);
							 | 
						|
								    }
							 | 
						|
								    *dummy = res;
							 | 
						|
								    if (st_insert(table, (char *)P, (char *)dummy) == ST_OUT_OF_MEM) {
							 | 
						|
									FREE(dummy);
							 | 
						|
									return((double)CUDD_OUT_OF_MEM);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    return(res);
							 | 
						|
								
							 | 
						|
								} /* end of cuddZddCountDoubleStep */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**Function********************************************************************
							 | 
						|
								
							 | 
						|
								  Synopsis [Frees the memory associated with the computed table of
							 | 
						|
								  Cudd_zddCount.]
							 | 
						|
								
							 | 
						|
								  Description []
							 | 
						|
								
							 | 
						|
								  SideEffects [None]
							 | 
						|
								
							 | 
						|
								  SeeAlso     []
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								static enum st_retval
							 | 
						|
								st_zdd_countfree(
							 | 
						|
								  char * key,
							 | 
						|
								  char * value,
							 | 
						|
								  char * arg)
							 | 
						|
								{
							 | 
						|
								    int	*d;
							 | 
						|
								
							 | 
						|
								    d = (int *)value;
							 | 
						|
								    FREE(d);
							 | 
						|
								    return(ST_CONTINUE);
							 | 
						|
								
							 | 
						|
								} /* end of st_zdd_countfree */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**Function********************************************************************
							 | 
						|
								
							 | 
						|
								  Synopsis [Frees the memory associated with the computed table of
							 | 
						|
								  Cudd_zddCountDouble.]
							 | 
						|
								
							 | 
						|
								  Description []
							 | 
						|
								
							 | 
						|
								  SideEffects [None]
							 | 
						|
								
							 | 
						|
								  SeeAlso     []
							 | 
						|
								
							 | 
						|
								******************************************************************************/
							 | 
						|
								static enum st_retval
							 | 
						|
								st_zdd_count_dbl_free(
							 | 
						|
								  char * key,
							 | 
						|
								  char * value,
							 | 
						|
								  char * arg)
							 | 
						|
								{
							 | 
						|
								    double	*d;
							 | 
						|
								
							 | 
						|
								    d = (double *)value;
							 | 
						|
								    FREE(d);
							 | 
						|
								    return(ST_CONTINUE);
							 | 
						|
								
							 | 
						|
								} /* end of st_zdd_count_dbl_free */
							 |