00001
00039 #include "calInt.h"
00040
00041
00042
00043
00044
00045 #if SIZEOF_LONG == 8
00046 #define BPL 64
00047 #define LOGBPL 6
00048 #else
00049 #define BPL 32
00050 #define LOGBPL 5
00051 #endif
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00075
00076
00077
00078
00079 static void ddSuppInteract(Cal_BddManager_t *bddManager, Cal_Bdd_t f, int *support);
00080 static void ddClearLocal(Cal_Bdd_t f);
00081 static void ddUpdateInteract(Cal_BddManager_t *bddManager, int *support);
00082
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00108 void
00109 CalSetInteract(Cal_BddManager_t *bddManager, int x, int y)
00110 {
00111 int posn, word, bit;
00112
00113 Cal_Assert(x < y);
00114 Cal_Assert(y < bddManager->numVars);
00115 Cal_Assert(x >= 0);
00116
00117 posn = ((((bddManager->numVars << 1) - x - 3) * x) >> 1) + y - 1;
00118 word = posn >> LOGBPL;
00119 bit = posn & (BPL-1);
00120 bddManager->interact[word] |= 1 << bit;
00121
00122 }
00123
00124
00138 int
00139 CalTestInteract(Cal_BddManager_t *bddManager, int x, int y)
00140 {
00141 int posn, word, bit, result;
00142
00143 x -= 1;
00144 y -= 1;
00145
00146 if (x > y) {
00147 int tmp = x;
00148 x = y;
00149 y = tmp;
00150 }
00151 Cal_Assert(x < y);
00152 Cal_Assert(y < bddManager->numVars);
00153 Cal_Assert(x >= 0);
00154
00155 posn = ((((bddManager->numVars << 1) - x - 3) * x) >> 1) + y - 1;
00156 word = posn >> LOGBPL;
00157 bit = posn & (BPL-1);
00158 result = (bddManager->interact[word] >> bit) & 1;
00159 return(result);
00160
00161 }
00162
00163
00180 int
00181 CalInitInteract(Cal_BddManager_t *bddManager)
00182 {
00183 int i,k;
00184 int words;
00185 long *interact;
00186 int *support;
00187 long numBins;
00188 CalBddNode_t **bins, *bddNode, *nextBddNode;
00189
00190 int n = bddManager->numVars;
00191
00192 words = ((n * (n-1)) >> (1 + LOGBPL)) + 1;
00193 bddManager->interact = interact = Cal_MemAlloc(long, words);
00194 if (interact == NULL) return(0);
00195 for (i = 0; i < words; i++) {
00196 interact[i] = 0;
00197 }
00198
00199 support = Cal_MemAlloc(int, n);
00200 if (support == Cal_Nil(int)) {
00201 Cal_MemFree(interact);
00202 return(0);
00203 }
00204 bins = bddManager->uniqueTable[0]->bins;
00205 numBins = bddManager->uniqueTable[0]->numBins;
00206 for (i=0; i<numBins; i++){
00207 for (bddNode = bins[i]; bddNode; bddNode = nextBddNode) {
00208 Cal_Bdd_t internalBdd;
00209 nextBddNode = CalBddNodeGetNextBddNode(bddNode);
00210 CalBddNodeGetThenBdd(bddNode, internalBdd);
00211 for (k = 0; k < n; k++) {
00212 support[k] = 0;
00213 }
00214 ddSuppInteract(bddManager, internalBdd, support);
00215 ddClearLocal(internalBdd);
00216 ddUpdateInteract(bddManager, support);
00217 }
00218 }
00219
00220
00221
00222 if (bddManager->pipelineState == CREATE){
00223 CalRequestNode_t **requestNodeListArray =
00224 bddManager->requestNodeListArray;
00225 Cal_Bdd_t resultBdd;
00226 for (i=0;
00227 i<bddManager->pipelineDepth-bddManager->currentPipelineDepth;
00228 i++){
00229 for (bddNode = *requestNodeListArray; bddNode;
00230 bddNode = nextBddNode){
00231 nextBddNode = CalBddNodeGetNextBddNode(bddNode);
00232 Cal_Assert(CalBddNodeIsForwarded(bddNode));
00233 CalBddNodeGetThenBdd(bddNode, resultBdd);
00234 Cal_Assert(CalBddIsForwarded(resultBdd) == 0);
00235 for (k = 0; k < n; k++) {
00236 support[k] = 0;
00237 }
00238 ddSuppInteract(bddManager, resultBdd, support);
00239 ddClearLocal(resultBdd);
00240 ddUpdateInteract(bddManager, support);
00241 }
00242 requestNodeListArray++;
00243 }
00244 }
00245
00246
00247 Cal_MemFree(support);
00248 return(1);
00249
00250 }
00251
00252
00253
00254
00255
00256
00257
00270 static void
00271 ddSuppInteract(Cal_BddManager_t *bddManager, Cal_Bdd_t f, int *support)
00272 {
00273 Cal_Bdd_t thenBdd, elseBdd;
00274
00275 if (CalBddIsBddConst(f) || CalBddIsMarked(f)){
00276 return;
00277 }
00278 support[f.bddId-1] = 1;
00279 CalBddGetThenBdd(f, thenBdd);
00280 CalBddGetElseBdd(f, elseBdd);
00281 ddSuppInteract(bddManager, thenBdd, support);
00282 ddSuppInteract(bddManager, elseBdd, support);
00283 CalBddMark(f);
00284 return;
00285 }
00286
00287
00299 static void
00300 ddClearLocal(Cal_Bdd_t f)
00301 {
00302 Cal_Bdd_t thenBdd;
00303 Cal_Bdd_t elseBdd;
00304 CalBddGetElseBdd(f, elseBdd);
00305 if (CalBddIsBddConst(f) || !CalBddIsMarked(f)){
00306 return;
00307 }
00308
00309 CalBddUnmark(f);
00310 CalBddGetThenBdd(f, thenBdd);
00311 CalBddGetElseBdd(f, elseBdd);
00312 ddClearLocal(thenBdd);
00313 ddClearLocal(elseBdd);
00314 return;
00315 }
00316
00317
00331 static void
00332 ddUpdateInteract(Cal_BddManager_t *bddManager, int *support)
00333 {
00334 int i,j;
00335 int n = bddManager->numVars;
00336
00337 for (i = 0; i < n-1; i++) {
00338 if (support[i] == 1) {
00339 for (j = i+1; j < n; j++) {
00340 if (support[j] == 1) {
00341 CalSetInteract(bddManager, i, j);
00342 }
00343 }
00344 }
00345 }
00346 }
00347
00348