#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);
}
