00001
00039 #include "calInt.h"
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00064
00065
00066
00067
00068
00071
00072
00073
00087 Cal_Bdd
00088 Cal_BddITE(Cal_BddManager bddManager, Cal_Bdd fUserBdd, Cal_Bdd gUserBdd,
00089 Cal_Bdd hUserBdd)
00090 {
00091 Cal_Bdd_t result;
00092 Cal_Bdd userResult;
00093 Cal_Bdd_t F, G, H;
00094 if (CalBddPreProcessing(bddManager, 3, fUserBdd, gUserBdd, hUserBdd)){
00095 F = CalBddGetInternalBdd(bddManager, fUserBdd);
00096 G = CalBddGetInternalBdd(bddManager, gUserBdd);
00097 H = CalBddGetInternalBdd(bddManager, hUserBdd);
00098 result = CalBddOpITEBF(bddManager, F, G, H);
00099 }
00100 else {
00101 return (Cal_Bdd) 0;
00102 }
00103 userResult = CalBddGetExternalBdd(bddManager, result);
00104 if (CalBddPostProcessing(bddManager) == CAL_BDD_OVERFLOWED){
00105 Cal_BddFree(bddManager, userResult);
00106 Cal_BddManagerGC(bddManager);
00107 return (Cal_Bdd) 0;
00108 }
00109 return userResult;
00110 }
00111
00112
00113
00114
00115
00116
00132 void
00133 CalRequestNodeListArrayITE(Cal_BddManager_t *bddManager,
00134 CalRequestNode_t **requestNodeListArray)
00135 {
00136 CalRequestNode_t *requestNode, *ptrIndirect;
00137 CalRequest_t F, G, H, result;
00138 int pipeDepth, bddId, bddIndex;
00139 CalHashTable_t **reqQueAtPipeDepth, *hashTable, *uniqueTableForId;
00140 CalHashTable_t ***reqQue = bddManager->reqQue;
00141
00142
00143 for(pipeDepth = 0; pipeDepth < bddManager->depth; pipeDepth++){
00144 reqQueAtPipeDepth = reqQue[pipeDepth];
00145 for(requestNode = requestNodeListArray[pipeDepth];
00146 requestNode != Cal_Nil(CalRequestNode_t);
00147 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){
00148 CalRequestNodeGetThenRequest(requestNode, F);
00149 CalRequestIsForwardedTo(F);
00150 ptrIndirect = CalRequestNodeGetElseRequestNode(requestNode);
00151 CalRequestNodeGetThenRequest(ptrIndirect, G);
00152 CalRequestIsForwardedTo(G);
00153 CalRequestNodeGetElseRequest(ptrIndirect, H);
00154 CalRequestIsForwardedTo(H);
00155 CalNodeManagerFreeNode(bddManager->nodeManagerArray[0], ptrIndirect);
00156 result = CalOpITE(bddManager, F, G, H, reqQueAtPipeDepth);
00157 CalRequestNodePutThenRequest(requestNode, result);
00158 CalRequestNodePutElseRequestNode(requestNode, FORWARD_FLAG);
00159 }
00160 }
00161
00162
00163 for(bddIndex = 0; bddIndex < bddManager->numVars; bddIndex++){
00164 bddId = bddManager->indexToId[bddIndex];
00165 for(pipeDepth = 0; pipeDepth < bddManager->depth; pipeDepth++){
00166 reqQueAtPipeDepth = reqQue[pipeDepth];
00167 hashTable = reqQueAtPipeDepth[bddId];
00168 if(hashTable->numEntries){
00169 CalHashTableITEApply(bddManager, hashTable, reqQueAtPipeDepth);
00170 }
00171 }
00172 }
00173
00174
00175 for(bddIndex = bddManager->numVars - 1; bddIndex >= 0; bddIndex--){
00176 bddId = bddManager->indexToId[bddIndex];
00177 uniqueTableForId = bddManager->uniqueTable[bddId];
00178 for(pipeDepth = 0; pipeDepth < bddManager->depth; pipeDepth++){
00179 hashTable = reqQue[pipeDepth][bddId];
00180 if(hashTable->numEntries){
00181 CalHashTableReduce(bddManager, hashTable, uniqueTableForId);
00182 }
00183 }
00184 }
00185
00186
00187 for(pipeDepth = 0; pipeDepth < bddManager->depth; pipeDepth++){
00188 for(requestNode = requestNodeListArray[pipeDepth];
00189 requestNode != Cal_Nil(CalRequestNode_t);
00190 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){
00191 CalRequestNodeGetThenRequest(requestNode, result);
00192 CalRequestIsForwardedTo(result);
00193 CalRequestNodePutThenRequest(requestNode, result);
00194 }
00195 }
00196
00197
00198 for(pipeDepth = 0; pipeDepth < bddManager->depth; pipeDepth++){
00199 reqQueAtPipeDepth = reqQue[pipeDepth];
00200 for(bddId = 1; bddId <= bddManager->numVars; bddId++){
00201 CalHashTableCleanUp(reqQueAtPipeDepth[bddId]);
00202 }
00203 }
00204 }
00205
00217 Cal_Bdd_t
00218 CalBddOpITEBF(
00219 Cal_BddManager_t *bddManager,
00220 Cal_Bdd_t f,
00221 Cal_Bdd_t g,
00222 Cal_Bdd_t h)
00223 {
00224 Cal_Bdd_t result;
00225 Cal_BddId_t bddId;
00226
00227 int minIndex;
00228 int bddIndex;
00229 CalHashTable_t *hashTable;
00230 CalHashTable_t *uniqueTableForId;
00231 CalHashTable_t **reqQueForITE = bddManager->reqQue[0];
00232
00233 result = CalOpITE(bddManager, f, g, h, reqQueForITE);
00234
00235 CalBddGetMinIndex3(bddManager, f, g, h, minIndex);
00236
00237 for(bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){
00238 bddId = bddManager->indexToId[bddIndex];
00239 hashTable = reqQueForITE[bddId];
00240 if(hashTable->numEntries){
00241 CalHashTableITEApply(bddManager, hashTable, reqQueForITE);
00242 }
00243 }
00244
00245
00246 for(bddIndex = bddManager->numVars - 1; bddIndex >= minIndex; bddIndex--){
00247 bddId = bddManager->indexToId[bddIndex];
00248 uniqueTableForId = bddManager->uniqueTable[bddId];
00249 hashTable = reqQueForITE[bddId];
00250 if(hashTable->numEntries){
00251 CalHashTableReduce(bddManager, hashTable, uniqueTableForId);
00252 }
00253 }
00254
00255 CalRequestIsForwardedTo(result);
00256
00257
00258 for(bddIndex = minIndex; bddIndex < bddManager->numVars; bddIndex++){
00259 bddId = bddManager->indexToId[bddIndex];
00260 CalHashTableCleanUp(reqQueForITE[bddId]);
00261 }
00262
00263 return result;
00264 }
00265
00277 void
00278 CalHashTableITEApply(
00279 Cal_BddManager_t *bddManager,
00280 CalHashTable_t *hashTable,
00281 CalHashTable_t **reqQueAtPipeDepth)
00282 {
00283 int i, numBins = hashTable->numBins;
00284 CalBddNode_t **bins = hashTable->bins;
00285 CalRequestNode_t *requestNode;
00286 Cal_Bdd_t fx, gx, fxbar, gxbar, hx, hxbar, result;
00287 CalNodeManager_t *nodeManager = hashTable->nodeManager;
00288
00289 for(i = 0; i < numBins; i++){
00290 for(requestNode = bins[i];
00291 requestNode != Cal_Nil(CalRequestNode_t);
00292 requestNode = CalRequestNodeGetNextRequestNode(requestNode)){
00293
00294 CalITERequestNodeGetCofactors(bddManager, requestNode,
00295 fx, fxbar, gx, gxbar, hx, hxbar);
00296 result = CalOpITE(bddManager, fx, gx, hx, reqQueAtPipeDepth);
00297 CalBddIcrRefCount(result);
00298 CalRequestNodePutThenRequest(requestNode, result);
00299 result = CalOpITE(bddManager, fxbar, gxbar, hxbar, reqQueAtPipeDepth);
00300 CalBddIcrRefCount(result);
00301 CalNodeManagerFreeNode(nodeManager,
00302 CalRequestNodeGetElseRequestNode(requestNode));
00303 CalRequestNodePutElseRequest(requestNode, result);
00304 }
00305 }
00306 }
00307
00321 Cal_Bdd_t
00322 CalBddITE(Cal_BddManager_t *bddManager, Cal_Bdd_t F, Cal_Bdd_t G,
00323 Cal_Bdd_t H)
00324 {
00325 Cal_Bdd_t result;
00326 result = CalBddOpITEBF(bddManager, F, G, H);
00327 CalBddIcrRefCount(result);
00328 return result;
00329 }
00330
00331
00332
00333