src/calBdd/calAssociation.c File Reference

#include "calInt.h"
Include dependency graph for calAssociation.c:

Go to the source code of this file.

Functions

static int AssociationIsEqual (Cal_BddManager_t *bddManager, Cal_Bdd_t *p, Cal_Bdd_t *q)
static int CheckAssoc (Cal_BddManager_t *bddManager, Cal_Bdd *assocInfo, int pairs)
int Cal_AssociationInit (Cal_BddManager bddManager, Cal_Bdd *associationInfoUserBdds, int pairs)
void Cal_AssociationQuit (Cal_BddManager bddManager, int associationId)
int Cal_AssociationSetCurrent (Cal_BddManager bddManager, int associationId)
void Cal_TempAssociationAugment (Cal_BddManager bddManager, Cal_Bdd *associationInfoUserBdds, int pairs)
void Cal_TempAssociationInit (Cal_BddManager bddManager, Cal_Bdd *associationInfoUserBdds, int pairs)
void Cal_TempAssociationQuit (Cal_BddManager bddManager)
void CalAssociationListFree (Cal_BddManager_t *bddManager)
void CalVarAssociationRepackUpdate (Cal_BddManager_t *bddManager, Cal_BddId_t id)
void CalCheckAssociationValidity (Cal_BddManager_t *bddManager)
void CalReorderAssociationFix (Cal_BddManager_t *bddManager)

Function Documentation

static int AssociationIsEqual ( Cal_BddManager_t bddManager,
Cal_Bdd_t p,
Cal_Bdd_t q 
) [static]

CFile***********************************************************************

FileName [calAssociation.c]

PackageName [cal]

Synopsis [Contains the routines related to the variable association.]

Description [optional]

SeeAlso [optional]

Author [Rajeev K. Ranjan (rajeev@eecs.berkeley.edu) Jagesh Sanghavi (sanghavi@eecs.berkeley.edu) ]

Copyright [Copyright (c) 1994-1996 The Regents of the Univ. of California. All rights reserved.

Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software.

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.]

Revision [

Id
calAssociation.c,v 1.1.1.3 1998/05/04 00:58:50 hsv Exp

]AutomaticStart

Function********************************************************************

Synopsis [Checks for equality of two associations]

Description [Checks for equality of two associations]

SideEffects [None]

Definition at line 560 of file calAssociation.c.

00563 {
00564   int i;
00565   for(i = 1; i <= bddManager->maxNumVars; i++){
00566     if(CalBddIsEqual(p[i], q[i]) == 0){
00567       return (0);
00568     }
00569   }
00570   return (1);
00571 }

int Cal_AssociationInit ( Cal_BddManager  bddManager,
Cal_Bdd associationInfoUserBdds,
int  pairs 
)

AutomaticEnd Function********************************************************************

Synopsis [Creates or finds a variable association.]

Description [Creates or finds a variable association. The association is specified by associationInfo, which is a an array of BDD with Cal_BddNull(bddManager) as the end marker. If pairs is 0, the array is assumed to be an array of variables. In this case, each variable is paired with constant BDD one. Such an association may viewed as specifying a set of variables for use with routines such as Cal_BddExists. If pair is not 0, then the even numbered array elements should be variables and the odd numbered elements should be the BDDs which they are mapped to. In both cases, the return value is an integer identifier for this association. If the given association is equivalent to one which already exists, the same identifier is used for both, and the reference count of the association is increased by one.]

SideEffects [None]

SeeAlso [Cal_AssociationQuit]

Definition at line 106 of file calAssociation.c.

