00001
00040 #include "calInt.h"
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 static Cal_Bdd_t * CalBddSupportStep(Cal_BddManager_t * bddManager, Cal_Bdd_t f, Cal_Bdd_t * support);
00069 static void CalBddUnmarkNodes(Cal_BddManager_t * bddManager, Cal_Bdd_t f);
00070 static int CalBddDependsOnStep(Cal_BddManager_t * bddManager, Cal_Bdd_t f, Cal_BddIndex_t varIndex, int mark);
00071
00074
00075
00076
00077
00091 void
00092 Cal_BddSupport(Cal_BddManager bddManager, Cal_Bdd fUserBdd,
00093 Cal_Bdd *support)
00094 {
00095 if(CalBddPreProcessing(bddManager, 1, fUserBdd)){
00096 Cal_Bdd_t f = CalBddGetInternalBdd(bddManager, fUserBdd);
00097 Cal_Bdd_t *internalSupport = Cal_MemAlloc(Cal_Bdd_t, bddManager->numVars+1);
00098 Cal_Bdd_t *end;
00099 int i = 0;
00100 end = CalBddSupportStep(bddManager, f, internalSupport);
00101 *end = CalBddNull(bddManager);
00102 CalBddUnmarkNodes(bddManager, f);
00103 while (CalBddIsBddNull(bddManager, internalSupport[i]) == 0){
00104 *support = CalBddGetExternalBdd(bddManager, internalSupport[i]);
00105 support++;
00106 i++;
00107 }
00108 Cal_MemFree(internalSupport);
00109 }
00110 *support = (Cal_Bdd) 0;
00111 }
00112
00124 int
00125 Cal_BddDependsOn(Cal_BddManager bddManager, Cal_Bdd fUserBdd,
00126 Cal_Bdd varUserBdd)
00127 {
00128 Cal_BddIndex_t bddIndex;
00129 Cal_Bdd_t f, var;
00130
00131 if(CalBddPreProcessing(bddManager, 2, fUserBdd, varUserBdd)){
00132 f = CalBddGetInternalBdd(bddManager, fUserBdd);
00133 var = CalBddGetInternalBdd(bddManager, varUserBdd);
00134 if(CalBddIsBddConst(var)){
00135 return 1;
00136 }
00137 bddIndex = CalBddGetBddIndex(bddManager, var);
00138 CalBddDependsOnStep(bddManager, f, bddIndex, 1);
00139 return CalBddDependsOnStep(bddManager, f, bddIndex, 0);
00140 }
00141 return (0);
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00166 static Cal_Bdd_t *
00167 CalBddSupportStep(
00168 Cal_BddManager_t * bddManager,
00169 Cal_Bdd_t f,
00170 Cal_Bdd_t * support)
00171 {
00172 Cal_Bdd_t tempBdd;
00173
00174 if(CalBddIsMarked(f) || CalBddIsBddConst(f)){
00175 return support;
00176 }
00177 tempBdd = bddManager->varBdds[CalBddGetBddId(f)];
00178 if(!CalBddIsMarked(tempBdd)){
00179 CalBddMark(tempBdd);
00180 *support = tempBdd;
00181 ++support;
00182 }
00183 CalBddMark(f);
00184 CalBddGetThenBdd(f, tempBdd);
00185 support = CalBddSupportStep(bddManager, tempBdd, support);
00186 CalBddGetElseBdd(f, tempBdd);
00187 return CalBddSupportStep(bddManager, tempBdd, support);
00188 }
00189
00190
00204 static void
00205 CalBddUnmarkNodes(
00206 Cal_BddManager_t * bddManager,
00207 Cal_Bdd_t f)
00208 {
00209 Cal_Bdd_t tempBdd;
00210
00211 if(!CalBddIsMarked(f) || CalBddIsBddConst(f)){
00212 return;
00213 }
00214 CalBddUnmark(f);
00215 tempBdd = bddManager->varBdds[CalBddGetBddId(f)];
00216 CalBddUnmark(tempBdd);
00217 CalBddGetThenBdd(f, tempBdd);
00218 CalBddUnmarkNodes(bddManager, tempBdd);
00219 CalBddGetElseBdd(f, tempBdd);
00220 CalBddUnmarkNodes(bddManager, tempBdd);
00221 }
00222
00223
00236 static int
00237 CalBddDependsOnStep(
00238 Cal_BddManager_t * bddManager,
00239 Cal_Bdd_t f,
00240 Cal_BddIndex_t varIndex,
00241 int mark)
00242 {
00243 Cal_BddIndex_t fIndex;
00244 Cal_Bdd_t tempBdd;
00245
00246 fIndex=CalBddGetBddIndex(bddManager, f);
00247 if(fIndex > varIndex){
00248 return 0;
00249 }
00250 if(fIndex == varIndex){
00251 return 1;
00252 }
00253 if((mark && CalBddIsMarked(f)) || (!mark && !CalBddIsMarked(f))){
00254 return (0);
00255 }
00256 if(mark){
00257 CalBddMark(f);
00258 }
00259 else{
00260 CalBddUnmark(f);
00261 }
00262 CalBddGetThenBdd(f, tempBdd);
00263 if(CalBddDependsOnStep(bddManager, tempBdd, varIndex, mark)){
00264 return 1;
00265 }
00266 CalBddGetElseBdd(f, tempBdd);
00267 return CalBddDependsOnStep(bddManager, tempBdd, varIndex, mark);
00268 }
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279