blob: 7150930badbd5b1f73bb887f7ac4c54513969cf5 [file] [log] [blame]
#include "espresso.h"
/* cost -- compute the cost of a cover */
void cover_cost(F, cost)
IN pcover F;
INOUT pcost cost;
{
register pcube p, last;
pcube *T;
int var;
/* use the routine used by cofactor to decide splitting variables */
massive_count(T = cube1list(F));
free_cubelist(T);
cost->cubes = F->count;
cost->total = cost->in = cost->out = cost->mv = cost->primes = 0;
/* Count transistors (zeros) for each binary variable (inputs) */
for(var = 0; var < cube.num_binary_vars; var++)
cost->in += cdata.var_zeros[var];
/* Count transistors for each mv variable based on sparse/dense */
for(var = cube.num_binary_vars; var < cube.num_vars - 1; var++)
if (cube.sparse[var])
cost->mv += F->count * cube.part_size[var] - cdata.var_zeros[var];
else
cost->mv += cdata.var_zeros[var];
/* Count the transistors (ones) for the output variable */
if (cube.num_binary_vars != cube.num_vars) {
var = cube.num_vars - 1;
cost->out = F->count * cube.part_size[var] - cdata.var_zeros[var];
}
/* Count the number of nonprime cubes */
foreach_set(F, last, p)
cost->primes += TESTP(p, PRIME) != 0;
/* Count the total number of literals */
cost->total = cost->in + cost->out + cost->mv;
}
/* fmt_cost -- return a string which reports the "cost" of a cover */
char *fmt_cost(cost)
IN pcost cost;
{
static char s[200];
if (cube.num_binary_vars == cube.num_vars - 1)
(void) sprintf(s, "c=%d in=%d out=%d tot=%d",
cost->cubes, cost->in,
cost->out, cost->total);
else
(void) sprintf(s, "c=%d in=%d mv=%d out=%d",
cost->cubes, cost->in,
cost->mv, cost->out);
return s;
}
char *print_cost(F)
IN pcover F;
{
cost_t cost;
cover_cost(F, &cost);
return fmt_cost(&cost);
}
/* copy_cost -- copy a cost function from s to d */
void copy_cost(s, d)
pcost s, d;
{
d->cubes = s->cubes;
d->in = s->in;
d->out = s->out;
d->mv = s->mv;
d->total = s->total;
d->primes = s->primes;
}
/* size_stamp -- print single line giving the size of a cover */
void size_stamp(T, name)
IN pcover T;
IN char *name;
{
printf("# %s\tCost is %s\n", name, print_cost(T));
(void) fflush(stdout);
}
/* print_trace -- print a line reporting size and time after a function */
void print_trace(T, name, time)
pcover T;
char *name;
long time;
{
printf("# %s\tTime was %s, cost is %s\n",
name, print_time(time), print_cost(T));
(void) fflush(stdout);
}
/* totals -- add time spent in the function into the totals */
void totals(time, i, T, cost)
long time;
int i;
pcover T;
pcost cost;
{
time = ptime() - time;
total_time[i] += time;
total_calls[i]++;
cover_cost(T, cost);
if (trace) {
printf("# %s\tTime was %s, cost is %s\n",
total_name[i], print_time(time), fmt_cost(cost));
(void) fflush(stdout);
}
}
/* fatal -- report fatal error message and take a dive */
void fatal(s)
char *s;
{
fprintf(stderr, "espresso: %s\n", s);
exit(1);
}