00109 {
00110   int i, numAssociations;
00111   CalAssociation_t *p, **q;
00112   Cal_Bdd_t f;
00113   Cal_Bdd_t *varAssociation;
00114   Cal_BddId_t j;
00115   long last;
00116   Cal_Bdd_t *associationInfo;
00117   
00118   if (!CheckAssoc(bddManager, associationInfoUserBdds, pairs)){
00119     return (-1);
00120   }
00121 
00122 
00123 /* First count the number of elements */
00124   for (i=0; associationInfoUserBdds[i]; i++);
00125   if (pairs)  numAssociations = i/2;
00126   else numAssociations = i;
00127   associationInfo = Cal_MemAlloc(Cal_Bdd_t, i+1);
00128   for (j=0; j < i; j++){
00129     associationInfo[j] =
00130         CalBddGetInternalBdd(bddManager,associationInfoUserBdds[j]);
00131   }
00132   associationInfo[j] = bddManager->bddNull;
00133 
00134   
00135   varAssociation = Cal_MemAlloc(Cal_Bdd_t, bddManager->maxNumVars+1);
00136   for(i = 0; i <= bddManager->maxNumVars; i++){
00137     varAssociation[i] = bddManager->bddNull;
00138   }
00139 
00140   
00141   if(pairs){
00142     for(i = 0; i < numAssociations; i++){
00143       f = associationInfo[(i<<1)];
00144       varAssociation[CalBddGetBddId(f)] = associationInfo[(i<<1)+1];
00145     }
00146   }
00147   else{
00148     for(i = 0; i < numAssociations; i++){
00149       f=associationInfo[i];
00150       varAssociation[CalBddGetBddId(f)] = CalBddOne(bddManager);
00151     }
00152   }
00153   /* Check for existence. */
00154   for(p = bddManager->associationList; p; p = p->next){
00155     if(AssociationIsEqual(bddManager, p->varAssociation, varAssociation)){
00156         Cal_MemFree(varAssociation);
00157     Cal_MemFree(associationInfo);
00158         p->refCount++;
00159         return (p->id);
00160     }
00161   }
00162   /* Find the first unused id. */
00163   for(q = &bddManager->associationList, p = *q, i = 0;
00164       p && p->id == i; q = &p->next, p = *q, ++i){
00165   }
00166   /*p = Cal_MemAlloc(CalAssociation_t, 1);*/
00167   /*p = CAL_BDD_NEW_REC(bddManager, CalAssociation_t);*/
00168   p = Cal_MemAlloc(CalAssociation_t, 1);
00169   p->id = i;
00170   p->next = *q;
00171   *q = p;
00172   p->varAssociation = varAssociation;
00173   last = -1;
00174   if(pairs){
00175     for(i = 0; i < numAssociations; i++){
00176       f = associationInfo[(i<<1)];
00177       j = CalBddGetBddIndex(bddManager, f);
00178       if((long)j > last){
00179           last = j;
00180       }
00181     }
00182   }
00183   else{
00184     for(i = 0; i < numAssociations; i++){
00185       f = associationInfo[i];
00186       j = CalBddGetBddIndex(bddManager, f);
00187       if((long)j > last){
00188           last = j;
00189       }
00190     }
00191   }
00192   p->lastBddIndex = last;
00193   p->refCount = 1;
00194   /* Protect BDDs in the association. */
00195   if(pairs){
00196     for(i = 0; i < numAssociations; i++){
00197       f = associationInfo[(i<<1)+1];
00198       CalBddIcrRefCount(f);
00199     }
00200   }
00201   Cal_MemFree(associationInfo);
00202   return p->id;
00203 }

void Cal_AssociationQuit ( Cal_BddManager  bddManager,
int  associationId 
)

Function********************************************************************

Synopsis [Deletes the variable association given by id]

Description [Decrements the reference count of the variable association with identifier id, and frees it if the reference count becomes zero.]

SideEffects [None]

SeeAlso [Cal_AssociationInit]

Definition at line 219 of file calAssociation.c.

