#include "calInt.h"
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) |
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 [
]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 }