00001
00041 #include "calInt.h"
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 static CalAddress_t asDoubleSpace[2];
00060
00061
00062
00063
00064
00065 #define CalBddReorderBddIsForwarded(bdd) \
00066 (CAL_BDD_POINTER(CalBddGetElseBddNode(bdd)) == FORWARD_FLAG)
00067
00068 #define CalBddReorderBddNodeIsForwarded(bddNode) \
00069 (CAL_BDD_POINTER(CalBddNodeGetElseBddNode(bddNode)) == FORWARD_FLAG)
00070
00071 #define CalBddReorderForward(bdd) \
00072 { \
00073 CalBddNode_t *_bddNode, *_bddNodeTagged; \
00074 _bddNodeTagged = CalBddGetBddNode(bdd); \
00075 _bddNode = CAL_BDD_POINTER(_bddNodeTagged); \
00076 (bdd).bddId = _bddNode->thenBddId; \
00077 (bdd).bddNode = (CalBddNode_t*) \
00078 (((CalAddress_t)(_bddNode->thenBddNode) & ~0xe) \
00079 ^(CAL_TAG0(_bddNodeTagged))); \
00080 }
00081
00084
00085
00086
00087
00088 static double cpuTime();
00089 static long elapsedTime();
00090
00093
00094
00095
00096
00097
00098
00099
00100
00101
00113 int
00114 main(int argc, char **argv)
00115 {
00116 Cal_Bdd expected;
00117 Cal_Bdd a[100];
00118 Cal_Bdd temp1;
00119 Cal_Bdd temp2;
00120 Cal_Bdd b, c, d, e, f, g, result;
00121 Cal_BddManager_t *bddManager;
00122 CalBddNode_t *bddNode;
00123 int i;
00124 int numVars;
00125 int siftFlag = 0;
00126
00127 if (argc == 1) {
00128 numVars = 5;
00129 } else if (argc >= 2) {
00130 numVars = atoi(argv[1]);
00131 }
00132 if (argc == 3) {
00133 siftFlag = 1;
00134 }
00135
00136 bddManager = Cal_BddManagerInit();
00137
00138 for (i = 0; i < 2 * numVars; i++) {
00139 a[i] = Cal_BddManagerCreateNewVarLast(bddManager);
00140 }
00141
00142 result = Cal_BddZero(bddManager);
00143 for (i = 0; i < numVars; i++) {
00144 temp1 = Cal_BddAnd(bddManager, a[i], a[numVars + i]);
00145 temp2 = Cal_BddOr(bddManager, result, temp1);
00146 Cal_BddFree(bddManager, temp1);
00147 Cal_BddFree(bddManager, result);
00148 result = temp2;
00149 }
00150 Cal_BddManagerGC(bddManager);
00151 Cal_BddStats(bddManager, stdout);
00152 cpuTime();
00153 elapsedTime();
00154 printf("%%%%%%%%%%%% Reordering %%%%%%%%%%%%%%%%%%%\n");
00155 if (siftFlag){
00156 printf("Using Sift Technique\n");
00157 Cal_BddDynamicReordering(bddManager, CAL_REORDER_SIFT);
00158 }
00159 else{
00160 printf("Using Window Technique\n");
00161 Cal_BddDynamicReordering(bddManager, CAL_REORDER_WINDOW);
00162 }
00163 Cal_BddReorder(bddManager);
00164 printf("CPU time: %-8.2f\t Elapsed Time = %-10ld\n", cpuTime(), elapsedTime());
00165 printf("%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%\n");
00166 Cal_BddManagerGC(bddManager);
00167 Cal_BddStats(bddManager, stdout);
00168
00169 temp1 = Cal_BddZero(bddManager);
00170 for (i = 0; i < numVars; i++) {
00171 temp2 = Cal_BddAnd(bddManager, a[i], a[numVars + i]);
00172 expected = Cal_BddOr(bddManager, temp1, temp2);
00173 Cal_BddFree(bddManager, temp1);
00174 Cal_BddFree(bddManager, temp2);
00175 temp1 = expected;
00176 }
00177
00178 if (!Cal_BddIsEqual(bddManager, result, expected)) {
00179 printf("ERROR: BDDs are not equal\n");
00180 Cal_BddFunctionPrint(bddManager, result, "Result");
00181 Cal_BddFunctionPrint(bddManager, expected, "Expected");
00182 }
00183 printf("\n%%%%%%BDDs are equal\n");
00184 Cal_BddFree(bddManager, result);
00185 Cal_BddFree(bddManager, expected);
00186 Cal_BddManagerGC(bddManager);
00187 Cal_BddStats(bddManager, stdout);
00188 Cal_BddManagerQuit(bddManager);
00189 }
00190
00191
00203 static double
00204 cpuTime()
00205 {
00206 static double timeNew, timeOld;
00207 struct rusage rusage;
00208 static flag = 0;
00209
00210 getrusage(RUSAGE_SELF, &rusage);
00211 if (flag == 0){
00212 timeOld = timeNew = rusage.ru_utime.tv_sec+
00213 ((double)rusage.ru_utime.tv_usec)/1000000;
00214 flag = 1;
00215 }
00216 else {
00217 timeOld = timeNew;
00218 timeNew = rusage.ru_utime.tv_sec+
00219 ((float)rusage.ru_utime.tv_usec)/1000000;
00220 }
00221 return timeNew - timeOld;
00222 }
00223
00235 static long
00236 elapsedTime()
00237 {
00238 static long time_new, time_old;
00239 struct timeval t;
00240 struct timezone tz;
00241 static flag = 0;
00242
00243 gettimeofday(&t, &tz);
00244 if (flag == 0){
00245 time_old = time_new = t.tv_sec;
00246 flag = 1;
00247 }
00248 else {
00249 time_old = time_new;
00250 time_new = t.tv_sec;
00251 }
00252 return time_new-time_old;
00253 }