00220 {
00221   Cal_BddId_t i;
00222   Cal_Bdd_t f;
00223   CalAssociation_t *p, **q;
00224 
00225   if(bddManager->currentAssociation->id == associationId){
00226     bddManager->currentAssociation = bddManager->tempAssociation;
00227   }
00228   for(q = &bddManager->associationList, p = *q; p; q = &p->next, p = *q){
00229     if(p->id == associationId){
00230       p->refCount--;
00231       if(!p->refCount){
00232         /* Unprotect the BDDs in the association. */
00233         for(i = 1; i <= bddManager->numVars; i++){
00234           f = p->varAssociation[i];
00235           if(!CalBddIsBddNull(bddManager, f)){
00236             CalBddDcrRefCount(f);
00237           }
00238         }
00239         *q = p->next;
00240         Cal_MemFree(p->varAssociation);
00241         /*CAL_BDD_FREE_REC(bddManager, p, CalAssociation_t);*/
00242         Cal_MemFree(p);
00243         CalCacheTableTwoFlushAssociationId(bddManager, associationId);
00244       }
00245       return;
00246     }
00247   }
00248   CalBddWarningMessage("Cal_AssociationQuit: no association with specified ID");
00249 }

int Cal_AssociationSetCurrent ( Cal_BddManager  bddManager,
int  associationId 
)

Function********************************************************************

Synopsis [Sets the current variable association to the one given by id and returns the ID of the old association.]

Description [Sets the current variable association to the one given by id and returns the ID of the old association. An id of -1 indicates the temporary association]

SideEffects [None]

Definition at line 264 of file calAssociation.c.

00265 {
00266   int oldAssociationId;
00267   CalAssociation_t *p;
00268 
00269   oldAssociationId = bddManager->currentAssociation->id;
00270   if(associationId != -1){
00271     for(p = bddManager->associationList; p; p = p->next){
00272       if(p->id == associationId){
00273         bddManager->currentAssociation = p;
00274         return (oldAssociationId);
00275       }
00276     }
00277     CalBddWarningMessage(
00278         "Cal_AssociationSetCurrent: no variable association with specified ID.\n May have been discarded during dynamic reordering.");
00279   }
00280   bddManager->currentAssociation = bddManager->tempAssociation;
00281   return oldAssociationId;
00282 }

void Cal_TempAssociationAugment ( Cal_BddManager  bddManager,
Cal_Bdd associationInfoUserBdds,
int  pairs 
)

Function********************************************************************

Synopsis [Adds to the temporary variable association.]

Description [Pairs is 0 if the information represents only a list of variables rather than a full association.]

SideEffects [None]

Definition at line 296 of file calAssociation.c.

00299 {
00300   int i, j, numAssociations;
00301   Cal_Bdd_t f;
00302   long last;
00303   Cal_Bdd_t *associationInfo;
00304   
00305   if (CheckAssoc(bddManager, associationInfoUserBdds, pairs) == 0) {
00306     return;
00307   }
00308 
00309   /*while (associationInfoUserBdds[i++]);*/
00310   for (i=0; associationInfoUserBdds[i]; i++);
00311   if (pairs) numAssociations = i/2;
00312   else numAssociations = i;
00313   associationInfo = Cal_MemAlloc(Cal_Bdd_t, i+1);
00314   for (j=0; j < i; j++){
00315     associationInfo[j] =
00316         CalBddGetInternalBdd(bddManager,associationInfoUserBdds[j]);
00317   }
00318   associationInfo[j] = bddManager->bddNull;
00319   
00320   last = bddManager->tempAssociation->lastBddIndex;
00321   if(pairs){
00322     for(i = 0; i < numAssociations; i++){
00323       f = associationInfo[(i<<1)];
00324       j = CalBddGetBddId(f);
00325       if(bddManager->idToIndex[j] > last){
00326         last = bddManager->idToIndex[j];
00327       }
00328       f = bddManager->tempAssociation->varAssociation[j];
00329       if(!CalBddIsBddNull(bddManager, f)){
00330         CalBddDcrRefCount(f);
00331       }
00332       f = associationInfo[(i<<1)+1];
00333       bddManager->tempAssociation->varAssociation[j] = f;
00334       /* Protect BDDs in the association. */
00335       CalBddIcrRefCount(f);
00336     }
00337   }
00338   else{
00339     for(i = 0; i < numAssociations; i++){
00340       f = associationInfo[i];
00341       j = CalBddGetBddId(f);
00342       if(bddManager->idToIndex[j] > last){
00343         last = bddManager->idToIndex[j];
00344       }
00345       f = bddManager->tempAssociation->varAssociation[j];
00346       if(!CalBddIsBddNull(bddManager, f)){
00347         CalBddDcrRefCount(f);
00348       }
00349       bddManager->tempAssociation->varAssociation[j] = CalBddOne(bddManager);
00350     } 
00351   }
00352   bddManager->tempAssociation->lastBddIndex = last;
00353   Cal_MemFree(associationInfo);
00354 }

