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 */
 |