#include "calInt.h"
Go to the source code of this file.
Functions | |
Cal_Bdd | Cal_BddCompose (Cal_BddManager bddManager, Cal_Bdd fUserBdd, Cal_Bdd gUserBdd, Cal_Bdd hUserBdd) |
void | CalRequestNodeListCompose (Cal_BddManager_t *bddManager, CalRequestNode_t *requestNodeList, Cal_BddIndex_t composeIndex) |
void | CalHashTableComposeApply (Cal_BddManager_t *bddManager, CalHashTable_t *hashTable, Cal_BddIndex_t gIndex, CalHashTable_t **reqQueForCompose, CalHashTable_t **reqQueForITE) |
void | CalComposeRequestCreate (Cal_BddManager_t *bddManager, Cal_Bdd_t f, Cal_Bdd_t h, Cal_BddIndex_t composeIndex, CalHashTable_t **reqQueForCompose, CalHashTable_t **reqQueForITE, Cal_Bdd_t *resultPtr) |
Cal_Bdd Cal_BddCompose | ( | Cal_BddManager | bddManager, | |
Cal_Bdd | fUserBdd, | |||
Cal_Bdd | gUserBdd, | |||
Cal_Bdd | hUserBdd | |||
) |
CFile***********************************************************************
FileName [calBddCompose.c]
PackageName [cal]
Synopsis [Routine for composing one BDD into another.]
Description []
SeeAlso []
Author [Jagesh Sanghavi (sanghavi@eecs.berkeley.edu) Rajeev Ranjan (rajeev@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 AutomaticEnd Function********************************************************************
Synopsis [composition - substitute a BDD variable by a function]
Description [Returns the BDD obtained by substituting a variable by a function]
SideEffects [None]
Definition at line 84 of file calBddCompose.c.
00086 { 00087 Cal_Bdd_t result; 00088 CalRequestNode_t *requestNode; 00089 Cal_Bdd_t F, G, H; 00090 00091 if (CalBddPreProcessing(bddManager, 3, fUserBdd, gUserBdd, hUserBdd) == 0){ 00092 result = bddManager->bddNull; 00093 } 00094 F = CalBddGetInternalBdd(bddManager, fUserBdd); 00095 G = CalBddGetInternalBdd(bddManager, gUserBdd); 00096 H = CalBddGetInternalBdd(bddManager, hUserBdd); 00097 00098 if(CalBddIsBddConst(G)){ 00099 CalBddNodeIcrRefCount(fUserBdd); 00100 return fUserBdd; 00101 } 00102 CalNodeManagerAllocNode(bddManager->nodeManagerArray[0], requestNode); 00103 CalRequestNodePutF(requestNode, F); 00104 CalRequestNodePutG(requestNode, H); 00105 CalRequestNodePutNextRequestNode(requestNode, 0); 00106 bddManager->requestNodeListArray[0] = requestNode; 00107 /* 00108 ** We can achieve a superscalar compose operation, provided G 00109 ** is the same for all the compose operation 00110 */ 00111 00112 CalRequestNodeListCompose(bddManager, bddManager->requestNodeListArray[0], 00113 CalBddGetBddIndex(bddManager, G)); 00114 00115 CalRequestNodeGetThenRequest(requestNode, result); 00116 CalNodeManagerFreeNode(bddManager->nodeManagerArray[0], requestNode); 00117 bddManager->requestNodeListArray[0] = Cal_Nil(CalRequestNode_t); 00118 00119 return CalBddGetExternalBdd(bddManager, result); 00120 }
void CalComposeRequestCreate | ( | Cal_BddManager_t * | bddManager, | |
Cal_Bdd_t | f, | |||
Cal_Bdd_t | h, | |||
Cal_BddIndex_t | composeIndex, | |||
CalHashTable_t ** | reqQueForCompose, | |||
CalHashTable_t ** | reqQueForITE, | |||
Cal_Bdd_t * | resultPtr | |||
) |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 304 of file calBddCompose.c.
00311 { 00312 Cal_BddIndex_t index; 00313 Cal_BddId_t bddId; 00314 00315 index = CalBddGetBddIndex(bddManager, f); 00316 if(index > composeIndex){ 00317 *resultPtr = f; 00318 } 00319 else if(index < composeIndex){ 00320 CalBddGetMinId2(bddManager, f, h, bddId); 00321 CalHashTableFindOrAdd(reqQueForCompose[bddId], f, h, resultPtr); 00322 } 00323 else{ 00324 Cal_Bdd_t calBdd1, calBdd2, calBdd3; 00325 calBdd1 = h; 00326 CalBddGetThenBdd(f, calBdd2); 00327 CalBddGetElseBdd(f, calBdd3); 00328 *resultPtr = CalOpITE(bddManager, calBdd1, calBdd2, calBdd3, reqQueForITE); 00329 } 00330 }
void CalHashTableComposeApply | ( | Cal_BddManager_t * | bddManager, | |
CalHashTable_t * | hashTable, | |||
Cal_BddIndex_t | gIndex, | |||
CalHashTable_t ** | reqQueForCompose, | |||
CalHashTable_t ** | reqQueForITE | |||
) |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
Definition at line 219 of file calBddCompose.c.
00224 { 00225 int i, numBins = hashTable->numBins; 00226 CalBddNode_t **bins = hashTable->bins; 00227 CalRequestNode_t *requestNode; 00228 Cal_Bdd_t fx, fxbar; 00229 Cal_Bdd_t hx, hxbar; 00230 Cal_Bdd_t calBdd1, calBdd2, calBdd3; 00231 Cal_Bdd_t result; 00232 Cal_BddId_t bddId; 00233 Cal_BddIndex_t index; 00234 00235 for(i = 0; i < numBins; i++){ 00236 for(requestNode = bins[i]; 00237 requestNode != Cal_Nil(CalRequestNode_t); 00238 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){ 00239 00240 /* Process the requestNode */ 00241 CalRequestNodeGetCofactors(bddManager, requestNode, fx, fxbar, hx, hxbar); 00242 00243 /* Process left cofactor */ 00244 index = CalBddGetBddIndex(bddManager, fx); 00245 if(index > gIndex){ 00246 CalBddIcrRefCount(fx); 00247 CalRequestNodePutThenRequest(requestNode, fx); 00248 } 00249 else if(index < gIndex){ 00250 CalBddGetMinId2(bddManager, fx, hx, bddId); 00251 CalHashTableFindOrAdd(reqQueForCompose[bddId], fx, hx, &result); 00252 CalBddIcrRefCount(result); 00253 CalRequestNodePutThenRequest(requestNode, result); 00254 } 00255 else{ 00256 /* fxIndex == gIndex */ 00257 /* RequestNodeThen = ITE(hx, fxThen, fxElse) */ 00258 calBdd1 = hx; 00259 CalBddGetThenBdd(fx, calBdd2); 00260 CalBddGetElseBdd(fx, calBdd3); 00261 result = CalOpITE(bddManager, calBdd1, calBdd2, calBdd3, reqQueForITE); 00262 CalBddIcrRefCount(result); 00263 CalRequestNodePutThenRequest(requestNode, result); 00264 } 00265 00266 /* Process right cofactor */ 00267 index = CalBddGetBddIndex(bddManager, fxbar); 00268 if(index > gIndex){ 00269 CalBddIcrRefCount(fxbar); 00270 CalRequestNodePutElseRequest(requestNode, fxbar); 00271 } 00272 else if(index < gIndex){ 00273 CalBddGetMinId2(bddManager, fxbar, hxbar, bddId); 00274 CalHashTableFindOrAdd(reqQueForCompose[bddId], fxbar, hxbar, &result); 00275 CalBddIcrRefCount(result); 00276 CalRequestNodePutElseRequest(requestNode, result); 00277 } 00278 else{ 00279 /* fxbarIndex == gIndex */ 00280 /* RequestNodeElse = ITE(hxbar, fxbarThen, fxbarElse) */ 00281 calBdd1 = hxbar; 00282 CalBddGetThenBdd(fxbar, calBdd2); 00283 CalBddGetElseBdd(fxbar, calBdd3); 00284 result = CalOpITE(bddManager, calBdd1, calBdd2, calBdd3, reqQueForITE); 00285 CalBddIcrRefCount(result); 00286 CalRequestNodePutElseRequest(requestNode, result); 00287 } 00288 } 00289 } 00290 }
void CalRequestNodeListCompose | ( | Cal_BddManager_t * | bddManager, | |
CalRequestNode_t * | requestNodeList, | |||
Cal_BddIndex_t | composeIndex | |||
) |
Function********************************************************************
Synopsis [required]
Description [optional]
SideEffects [required]
SeeAlso [optional]
note [THERE IS A POSSIBILITY OF HAVING A PIPELINED VERSION NEED TO THINK IT THROUGH]
Definition at line 140 of file calBddCompose.c.
00143 { 00144 CalRequestNode_t *requestNode; 00145 CalRequest_t F, H, result; 00146 int bddId, bddIndex; 00147 CalHashTable_t *hashTable, *uniqueTableForId; 00148 CalHashTable_t **reqQueForCompose = bddManager->reqQue[0]; 00149 CalHashTable_t **reqQueForITE = bddManager->reqQue[1]; 00150 00151 /* ReqQueForComposeInsertUsingReqList */ 00152 for(requestNode = requestNodeList; 00153 requestNode != Cal_Nil(CalRequestNode_t); 00154 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){ 00155 CalRequestNodeGetF(requestNode, F); 00156 CalRequestNodeGetG(requestNode, H); 00157 CalComposeRequestCreate(bddManager, F, H, composeIndex, 00158 reqQueForCompose, reqQueForITE, &result); 00159 CalRequestNodePutThenRequest(requestNode, result); 00160 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG); 00161 } 00162 00163 /* ReqQueApply */ 00164 for(bddIndex = 0; bddIndex < bddManager->numVars; bddIndex++){ 00165 bddId = bddManager->indexToId[bddIndex]; 00166 hashTable = reqQueForCompose[bddId]; 00167 if(hashTable->numEntries){ 00168 CalHashTableComposeApply(bddManager, hashTable, composeIndex, 00169 reqQueForCompose, reqQueForITE); 00170 } 00171 hashTable = reqQueForITE[bddId]; 00172 if(hashTable->numEntries){ 00173 CalHashTableITEApply(bddManager, hashTable, reqQueForITE); 00174 } 00175 } 00176 00177 /* ReqQueReduce */ 00178 for(bddIndex = bddManager->numVars - 1; bddIndex >= 0; bddIndex--){ 00179 bddId = bddManager->indexToId[bddIndex]; 00180 uniqueTableForId = bddManager->uniqueTable[bddId]; 00181 hashTable = reqQueForCompose[bddId]; 00182 if(hashTable->numEntries){ 00183 CalHashTableReduce(bddManager, hashTable, uniqueTableForId); 00184 } 00185 hashTable = reqQueForITE[bddId]; 00186 if(hashTable->numEntries){ 00187 CalHashTableReduce(bddManager, hashTable, uniqueTableForId); 00188 } 00189 } 00190 00191 /* ReqListArrayReqForward */ 00192 for(requestNode = requestNodeList; requestNode != Cal_Nil(CalRequestNode_t); 00193 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){ 00194 CalRequestNodeGetThenRequest(requestNode, result); 00195 CalRequestIsForwardedTo(result); 00196 CalRequestNodePutThenRequest(requestNode, result); 00197 } 00198 00199 /* ReqQueCleanUp */ 00200 for(bddId = 1; bddId <= bddManager->numVars; bddId++){ 00201 CalHashTableCleanUp(reqQueForCompose[bddId]); 00202 CalHashTableCleanUp(reqQueForITE[bddId]); 00203 } 00204 }