void Cal_TempAssociationInit ( Cal_BddManager  bddManager,
Cal_Bdd associationInfoUserBdds,
int  pairs 
)

Function********************************************************************

Synopsis [Sets the temporary variable association.]

Description [Pairs is 0 if the information represents only a list of variables rather than a full association.]

SideEffects [None]

Definition at line 369 of file calAssociation.c.

00372 {
00373   long i;
00374   Cal_Bdd_t f;
00375 
00376   /* Clean up old temporary association. */
00377   for(i = 1; i <= bddManager->numVars; i++){
00378     f = bddManager->tempAssociation->varAssociation[i];
00379     if(!CalBddIsBddNull(bddManager, f)){
00380       CalBddDcrRefCount(f);
00381       bddManager->tempAssociation->varAssociation[i] = bddManager->bddNull;
00382     }
00383   }
00384   bddManager->tempAssociation->lastBddIndex = -1;
00385   Cal_TempAssociationAugment(bddManager, associationInfoUserBdds, pairs);
00386 }

void Cal_TempAssociationQuit ( Cal_BddManager  bddManager  ) 

Function********************************************************************

Synopsis [Cleans up temporary association]

Description [Cleans up temporary associationoptional]

SideEffects [None]

Definition at line 398 of file calAssociation.c.

00399 {
00400   int i;
00401   Cal_Bdd_t f;
00402 
00403   /* Clean up old temporary association. */
00404   for(i = 1; i <= bddManager->numVars; i++){
00405     f = bddManager->tempAssociation->varAssociation[i];
00406     if(!CalBddIsBddNull(bddManager, f)){
00407       CalBddDcrRefCount(f);
00408       bddManager->tempAssociation->varAssociation[i] = bddManager->bddNull;
00409     }
00410   }
00411   bddManager->tempAssociation->lastBddIndex = -1;
00412 }

void CalAssociationListFree ( Cal_BddManager_t bddManager  ) 

Function********************************************************************

Synopsis [Frees the variable associations]

Description [optional]

SideEffects [required]

SeeAlso [optional]

Definition at line 431 of file calAssociation.c.

00432 {
00433   CalAssociation_t *assoc, *nextAssoc;
00434   
00435   for(assoc = bddManager->associationList;
00436       assoc != Cal_Nil(CalAssociation_t); assoc = nextAssoc){
00437     nextAssoc = assoc->next;
00438     Cal_MemFree(assoc->varAssociation);
00439     /*CAL_BDD_FREE_REC(bddManager, assoc, CalAssociation_t);*/
00440     Cal_MemFree(assoc);
00441   }
00442 }

void CalCheckAssociationValidity ( Cal_BddManager_t bddManager  ) 

Function********************************************************************

Synopsis [Checks the validity of association.]

Description [optional]

SideEffects [required]

SeeAlso [optional]

Definition at line 492 of file calAssociation.c.

