#include "espresso.h"
ABC_NAMESPACE_IMPL_START
bool full_row(p, cof)
IN register pcube p, cof;
{
register int i = LOOP(p);
do if ((p[i] | cof[i]) != cube.fullset[i]) return FALSE; while (--i > 0);
return TRUE;
}
bool cdist0(a, b)
register pcube a, b;
{
{
register int w, last; register unsigned int x;
if ((last = cube.inword) != -1) {
x = a[last] & b[last];
if (~(x | x >> 1) & cube.inmask)
return FALSE;
for(w = 1; w < last; w++) {
x = a[w] & b[w];
if (~(x | x >> 1) & DISJOINT)
return FALSE;
}
}
}
{
register int w, var, last; register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var]; last = cube.last_word[var];
for(w = cube.first_word[var]; w <= last; w++)
if (a[w] & b[w] & mask[w])
goto nextvar;
return FALSE;
nextvar: ;
}
}
return TRUE;
}
int cdist01(a, b)
register pset a, b;
{
int dist = 0;
{
register int w, last; register unsigned int x;
if ((last = cube.inword) != -1) {
x = a[last] & b[last];
if ((x = ~ (x | x >> 1) & cube.inmask))
if ((dist = count_ones(x)) > 1)
return 2;
for(w = 1; w < last; w++) {
x = a[w] & b[w];
if ((x = ~ (x | x >> 1) & DISJOINT))
if (dist == 1 || (dist += count_ones(x)) > 1)
return 2;
}
}
}
{
register int w, var, last; register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var]; last = cube.last_word[var];
for(w = cube.first_word[var]; w <= last; w++)
if (a[w] & b[w] & mask[w])
goto nextvar;
if (++dist > 1)
return 2;
nextvar: ;
}
}
return dist;
}
int cdist(a, b)
register pset a, b;
{
int dist = 0;
{
register int w, last; register unsigned int x;
if ((last = cube.inword) != -1) {
x = a[last] & b[last];
if ((x = ~ (x | x >> 1) & cube.inmask))
dist = count_ones(x);
for(w = 1; w < last; w++) {
x = a[w] & b[w];
if ((x = ~ (x | x >> 1) & DISJOINT))
dist += count_ones(x);
}
}
}
{
register int w, var, last; register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var]; last = cube.last_word[var];
for(w = cube.first_word[var]; w <= last; w++)
if (a[w] & b[w] & mask[w])
goto nextvar;
dist++;
nextvar: ;
}
}
return dist;
}
pset force_lower(xlower, a, b)
INOUT pset xlower;
IN register pset a, b;
{
{
register int w, last; register unsigned int x;
if ((last = cube.inword) != -1) {
x = a[last] & b[last];
if ((x = ~(x | x >> 1) & cube.inmask))
xlower[last] |= (x | (x << 1)) & a[last];
for(w = 1; w < last; w++) {
x = a[w] & b[w];
if ((x = ~(x | x >> 1) & DISJOINT))
xlower[w] |= (x | (x << 1)) & a[w];
}
}
}
{
register int w, var, last; register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var]; last = cube.last_word[var];
for(w = cube.first_word[var]; w <= last; w++)
if (a[w] & b[w] & mask[w])
goto nextvar;
for(w = cube.first_word[var]; w <= last; w++)
xlower[w] |= a[w] & mask[w];
nextvar: ;
}
}
return xlower;
}
void consensus(r, a, b)
INOUT pcube r;
IN register pcube a, b;
{
INLINEset_clear(r, cube.size);
{
register int w, last; register unsigned int x;
if ((last = cube.inword) != -1) {
r[last] = x = a[last] & b[last];
if ((x = ~(x | x >> 1) & cube.inmask))
r[last] |= (x | (x << 1)) & (a[last] | b[last]);
for(w = 1; w < last; w++) {
r[w] = x = a[w] & b[w];
if ((x = ~(x | x >> 1) & DISJOINT))
r[w] |= (x | (x << 1)) & (a[w] | b[w]);
}
}
}
{
bool empty; int var; unsigned int x;
register int w, last; register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var];
last = cube.last_word[var];
empty = TRUE;
for(w = cube.first_word[var]; w <= last; w++)
if ((x = a[w] & b[w] & mask[w]))
empty = FALSE, r[w] |= x;
if (empty)
for(w = cube.first_word[var]; w <= last; w++)
r[w] |= mask[w] & (a[w] | b[w]);
}
}
}
int cactive(a)
register pcube a;
{
int active = -1, dist = 0, bit_index();
{
register int w, last;
register unsigned int x;
if ((last = cube.inword) != -1) {
x = a[last];
if ((x = ~ (x & x >> 1) & cube.inmask)) {
if ((dist = count_ones(x)) > 1)
return -1;
active = (last-1)*(BPI/2) + bit_index(x) / 2;
}
for(w = 1; w < last; w++) {
x = a[w];
if ((x = ~ (x & x >> 1) & DISJOINT)) {
if ((dist += count_ones(x)) > 1)
return -1;
active = (w-1)*(BPI/2) + bit_index(x) / 2;
}
}
}
}
{
register int w, var, last;
register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var];
last = cube.last_word[var];
for(w = cube.first_word[var]; w <= last; w++)
if (mask[w] & ~ a[w]) {
if (++dist > 1)
return -1;
active = var;
break;
}
}
}
return active;
}
bool ccommon(a, b, cof)
register pcube a, b, cof;
{
{
int last;
register int w;
register unsigned int x, y;
if ((last = cube.inword) != -1) {
x = a[last] | cof[last];
y = b[last] | cof[last];
if (~(x & x>>1) & ~(y & y>>1) & cube.inmask)
return TRUE;
for(w = 1; w < last; w++) {
x = a[w] | cof[w];
y = b[w] | cof[w];
if (~(x & x>>1) & ~(y & y>>1) & DISJOINT)
return TRUE;
}
}
}
{
int var;
register int w, last;
register pcube mask;
for(var = cube.num_binary_vars; var < cube.num_vars; var++) {
mask = cube.var_mask[var]; last = cube.last_word[var];
for(w = cube.first_word[var]; w <= last; w++)
if (mask[w] & ~a[w] & ~cof[w]) {
for(w = cube.first_word[var]; w <= last; w++)
if (mask[w] & ~b[w] & ~cof[w])
return TRUE;
break;
}
}
}
return FALSE;
}
int descend(a, b)
pset *a, *b;
{
register pset a1 = *a, b1 = *b;
if (SIZE(a1) > SIZE(b1)) return -1;
else if (SIZE(a1) < SIZE(b1)) return 1;
else {
register int i = LOOP(a1);
do
if (a1[i] > b1[i]) return -1; else if (a1[i] < b1[i]) return 1;
while (--i > 0);
}
return 0;
}
int ascend(a, b)
pset *a, *b;
{
register pset a1 = *a, b1 = *b;
if (SIZE(a1) > SIZE(b1)) return 1;
else if (SIZE(a1) < SIZE(b1)) return -1;
else {
register int i = LOOP(a1);
do
if (a1[i] > b1[i]) return 1; else if (a1[i] < b1[i]) return -1;
while (--i > 0);
}
return 0;
}
int lex_order(a, b)
pset *a, *b;
{
register pset a1 = *a, b1 = *b;
register int i = LOOP(a1);
do
if (a1[i] > b1[i]) return -1; else if (a1[i] < b1[i]) return 1;
while (--i > 0);
return 0;
}
int d1_order(a, b)
pset *a, *b;
{
register pset a1 = *a, b1 = *b, c1 = cube.temp[0];
register int i = LOOP(a1);
register unsigned int x1, x2;
do
if ((x1 = a1[i] | c1[i]) > (x2 = b1[i] | c1[i])) return -1;
else if (x1 < x2) return 1;
while (--i > 0);
return 0;
}
int desc1(a, b)
register pset a, b;
{
if (a == (pset) NULL)
return (b == (pset) NULL) ? 0 : 1;
else if (b == (pset) NULL)
return -1;
if (SIZE(a) > SIZE(b)) return -1;
else if (SIZE(a) < SIZE(b)) return 1;
else {
register int i = LOOP(a);
do
if (a[i] > b[i]) return -1; else if (a[i] < b[i]) return 1;
while (--i > 0);
}
return 0;
}
ABC_NAMESPACE_IMPL_END