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.
		
		
		
		
		
			
		
			
				
					
					
						
							216 lines
						
					
					
						
							7.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							216 lines
						
					
					
						
							7.0 KiB
						
					
					
				
								/**
							 | 
						|
								  @file
							 | 
						|
								
							 | 
						|
								  @ingroup nanotrav
							 | 
						|
								
							 | 
						|
								  @brief Functions to check that the minterm counts have not changed
							 | 
						|
								  during reordering.
							 | 
						|
								
							 | 
						|
								  @author Fabio Somenzi
							 | 
						|
								
							 | 
						|
								  @copyright@parblock
							 | 
						|
								  Copyright (c) 1995-2015, 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.
							 | 
						|
								  @endparblock
							 | 
						|
								
							 | 
						|
								*/
							 | 
						|
								
							 | 
						|
								#include "ntr.h"
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Constant declarations                                                     */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Stucture declarations                                                     */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Type declarations                                                         */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Variable declarations                                                     */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Macro declarations                                                        */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								/** \cond */
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Static function prototypes                                                */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								static enum st_retval stFree (void *key, void *value, void *arg);
							 | 
						|
								
							 | 
						|
								/** \endcond */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Definition of exported functions                                          */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Definition of internal functions                                          */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								  @brief Check that minterm counts have not changed.
							 | 
						|
								
							 | 
						|
								  @details Counts the minterms in the global functions of the
							 | 
						|
								  primary outputs of the network passed as argument.
							 | 
						|
								  When it is calld with the second argument set to NULL, it allocates
							 | 
						|
								  a symbol table and stores, for each output, the minterm count. If
							 | 
						|
								  an output does not have a %BDD, it stores a NULL pointer for it.
							 | 
						|
								  If it is called with a non-null second argument, it assumes that
							 | 
						|
								  the symbol table contains the minterm counts measured previously
							 | 
						|
								  and it compares the new counts to the old ones. Finally, it frees
							 | 
						|
								  the symbol table.
							 | 
						|
								  check_minterms is designed so that it can be called twice: once before
							 | 
						|
								  reordering, and once after reordering.
							 | 
						|
								
							 | 
						|
								  @return a pointer to the symbol table on the first invocation and
							 | 
						|
								  NULL on the second invocation.
							 | 
						|
								
							 | 
						|
								  @sideeffect None
							 | 
						|
								
							 | 
						|
								*/
							 | 
						|
								st_table *
							 | 
						|
								checkMinterms(
							 | 
						|
								  BnetNetwork * net,
							 | 
						|
								  DdManager * dd,
							 | 
						|
								  st_table * previous)
							 | 
						|
								{
							 | 
						|
								    BnetNode *po;
							 | 
						|
								    int numPi;
							 | 
						|
								    char *name;
							 | 
						|
								    double *count, newcount, *oldcount;
							 | 
						|
								    int flag,err,i;
							 | 
						|
								
							 | 
						|
								    numPi = net->ninputs;
							 | 
						|
								
							 | 
						|
								    if (previous == NULL) {
							 | 
						|
								      previous = st_init_table((st_compare_t) strcmp, st_strhash);
							 | 
						|
									if (previous == NULL) {
							 | 
						|
									    (void) printf("checkMinterms out-of-memory\n");
							 | 
						|
									    return(NULL);
							 | 
						|
									}
							 | 
						|
									for (i = 0; i < net->noutputs; i++) {
							 | 
						|
									    if (!st_lookup(net->hash,net->outputs[i],(void **)&po)) {
							 | 
						|
										exit(2);
							 | 
						|
									    }
							 | 
						|
									    name = net->outputs[i];
							 | 
						|
									    if (po->dd != NULL) {
							 | 
						|
										count = ALLOC(double,1);
							 | 
						|
										*count = Cudd_CountMinterm(dd,po->dd,numPi);
							 | 
						|
										err = st_insert(previous, name, (void *) count);
							 | 
						|
									    } else {
							 | 
						|
										err = st_insert(previous, name, NULL);
							 | 
						|
									    }
							 | 
						|
									    if (err) {
							 | 
						|
										(void) printf("Duplicate input name (%s)\n",name);
							 | 
						|
										return(NULL);
							 | 
						|
									    }
							 | 
						|
									}
							 | 
						|
									return(previous);
							 | 
						|
								    } else {
							 | 
						|
									flag = 0;
							 | 
						|
									if (st_count(previous) != net->noutputs) {
							 | 
						|
									    (void) printf("Number of outputs has changed from %d to %d\n",
							 | 
						|
									    st_count(previous), net->noutputs);
							 | 
						|
									    flag = 1;
							 | 
						|
									}
							 | 
						|
									for (i = 0; i < net->noutputs; i++) {
							 | 
						|
									    if (!st_lookup(net->hash,net->outputs[i],(void **)&po)) {
							 | 
						|
										exit(2);
							 | 
						|
									    }
							 | 
						|
									    name = net->outputs[i];
							 | 
						|
									    if (st_lookup(previous,name,(void **)&oldcount)) {
							 | 
						|
										if (po->dd != NULL) {
							 | 
						|
										    newcount = Cudd_CountMinterm(dd,po->dd,numPi);
							 | 
						|
										    if (newcount != *oldcount) {
							 | 
						|
											(void) printf("Number of minterms of %s has changed from %g to %g\n",name,*oldcount,newcount);
							 | 
						|
											flag = 1;
							 | 
						|
										    }
							 | 
						|
										} else {
							 | 
						|
										    if (oldcount != NULL) {
							 | 
						|
											(void) printf("Output %s lost its BDD!\n",name);
							 | 
						|
											flag = 1;
							 | 
						|
										    }
							 | 
						|
										}
							 | 
						|
									    } else {
							 | 
						|
										(void) printf("Output %s is new!\n",name);
							 | 
						|
										flag = 1;
							 | 
						|
									    }
							 | 
						|
									}
							 | 
						|
									/*st_foreach(previous,(enum st_retval)stFree,NULL);*/
							 | 
						|
									st_foreach(previous,stFree,NULL);
							 | 
						|
									st_free_table(previous);
							 | 
						|
									if (flag) {
							 | 
						|
									    return((st_table *) 1);
							 | 
						|
									} else {
							 | 
						|
									    return(NULL);
							 | 
						|
									}
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								} /* end of checkMinterms */
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								/* Definition of static functions                                            */
							 | 
						|
								/*---------------------------------------------------------------------------*/
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								  @brief Frees the data of the symbol table.
							 | 
						|
								
							 | 
						|
								  @sideeffect None
							 | 
						|
								
							 | 
						|
								*/
							 | 
						|
								static enum st_retval
							 | 
						|
								stFree(
							 | 
						|
								  void *key,
							 | 
						|
								  void *value,
							 | 
						|
								  void *arg)
							 | 
						|
								{
							 | 
						|
								    (void) key; /* avoid warning */
							 | 
						|
								    (void) arg; /* avoid warning */
							 | 
						|
								    if (value != NULL) {
							 | 
						|
									FREE(value);
							 | 
						|
								    }
							 | 
						|
								    return(ST_CONTINUE);
							 | 
						|
								
							 | 
						|
								} /* end of stFree */
							 |