00493 {
00494   CalAssociation_t *assoc, *nextAssoc;
00495   int i;
00496   
00497   for(assoc = bddManager->associationList;
00498       assoc != Cal_Nil(CalAssociation_t); assoc = nextAssoc){
00499     nextAssoc = assoc->next;
00500     for (i=1; i <= bddManager->numVars; i++){
00501       Cal_Assert(CalBddIsForwarded(assoc->varAssociation[i]) == 0);
00502     }
00503   }
00504   /* temporary association */
00505   assoc = bddManager->tempAssociation;
00506   for (i=1; i <= bddManager->numVars; i++){
00507     Cal_Assert(CalBddIsForwarded(assoc->varAssociation[i]) == 0);
00508   }
00509 }

void CalReorderAssociationFix ( Cal_BddManager_t bddManager  ) 

Function********************************************************************

Synopsis [required]

Description [optional]

SideEffects [required]

SeeAlso [optional]

Definition at line 523 of file calAssociation.c.

00524 {
00525   CalAssociation_t *assoc, *nextAssoc;
00526   int i;
00527   
00528   for(assoc = bddManager->associationList;
00529       assoc != Cal_Nil(CalAssociation_t); assoc = nextAssoc){
00530     nextAssoc = assoc->next;
00531     for (i=1; i <= bddManager->numVars; i++){
00532         if (CalBddGetBddId(assoc->varAssociation[i]) != CAL_BDD_NULL_ID){
00533             CalBddIsForwardedTo(assoc->varAssociation[i]);
00534         }
00535     }
00536   }
00537   /* fix temporary association */
00538   assoc = bddManager->tempAssociation;
00539   for (i=1; i <= bddManager->numVars; i++){
00540       if (CalBddGetBddId(assoc->varAssociation[i]) != CAL_BDD_NULL_ID){
00541           CalBddIsForwardedTo(assoc->varAssociation[i]);
00542       }
00543   }
00544 }

void CalVarAssociationRepackUpdate ( Cal_BddManager_t bddManager,
Cal_BddId_t  id 
)

Function********************************************************************

Synopsis [Need to be called after repacking.]

Description [optional]

SideEffects [required]

SeeAlso [optional]

Definition at line 456 of file calAssociation.c.

00458 {
00459   CalAssociation_t *assoc, *nextAssoc;
00460   int i;
00461   
00462   for(assoc = bddManager->associationList;
00463       assoc != Cal_Nil(CalAssociation_t); assoc = nextAssoc){
00464     nextAssoc = assoc->next;
00465     for (i=1; i <= bddManager->numVars; i++){
00466       if (CalBddGetBddId(assoc->varAssociation[i]) == id){
00467         CalBddForward(assoc->varAssociation[i]);
00468       }
00469     }
00470   }
00471   /* fix temporary association */
00472   assoc = bddManager->tempAssociation;
00473   for (i=1; i <= bddManager->numVars; i++){
00474     if (CalBddGetBddId(assoc->varAssociation[i]) == id){
00475       CalBddForward(assoc->varAssociation[i]);
00476     }
00477   }
00478 }

static int CheckAssoc ( Cal_BddManager_t bddManager,
Cal_Bdd assocInfo,
int  pairs 
) [static]

Function********************************************************************

Synopsis [required]

Description [optional]

SideEffects [required]

SeeAlso [optional]

Definition at line 585 of file calAssociation.c.

00586 {
00587   CalBddArrayPreProcessing(bddManager, assocInfo);
00588   if (pairs){
00589     while (assocInfo[0] && assocInfo[1]){
00590       if (CalBddTypeAux(bddManager,
00591                         CalBddGetInternalBdd(bddManager, assocInfo[0])) !=
00592           CAL_BDD_TYPE_POSVAR){  
00593             CalBddWarningMessage("CheckAssoc: first element in pair is not a positive variable"); 
00594             return (0);
00595           }
00596       assocInfo+=2;
00597     }
00598   }
00599   return (1);
00600 }


Generated on Tue Jan 12 13:57:10 2010 for glu-2.2 by  doxygen 1.6.1