#include "espresso.h"
ABC_NAMESPACE_IMPL_START
static pcover reduce_gasp(F, D)
pcover F, D;
{
pcube p, last, cunder, *FD;
pcover G;
G = new_cover(F->count);
FD = cube2list(F, D);
foreach_set(F, last, p) {
cunder = reduce_cube(FD, p);
if (setp_empty(cunder)) {
fatal("empty reduction in reduce_gasp, shouldn't happen");
} else if (setp_equal(cunder, p)) {
SET(cunder, PRIME);
G = sf_addset(G, p);
} else {
RESET(cunder, PRIME);
G = sf_addset(G, cunder);
}
if (debug & GASP) {
printf("REDUCE_GASP: %s reduced to %s\n", pc1(p), pc2(cunder));
}
free_cube(cunder);
}
free_cubelist(FD);
return G;
}
pcover expand_gasp(F, D, R, Foriginal)
INOUT pcover F;
IN pcover D;
IN pcover R;
IN pcover Foriginal;
{
int c1index;
pcover G;
G = new_cover(10);
for(c1index = 0; c1index < F->count; c1index++) {
expand1_gasp(F, D, R, Foriginal, c1index, &G);
}
G = sf_dupl(G);
G = expand(G, R, FALSE);
return G;
}
void expand1_gasp(F, D, R, Foriginal, c1index, G)
pcover F;
pcover D;
pcover R;
pcover Foriginal;
int c1index;
pcover *G;
{
register int c2index;
register pcube p, last, c2under;
pcube RAISE, FREESET, temp, *FD, c2essential;
pcover F1;
if (debug & EXPAND1) {
printf("\nEXPAND1_GASP: \t%s\n", pc1(GETSET(F, c1index)));
}
RAISE = new_cube();
FREESET = new_cube();
temp = new_cube();
R->active_count = R->count;
foreach_set(R, last, p) {
SET(p, ACTIVE);
}
F->active_count = F->count;
foreachi_set(F, c2index, c2under) {
if (c1index == c2index || TESTP(c2under, PRIME)) {
F->active_count--;
RESET(c2under, ACTIVE);
} else {
SET(c2under, ACTIVE);
}
}
(void) set_copy(RAISE, GETSET(F, c1index));
(void) set_diff(FREESET, cube.fullset, RAISE);
essen_parts(R, F, RAISE, FREESET);
essen_raising(R, RAISE, FREESET);
foreachi_set(F, c2index, c2under) {
if (TESTP(c2under, ACTIVE)) {
if (setp_implies(c2under, RAISE) ||
feasibly_covered(R, c2under, RAISE, temp)) {
F1 = sf_save(Foriginal);
(void) set_copy(GETSET(F1, c1index), GETSET(F, c1index));
FD = cube2list(F1, D);
c2essential = reduce_cube(FD, GETSET(F1, c2index));
free_cubelist(FD);
sf_free(F1);
if (feasibly_covered(R, c2essential, RAISE, temp)) {
(void) set_or(temp, RAISE, c2essential);
RESET(temp, PRIME);
*G = sf_addset(*G, temp);
}
set_free(c2essential);
}
}
}
free_cube(RAISE);
free_cube(FREESET);
free_cube(temp);
}
pcover irred_gasp(F, D, G)
pcover F, D, G;
{
if (G->count != 0)
F = irredundant(sf_append(F, G), D);
else
free_cover(G);
return F;
}
pcover last_gasp(F, D, R, cost)
pcover F, D, R;
cost_t *cost;
{
pcover G, G1;
EXECUTE(G = reduce_gasp(F, D), GREDUCE_TIME, G, *cost);
EXECUTE(G1 = expand_gasp(G, D, R, F), GEXPAND_TIME, G1, *cost);
free_cover(G);
EXECUTE(F = irred_gasp(F, D, G1), GIRRED_TIME, F, *cost);
return F;
}
pcover super_gasp(F, D, R, cost)
pcover F, D, R;
cost_t *cost;
{
pcover G, G1;
EXECUTE(G = reduce_gasp(F, D), GREDUCE_TIME, G, *cost);
EXECUTE(G1 = all_primes(G, R), GEXPAND_TIME, G1, *cost);
free_cover(G);
EXEC(G = sf_dupl(sf_append(F, G1)), "NEWPRIMES", G);
EXECUTE(F = irredundant(G, D), IRRED_TIME, F, *cost);
return F;
}
ABC_NAMESPACE_IMPL_END