00001
00002
00003
00004 #include "bddint.h"
00005 #if STDC_HEADERS
00006 #include <string.h>
00007 #endif
00008
00009 static char profile_width[]="XXXXXXXXX";
00010
00011
00012 static
00013 void
00014 chars(char c, int n, FILE *fp)
00015 {
00016 int i;
00017
00018 for (i=0; i < n; ++i)
00019 fputc(c, fp);
00020 }
00021
00022
00023
00024
00025
00026
00027
00028 void
00029 cmu_bdd_print_profile_aux(cmu_bdd_manager bddm,
00030 long *level_counts,
00031 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00032 pointer env,
00033 int line_length,
00034 FILE *fp)
00035 {
00036 long i, n;
00037 int l;
00038 char *name;
00039 int max_prefix_len;
00040 int max_profile_width;
00041 int histogram_column;
00042 int histogram_width;
00043 int profile_scale;
00044 long total;
00045
00046 n=bddm->vars;
00047
00048 max_prefix_len=5;
00049 max_profile_width=level_counts[n];
00050 total=level_counts[n];
00051 for (i=0; i < n; ++i)
00052 if (level_counts[i])
00053 {
00054 sprintf(profile_width, "%ld", level_counts[i]);
00055 l=strlen(bdd_var_name(bddm, bddm->variables[bddm->indexindexes[i]], var_naming_fn, env))+strlen(profile_width);
00056 if (l > max_prefix_len)
00057 max_prefix_len=l;
00058 if (level_counts[i] > max_profile_width)
00059 max_profile_width=level_counts[i];
00060 total+=level_counts[i];
00061 }
00062 histogram_column=max_prefix_len+3;
00063 histogram_width=line_length-histogram_column-1;
00064 if (histogram_width < 20)
00065 histogram_width=20;
00066 if (histogram_width >= max_profile_width)
00067 profile_scale=1;
00068 else
00069 profile_scale=(max_profile_width+histogram_width-1)/histogram_width;
00070 for (i=0; i < n; ++i)
00071 if (level_counts[i])
00072 {
00073 name=bdd_var_name(bddm, bddm->variables[bddm->indexindexes[i]], var_naming_fn, env);
00074 fputs(name, fp);
00075 fputc(':', fp);
00076 sprintf(profile_width, "%ld", level_counts[i]);
00077 chars(' ', (int)(max_prefix_len-strlen(name)-strlen(profile_width)+1), fp);
00078 fputs(profile_width, fp);
00079 fputc(' ', fp);
00080 chars('#', level_counts[i]/profile_scale, fp);
00081 fputc('\n', fp);
00082 }
00083 fputs("leaf:", fp);
00084 sprintf(profile_width, "%ld", level_counts[n]);
00085 chars(' ', (int)(max_prefix_len-4-strlen(profile_width)+1), fp);
00086 fputs(profile_width, fp);
00087 fputc(' ', fp);
00088 chars('#', level_counts[n]/profile_scale, fp);
00089 fputc('\n', fp);
00090 fprintf(fp, "Total: %ld\n", total);
00091 }
00092
00093
00094
00095
00096
00097
00098 void
00099 cmu_bdd_print_profile(cmu_bdd_manager bddm,
00100 bdd f,
00101 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00102 pointer env,
00103 int line_length,
00104 FILE *fp)
00105 {
00106 long *level_counts;
00107
00108 if (bdd_check_arguments(1, f))
00109 {
00110 level_counts=(long *)mem_get_block((SIZE_T)((bddm->vars+1)*sizeof(long)));
00111 cmu_bdd_profile(bddm, f, level_counts, 1);
00112 cmu_bdd_print_profile_aux(bddm, level_counts, var_naming_fn, env, line_length, fp);
00113 mem_free_block((pointer)level_counts);
00114 }
00115 else
00116 fputs("overflow\n", fp);
00117 }
00118
00119
00120
00121
00122
00123 void
00124 cmu_bdd_print_profile_multiple(cmu_bdd_manager bddm,
00125 bdd* fs,
00126 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00127 pointer env,
00128 int line_length,
00129 FILE *fp)
00130 {
00131 long *level_counts;
00132
00133 bdd_check_array(fs);
00134 level_counts=(long *)mem_get_block((SIZE_T)((bddm->vars+1)*sizeof(long)));
00135 cmu_bdd_profile_multiple(bddm, fs, level_counts, 1);
00136 cmu_bdd_print_profile_aux(bddm, level_counts, var_naming_fn, env, line_length, fp);
00137 mem_free_block((pointer)level_counts);
00138 }
00139
00140
00141
00142
00143
00144 void
00145 cmu_bdd_print_function_profile(cmu_bdd_manager bddm,
00146 bdd f,
00147 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00148 pointer env,
00149 int line_length,
00150 FILE *fp)
00151 {
00152 long *level_counts;
00153
00154 if (bdd_check_arguments(1, f))
00155 {
00156 level_counts=(long *)mem_get_block((SIZE_T)((bddm->vars+1)*sizeof(long)));
00157 cmu_bdd_function_profile(bddm, f, level_counts);
00158 cmu_bdd_print_profile_aux(bddm, level_counts, var_naming_fn, env, line_length, fp);
00159 mem_free_block((pointer)level_counts);
00160 }
00161 else
00162 fputs("overflow\n", fp);
00163 }
00164
00165
00166
00167
00168
00169 void
00170 cmu_bdd_print_function_profile_multiple(cmu_bdd_manager bddm,
00171 bdd* fs,
00172 char *(*var_naming_fn)(cmu_bdd_manager, bdd, pointer),
00173 pointer env,
00174 int line_length,
00175 FILE *fp)
00176 {
00177 long *level_counts;
00178
00179 bdd_check_array(fs);
00180 level_counts=(long *)mem_get_block((SIZE_T)((bddm->vars+1)*sizeof(long)));
00181 cmu_bdd_function_profile_multiple(bddm, fs, level_counts);
00182 cmu_bdd_print_profile_aux(bddm, level_counts, var_naming_fn, env, line_length, fp);
00183 mem_free_block((pointer)level_counts);
00184 }