#include "calInt.h"
Go to the source code of this file.
static Cal_Bdd_t BddCofactorBF | ( | Cal_BddManager_t * | bddManager, | |
CalOpProc_t | calOpProc, | |||
Cal_Bdd_t | f, | |||
Cal_Bdd_t | c | |||
) | [static] |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 340 of file calReduce.c.
00344 { 00345 Cal_Bdd_t result; 00346 CalHashTable_t *hashTable; 00347 CalHashTable_t **cofactorHashTableArray = bddManager->reqQue[0]; 00348 CalHashTable_t *uniqueTableForId; 00349 00350 /*Cal_BddIndex_t minIndex;*/ 00351 int minIndex; 00352 int bddIndex; 00353 Cal_BddId_t bddId, minId; 00354 00355 if (CalBddIsBddZero(bddManager, c)){ 00356 CalBddWarningMessage("Bdd Cofactor Called with zero care set"); 00357 return bddManager->bddOne; 00358 } 00359 00360 if (calOpProc(bddManager, f, c, &result) == 1){ 00361 return result; 00362 } 00363 00364 CalBddGetMinIdAndMinIndex(bddManager, f, c, minId, minIndex); 00365 CalHashTableFindOrAdd(cofactorHashTableArray[minId], f, c, &result); 00366 for (bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){ 00367 bddId = bddManager->indexToId[bddIndex]; 00368 hashTable = cofactorHashTableArray[bddId]; 00369 if(hashTable->numEntries){ 00370 HashTableCofactorApply(bddManager, hashTable, cofactorHashTableArray, 00371 calOpProc); 00372 } 00373 } 00374 for(bddIndex = bddManager->numVars - 1; bddIndex >= minIndex; bddIndex--){ 00375 bddId = bddManager->indexToId[bddIndex]; 00376 uniqueTableForId = bddManager->uniqueTable[bddId]; 00377 hashTable = cofactorHashTableArray[bddId]; 00378 if(hashTable->numEntries){ 00379 HashTableCofactorReduce(bddManager, hashTable, uniqueTableForId); 00380 } 00381 } 00382 CalRequestIsForwardedTo(result); 00383 for (bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){ 00384 bddId = bddManager->indexToId[bddIndex]; 00385 CalHashTableCleanUp(cofactorHashTableArray[bddId]); 00386 } 00387 return result; 00388 }
static Cal_Bdd_t BddReduceBF | ( | Cal_BddManager_t * | bddManager, | |
CalOpProc_t | calOpProc, | |||
Cal_Bdd_t | f, | |||
Cal_Bdd_t | c | |||
) | [static] |
CFile***********************************************************************
FileName [calReduce.c]
PackageName [cal]
Synopsis [Routines for optimizing a BDD with respect to a don't care set (cofactor and restrict).]
Description []
SeeAlso [None]
Author [Rajeev K. Ranjan (rajeev@eecs.berkeley.edu) and Jagesh V. 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 [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 280 of file calReduce.c.
00285 { 00286 Cal_Bdd_t result; 00287 CalHashTable_t *hashTable; 00288 CalHashTable_t **orHashTableArray = bddManager->reqQue[0]; 00289 CalHashTable_t **reduceHashTableArray = bddManager->reqQue[1]; 00290 CalHashTable_t *uniqueTableForId; 00291 00292 /*Cal_BddIndex_t minIndex;*/ 00293 int minIndex; 00294 int bddIndex; 00295 Cal_BddId_t bddId, minId; 00296 00297 00298 if ((*calOpProc)(bddManager, f, c, &result) == 1){ 00299 return result; 00300 } 00301 00302 CalBddGetMinIdAndMinIndex(bddManager, f, c, minId, minIndex); 00303 CalHashTableFindOrAdd(reduceHashTableArray[minId], f, c, &result); 00304 for (bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){ 00305 bddId = bddManager->indexToId[bddIndex]; 00306 hashTable = reduceHashTableArray[bddId]; 00307 if(hashTable->numEntries){ 00308 HashTableReduceApply(bddManager, hashTable, reduceHashTableArray, 00309 orHashTableArray, CalOpCofactor); 00310 } 00311 } 00312 for(bddIndex = bddManager->numVars - 1; bddIndex >= minIndex; bddIndex--){ 00313 bddId = bddManager->indexToId[bddIndex]; 00314 uniqueTableForId = bddManager->uniqueTable[bddId]; 00315 hashTable = reduceHashTableArray[bddId]; 00316 if(hashTable->numEntries){ 00317 HashTableCofactorReduce(bddManager, hashTable, uniqueTableForId); 00318 } 00319 } 00320 CalRequestIsForwardedTo(result); 00321 for (bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){ 00322 bddId = bddManager->indexToId[bddIndex]; 00323 CalHashTableCleanUp(reduceHashTableArray[bddId]); 00324 } 00325 return result; 00326 }
Cal_Bdd Cal_BddBetween | ( | Cal_BddManager | bddManager, | |
Cal_Bdd | fMinUserBdd, | |||
Cal_Bdd | fMaxUserBdd | |||
) |
Function********************************************************************
Synopsis [Returns a minimal BDD whose function contains fMin and is contained in fMax.]
Description [Returns a minimal BDD f which is contains fMin and is contained in fMax ( fMin <= f <= fMax). This operation is typically used in state space searches to simplify the representation for the set of states wich will be expanded at each step (Rk Rk-1' <= f <= Rk).]
SideEffects [None]
SeeAlso [Cal_BddReduce]
Definition at line 185 of file calReduce.c.
00187 { 00188 if (CalBddPreProcessing(bddManager, 2, fMinUserBdd, fMaxUserBdd)){ 00189 Cal_Bdd_t fMin = CalBddGetInternalBdd(bddManager, fMinUserBdd); 00190 Cal_Bdd_t fMax = CalBddGetInternalBdd(bddManager, fMaxUserBdd); 00191 Cal_Bdd_t fMaxNot, careSet, result; 00192 Cal_Bdd resultUserBdd; 00193 long fMinSize, fMaxSize, resultSize; 00194 00195 CalBddNot(fMax, fMaxNot); 00196 careSet = CalBddOpBF(bddManager, CalOpOr, fMin, fMaxNot); 00197 result = BddReduceBF(bddManager, CalOpCofactor, fMin, careSet); 00198 resultUserBdd = CalBddGetExternalBdd(bddManager, result); 00199 if (CalBddPostProcessing(bddManager) == CAL_BDD_OVERFLOWED){ 00200 Cal_BddFree(bddManager, resultUserBdd); 00201 Cal_BddManagerGC(bddManager); 00202 return (Cal_Bdd) 0; 00203 } 00204 fMinSize = Cal_BddSize(bddManager, fMinUserBdd, 1); 00205 fMaxSize = Cal_BddSize(bddManager, fMaxUserBdd, 1); 00206 resultSize = Cal_BddSize(bddManager, resultUserBdd, 1); 00207 if (resultSize < fMinSize){ 00208 if (resultSize < fMaxSize){ 00209 return resultUserBdd; 00210 } 00211 else { 00212 Cal_BddFree(bddManager, resultUserBdd); 00213 return Cal_BddIdentity(bddManager, fMaxUserBdd); 00214 } 00215 } 00216 Cal_BddFree(bddManager, resultUserBdd); 00217 if (fMinSize < fMaxSize){ 00218 return Cal_BddIdentity(bddManager, fMinUserBdd); 00219 } 00220 else{ 00221 return Cal_BddIdentity(bddManager, fMaxUserBdd); 00222 } 00223 } 00224 return (Cal_Bdd) 0; 00225 }
Cal_Bdd Cal_BddCofactor | ( | Cal_BddManager | bddManager, | |
Cal_Bdd | fUserBdd, | |||
Cal_Bdd | cUserBdd | |||
) |
AutomaticEnd Function********************************************************************
Synopsis [Returns the generalized cofactor of BDD f with respect to BDD c.]
Description [Returns the generalized cofactor of BDD f with respect to BDD c. The constrain operator given by Coudert et al (ICCAD90) is used to find the generalized cofactor.]
SideEffects [None.]
SeeAlso [Cal_BddReduce]
Definition at line 100 of file calReduce.c.
00102 { 00103 Cal_Bdd_t result; 00104 Cal_Bdd userResult; 00105 if (CalBddPreProcessing(bddManager, 2, fUserBdd, cUserBdd)){ 00106 Cal_Bdd_t f = CalBddGetInternalBdd(bddManager, fUserBdd); 00107 Cal_Bdd_t c = CalBddGetInternalBdd(bddManager, cUserBdd); 00108 result = BddCofactorBF(bddManager, CalOpCofactor, f, c); 00109 userResult = CalBddGetExternalBdd(bddManager, result); 00110 if (CalBddPostProcessing(bddManager) == CAL_BDD_OVERFLOWED){ 00111 Cal_BddFree(bddManager, userResult); 00112 Cal_BddManagerGC(bddManager); 00113 return (Cal_Bdd) 0; 00114 } 00115 return userResult; 00116 } 00117 return (Cal_Bdd) 0; 00118 }
Cal_Bdd Cal_BddReduce | ( | Cal_BddManager | bddManager, | |
Cal_Bdd | fUserBdd, | |||
Cal_Bdd | cUserBdd | |||
) |
Function********************************************************************
Synopsis [Returns a BDD which agrees with f for all valuations which satisfy c.]
Description [Returns a BDD which agrees with f for all valuations which satisfy c. The result is usually smaller in terms of number of BDD nodes than f. This operation is typically used in state space searches to simplify the representation for the set of states wich will be expanded at each step.]
SideEffects [None]
SeeAlso [Cal_BddCofactor]
Definition at line 138 of file calReduce.c.
00140 { 00141 if (CalBddPreProcessing(bddManager, 2, fUserBdd, cUserBdd)){ 00142 Cal_Bdd_t f = CalBddGetInternalBdd(bddManager, fUserBdd); 00143 Cal_Bdd_t c = CalBddGetInternalBdd(bddManager, cUserBdd); 00144 Cal_Bdd_t result; 00145 Cal_Bdd userResult; 00146 00147 result = BddReduceBF(bddManager, CalOpCofactor, f, c); 00148 userResult = CalBddGetExternalBdd(bddManager, result); 00149 00150 if (CalBddPostProcessing(bddManager) == CAL_BDD_OVERFLOWED){ 00151 Cal_BddFree(bddManager, userResult); 00152 Cal_BddManagerGC(bddManager); 00153 return (Cal_Bdd) 0; 00154 } 00155 if (Cal_BddSize(bddManager, userResult, 1) < 00156 Cal_BddSize(bddManager, fUserBdd, 1)){ 00157 return userResult; 00158 } 00159 else{ 00160 Cal_BddFree(bddManager, userResult); 00161 return Cal_BddIdentity(bddManager, fUserBdd); 00162 } 00163 } 00164 return (Cal_Bdd) 0; 00165 }
int CalOpCofactor | ( | Cal_BddManager_t * | bddManager, | |
Cal_Bdd_t | f, | |||
Cal_Bdd_t | c, | |||
Cal_Bdd_t * | resultBddPtr | |||
) |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 243 of file calReduce.c.
00248 { 00249 if (CalBddIsBddConst(c)){ 00250 if (CalBddIsBddZero(bddManager, c)){ 00251 *resultBddPtr = bddManager->bddNull; 00252 } 00253 else { 00254 *resultBddPtr = f; 00255 } 00256 return 1; 00257 } 00258 if (CalBddIsBddConst(f)){ 00259 *resultBddPtr = f; 00260 return 1; 00261 } 00262 return 0; 00263 }
static void HashTableCofactorApply | ( | Cal_BddManager_t * | bddManager, | |
CalHashTable_t * | hashTable, | |||
CalHashTable_t ** | cofactorHashTableArray, | |||
CalOpProc_t | calOpProc | |||
) | [static] |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 519 of file calReduce.c.
00523 { 00524 int i, numBins = hashTable->numBins; 00525 CalBddNode_t **bins = hashTable->bins; 00526 CalRequestNode_t *requestNode; 00527 Cal_Bdd_t f, c, fx, cx, fxbar, cxbar, result; 00528 Cal_BddId_t bddId, minId; 00529 00530 for(i = 0; i < numBins; i++){ 00531 for(requestNode = bins[i]; 00532 requestNode != Cal_Nil(CalRequestNode_t); 00533 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){ 00534 CalRequestNodeGetF(requestNode, f); 00535 CalRequestNodeGetG(requestNode, c); 00536 CalBddGetMinId2(bddManager, f, c, minId); 00537 CalBddGetCofactors(f, minId, fx, fxbar); 00538 CalBddGetCofactors(c, minId, cx, cxbar); 00539 if((*calOpProc)(bddManager, fx, cx, &result) == 0){ 00540 CalBddGetMinId2(bddManager, fx, cx, bddId); 00541 CalHashTableFindOrAdd(cofactorHashTableArray[bddId], fx, cx, &result); 00542 } 00543 if (CalBddIsBddNull(bddManager, result) == 0){ 00544 CalBddIcrRefCount(result); 00545 } 00546 CalRequestNodePutThenRequest(requestNode, result); 00547 if((*calOpProc)(bddManager, fxbar, cxbar, &result) == 0){ 00548 CalBddGetMinId2(bddManager, fxbar, cxbar, bddId); 00549 CalHashTableFindOrAdd(cofactorHashTableArray[bddId], fxbar, cxbar, 00550 &result); 00551 } 00552 if (CalBddIsBddNull(bddManager, result) == 0){ 00553 CalBddIcrRefCount(result); 00554 } 00555 CalRequestNodePutElseRequest(requestNode, result); 00556 } 00557 } 00558 }
static void HashTableCofactorReduce | ( | Cal_BddManager_t * | bddManager, | |
CalHashTable_t * | hashTable, | |||
CalHashTable_t * | uniqueTableForId | |||
) | [static] |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 572 of file calReduce.c.
00575 { 00576 int i, numBins = hashTable->numBins; 00577 CalBddNode_t **bins = hashTable->bins; 00578 Cal_BddId_t currentBddId = uniqueTableForId->bddId; 00579 CalNodeManager_t *nodeManager = uniqueTableForId->nodeManager; 00580 CalRequestNode_t *requestNode, *next, *endNode; 00581 CalBddNode_t *bddNode; 00582 Cal_Bdd_t thenBdd, elseBdd, result; 00583 Cal_BddRefCount_t refCount; 00584 00585 endNode = hashTable->endNode; 00586 for(i = 0; i < numBins; i++){ 00587 for(requestNode = bins[i], bins[i] = Cal_Nil(CalRequestNode_t); 00588 requestNode != Cal_Nil(CalRequestNode_t); 00589 requestNode = next){ 00590 next = CalRequestNodeGetNextRequestNode(requestNode); 00591 /* Process the requestNode */ 00592 CalRequestNodeGetThenRequest(requestNode, thenBdd); 00593 CalRequestNodeGetElseRequest(requestNode, elseBdd); 00594 if (CalBddIsBddNull(bddManager, thenBdd)){ 00595 CalRequestIsForwardedTo(elseBdd); 00596 CalBddNodeGetRefCount(requestNode, refCount); 00597 CalBddAddRefCount(elseBdd, refCount - 1); 00598 CalRequestNodePutThenRequest(requestNode, elseBdd); 00599 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG); 00600 endNode->nextBddNode = requestNode; 00601 endNode = requestNode; 00602 continue; 00603 } 00604 else if (CalBddIsBddNull(bddManager, elseBdd)){ 00605 CalRequestIsForwardedTo(thenBdd); 00606 CalBddNodeGetRefCount(requestNode, refCount); 00607 CalBddAddRefCount(thenBdd, refCount - 1); 00608 CalRequestNodePutThenRequest(requestNode, thenBdd); 00609 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG); 00610 endNode->nextBddNode = requestNode; 00611 endNode = requestNode; 00612 continue; 00613 } 00614 CalRequestIsForwardedTo(thenBdd); 00615 CalRequestIsForwardedTo(elseBdd); 00616 if(CalBddIsEqual(thenBdd, elseBdd)){ 00617 CalBddNodeGetRefCount(requestNode, refCount); 00618 CalBddAddRefCount(thenBdd, refCount - 2); 00619 CalRequestNodePutThenRequest(requestNode, thenBdd); 00620 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG); 00621 endNode->nextBddNode = requestNode; 00622 endNode = requestNode; 00623 } 00624 else if(CalUniqueTableForIdLookup(bddManager, uniqueTableForId, 00625 thenBdd, elseBdd, &result) == 1){ 00626 CalBddDcrRefCount(thenBdd); 00627 CalBddDcrRefCount(elseBdd); 00628 CalBddNodeGetRefCount(requestNode, refCount); 00629 CalBddAddRefCount(result, refCount); 00630 CalRequestNodePutThenRequest(requestNode, result); 00631 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG); 00632 endNode->nextBddNode = requestNode; 00633 endNode = requestNode; 00634 } 00635 else if(CalBddIsOutPos(thenBdd)){ 00636 CalRequestNodePutThenRequest(requestNode, thenBdd); 00637 CalRequestNodePutElseRequest(requestNode, elseBdd); 00638 CalHashTableAddDirect(uniqueTableForId, requestNode); 00639 bddManager->numNodes++; 00640 bddManager->gcCheck--; 00641 } 00642 else{ 00643 CalNodeManagerAllocNode(nodeManager, bddNode); 00644 CalBddNodePutThenBddId(bddNode, CalBddGetBddId(thenBdd)); 00645 CalBddNodePutThenBddNode(bddNode, CalBddGetBddNodeNot(thenBdd)); 00646 CalBddNodePutElseBddId(bddNode, CalBddGetBddId(elseBdd)); 00647 CalBddNodePutElseBddNode(bddNode, CalBddGetBddNodeNot(elseBdd)); 00648 CalBddNodeGetRefCount(requestNode, refCount); 00649 CalBddNodePutRefCount(bddNode, refCount); 00650 CalHashTableAddDirect(uniqueTableForId, bddNode); 00651 bddManager->numNodes++; 00652 bddManager->gcCheck--; 00653 CalRequestNodePutThenRequestId(requestNode, currentBddId); 00654 CalRequestNodePutThenRequestNode(requestNode, CalBddNodeNot(bddNode)); 00655 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG); 00656 endNode->nextBddNode = requestNode; 00657 endNode = requestNode; 00658 } 00659 } 00660 } 00661 hashTable->endNode = endNode; 00662 }
static void HashTableReduceApply | ( | Cal_BddManager_t * | bddManager, | |
CalHashTable_t * | hashTable, | |||
CalHashTable_t ** | reduceHashTableArray, | |||
CalHashTable_t ** | orHashTableArray, | |||
CalOpProc_t | calOpProc | |||
) | [static] |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 402 of file calReduce.c.
00407 { 00408 int i, numBins = hashTable->numBins; 00409 CalRequestNode_t *requestNode, *last, *nextRequestNode, *requestNodeList; 00410 Cal_Bdd_t f, c, fx, cx, fxbar, cxbar, result, orResult; 00411 Cal_BddId_t bddId, minId; 00412 /*Cal_BddIndex_t minIndex;*/ 00413 int minIndex; 00414 int bddIndex; 00415 CalHashTable_t *orHashTable; 00416 00417 requestNodeList = Cal_Nil(CalRequestNode_t); 00418 for(i = 0; i < numBins; i++){ 00419 last = Cal_Nil(CalRequestNode_t); 00420 for (requestNode = hashTable->bins[i]; requestNode != 00421 Cal_Nil(CalRequestNode_t); 00422 requestNode = nextRequestNode){ 00423 nextRequestNode = CalRequestNodeGetNextRequestNode(requestNode); 00424 CalRequestNodeGetF(requestNode, f); 00425 CalRequestNodeGetG(requestNode, c); 00426 CalBddGetMinId2(bddManager, f, c, minId); 00427 CalBddGetCofactors(c, minId, cx, cxbar); 00428 if (CalBddGetBddId(f) != minId){ 00429 if (CalOpOr(bddManager, cx, cxbar, &orResult) == 0){ 00430 CalBddNormalize(cx, cxbar); 00431 CalBddGetMinId2(bddManager, cx, cxbar, minId); 00432 CalHashTableFindOrAdd(orHashTableArray[minId], cx, cxbar, &orResult); 00433 } 00434 CalRequestNodePutElseRequest(requestNode, orResult); 00435 if (last == Cal_Nil(CalRequestNode_t)){ 00436 hashTable->bins[i] = nextRequestNode; 00437 } 00438 else { 00439 CalRequestNodePutNextRequestNode(last, nextRequestNode); 00440 } 00441 CalRequestNodePutNextRequestNode(requestNode, requestNodeList); 00442 requestNodeList = requestNode; 00443 } 00444 else{ 00445 last = requestNode; 00446 CalBddGetCofactors(f, minId, fx, fxbar); 00447 if((*calOpProc)(bddManager, fx, cx, &result) == 0){ 00448 CalBddGetMinId2(bddManager, fx, cx, bddId); 00449 CalHashTableFindOrAdd(reduceHashTableArray[bddId], fx, cx, &result); 00450 } 00451 if (CalBddIsBddNull(bddManager, result) == 0){ 00452 CalBddIcrRefCount(result); 00453 } 00454 CalRequestNodePutThenRequest(requestNode, result); 00455 if((*calOpProc)(bddManager, fxbar, cxbar, &result) == 0){ 00456 CalBddGetMinId2(bddManager, fxbar, cxbar, bddId); 00457 CalHashTableFindOrAdd(reduceHashTableArray[bddId], fxbar, cxbar, 00458 &result); 00459 } 00460 if (CalBddIsBddNull(bddManager, result) == 0){ 00461 CalBddIcrRefCount(result); 00462 } 00463 CalRequestNodePutElseRequest(requestNode, result); 00464 } 00465 } 00466 } 00467 minIndex = bddManager->idToIndex[hashTable->bddId]; 00468 for (bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){ 00469 bddId = bddManager->indexToId[bddIndex]; 00470 orHashTable = orHashTableArray[bddId]; 00471 if(orHashTable->numEntries){ 00472 CalHashTableApply(bddManager, orHashTable, orHashTableArray, CalOpOr); 00473 } 00474 } 00475 00476 for(bddIndex = bddManager->numVars - 1; bddIndex >= minIndex; bddIndex--){ 00477 CalHashTable_t *uniqueTableForId; 00478 bddId = bddManager->indexToId[bddIndex]; 00479 uniqueTableForId = bddManager->uniqueTable[bddId]; 00480 orHashTable = orHashTableArray[bddId]; 00481 if(orHashTable->numEntries){ 00482 CalHashTableReduce(bddManager, orHashTable, uniqueTableForId); 00483 } 00484 } 00485 for (requestNode = requestNodeList; requestNode; requestNode = 00486 nextRequestNode){ 00487 nextRequestNode = CalRequestNodeGetNextRequestNode(requestNode); 00488 CalRequestNodeGetElseRequest(requestNode, orResult); 00489 CalRequestIsForwardedTo(orResult); 00490 CalRequestNodeGetThenRequest(requestNode, f); 00491 CalBddGetMinId2(bddManager, f, orResult, minId); 00492 CalHashTableFindOrAdd(reduceHashTableArray[minId], f, orResult, 00493 &result); 00494 CalRequestNodePutThenRequest(requestNode, result); 00495 CalRequestNodePutElseRequest(requestNode, result); 00496 CalBddAddRefCount(result, 2); 00497 CalHashTableAddDirect(hashTable, requestNode); 00498 } 00499 00500 /* Clean up the orHashTableArray */ 00501 for(bddIndex = bddManager->numVars - 1; bddIndex >= minIndex; bddIndex--){ 00502 bddId = bddManager->indexToId[bddIndex]; 00503 CalHashTableCleanUp(orHashTableArray[bddId]); 00504 } 00505 }