00001
00041 #include "calInt.h"
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 static char profileWidth[] = "XXXXXXXXX";
00060
00061
00062
00063
00064
00065
00068
00069
00070
00071
00072 static void CalBddPrintProfileAux(Cal_BddManager_t * bddManager, long * levelCounts, Cal_VarNamingFn_t varNamingProc, char * env, int lineLength, FILE * fp);
00073 static void chars(char c, int n, FILE * fp);
00074
00077
00078
00079
00080
00094 void
00095 Cal_BddPrintProfile(Cal_BddManager bddManager,
00096 Cal_Bdd fUserBdd,
00097 Cal_VarNamingFn_t varNamingProc,
00098 char * env,
00099 int lineLength,
00100 FILE * fp)
00101 {
00102 long *levelCounts;
00103
00104 if (CalBddPreProcessing(bddManager, 1, fUserBdd) == 0){
00105 return;
00106 }
00107 levelCounts = Cal_MemAlloc(long, bddManager->numVars+1);
00108 Cal_BddProfile(bddManager, fUserBdd, levelCounts, 1);
00109 CalBddPrintProfileAux(bddManager, levelCounts, varNamingProc, env,
00110 lineLength, fp);
00111 Cal_MemFree(levelCounts);
00112 }
00113
00126 void
00127 Cal_BddPrintProfileMultiple(
00128 Cal_BddManager bddManager,
00129 Cal_Bdd *userBdds,
00130 Cal_VarNamingFn_t varNamingProc,
00131 char * env,
00132 int lineLength,
00133 FILE * fp)
00134 {
00135 long *levelCounts;
00136
00137 if (CalBddArrayPreProcessing(bddManager, userBdds) == 0){
00138 return;
00139 }
00140 levelCounts = Cal_MemAlloc(long, bddManager->numVars+1);
00141 Cal_BddProfileMultiple(bddManager, userBdds, levelCounts, 1);
00142 CalBddPrintProfileAux(bddManager, levelCounts, varNamingProc, env, lineLength, fp);
00143 Cal_MemFree(levelCounts);
00144 }
00145
00146
00147
00160 void
00161 Cal_BddPrintFunctionProfile(Cal_BddManager bddManager,
00162 Cal_Bdd f,
00163 Cal_VarNamingFn_t varNamingProc,
00164 char * env,
00165 int lineLength,
00166 FILE * fp)
00167 {
00168 long *levelCounts;
00169 if (CalBddPreProcessing(bddManager, 1, f)){
00170 return;
00171 }
00172 levelCounts = Cal_MemAlloc(long, bddManager->numVars+1);
00173 Cal_BddFunctionProfile(bddManager, f, levelCounts);
00174 CalBddPrintProfileAux(bddManager, levelCounts, varNamingProc, env,
00175 lineLength, fp);
00176 Cal_MemFree(levelCounts);
00177 }
00178
00179
00192 void
00193 Cal_BddPrintFunctionProfileMultiple(Cal_BddManager bddManager,
00194 Cal_Bdd *userBdds,
00195 Cal_VarNamingFn_t varNamingProc,
00196 char * env,
00197 int lineLength,
00198 FILE * fp)
00199 {
00200 long *levelCounts;
00201 if (CalBddArrayPreProcessing(bddManager, userBdds) == 0){
00202 return;
00203 }
00204 levelCounts = Cal_MemAlloc(long, bddManager->numVars+1);
00205 Cal_BddFunctionProfileMultiple(bddManager, userBdds, levelCounts);
00206 CalBddPrintProfileAux(bddManager, levelCounts, varNamingProc, env, lineLength, fp);
00207 Cal_MemFree(levelCounts);
00208 }
00209
00210
00211
00212
00226 static void
00227 CalBddPrintProfileAux(
00228 Cal_BddManager_t * bddManager,
00229 long * levelCounts,
00230 Cal_VarNamingFn_t varNamingProc,
00231 char * env,
00232 int lineLength,
00233 FILE * fp)
00234 {
00235 long i, n;
00236 int l;
00237 char *name;
00238 int maxPrefixLen;
00239 int maxProfileWidth;
00240 int histogramColumn;
00241 int histogramWidth;
00242 int profileScale;
00243 long total;
00244
00245 n = bddManager->numVars;
00246
00247 maxPrefixLen = 5;
00248 maxProfileWidth = levelCounts[n];
00249 total = levelCounts[n];
00250 for(i = 0; i < n; i++){
00251 if(levelCounts[i]){
00252 sprintf(profileWidth, "%ld", levelCounts[i]);
00253 l = strlen(CalBddVarName(bddManager,
00254 bddManager->varBdds[bddManager->indexToId[i]],
00255 varNamingProc, env)) + strlen((char *)profileWidth);
00256 if(l > maxPrefixLen){
00257 maxPrefixLen = l;
00258 }
00259 if(levelCounts[i] > maxProfileWidth){
00260 maxProfileWidth = levelCounts[i];
00261 }
00262 total += levelCounts[i];
00263 }
00264 }
00265 histogramColumn = maxPrefixLen+3;
00266 histogramWidth = lineLength-histogramColumn-1;
00267 if(histogramWidth < 20)
00268 histogramWidth = 20;
00269 if(histogramWidth >= maxProfileWidth){
00270 profileScale = 1;
00271 }
00272 else{
00273 profileScale = (maxProfileWidth+histogramWidth-1)/histogramWidth;
00274 }
00275 for(i = 0; i < n; ++i){
00276 if(levelCounts[i]){
00277 name = CalBddVarName(bddManager,
00278 bddManager->varBdds[bddManager->indexToId[i]],
00279 varNamingProc, env);
00280 fputs(name, fp);
00281 fputc(':', fp);
00282 sprintf(profileWidth, "%ld", levelCounts[i]);
00283 chars(' ', (int)(maxPrefixLen-strlen(name)-strlen(profileWidth)+1), fp);
00284 fputs(profileWidth, fp);
00285 fputc(' ', fp);
00286 chars('#', levelCounts[i]/profileScale, fp);
00287 fputc('\n', fp);
00288 }
00289 }
00290 fputs("leaf:", fp);
00291 sprintf(profileWidth, "%ld", levelCounts[n]);
00292 chars(' ', (int)(maxPrefixLen-4-strlen(profileWidth)+1), fp);
00293 fputs(profileWidth, fp);
00294 fputc(' ', fp);
00295 chars('#', levelCounts[n]/profileScale, fp);
00296 fputc('\n', fp);
00297 fprintf(fp, "Total: %ld\n", total);
00298 }
00299
00311 static void
00312 chars(
00313 char c,
00314 int n,
00315 FILE * fp)
00316 {
00317 int i;
00318
00319 for(i = 0; i < n; ++i){
00320 fputc(c, fp);
00321 }
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334