/*
 * Revision Control Information
 *
 * $Source: /vol/opua/opua2/sis/sis-1.1/common/src/sis/node/RCS/cubehack.c,v $
 * $Author: sis $
 * $Revision: 1.2 $
 * $Date: 1992/05/06 18:57:41 $
 *
 */
/*
#include "sis.h"
#include "node_int.h"

#ifdef lint
struct cube_struct cube;
bool summary;
bool trace;
bool remove_essential;
bool force_irredundant;
bool unwrap_onset;
bool single_expand;
bool pos;
bool recompute_onset;
bool use_super_gasp;
bool use_random_order;
#endif
*/
#include "espresso.h"

ABC_NAMESPACE_IMPL_START



void 
cautious_define_cube_size(n)
int n;
{
    if (cube.fullset != 0 && cube.num_binary_vars == n)
    return;
    if (cube.fullset != 0) {
    setdown_cube();
    FREE(cube.part_size);
    }
    cube.num_binary_vars = cube.num_vars = n;
    cube.part_size = ALLOC(int, n);
    cube_setup();
}


void
define_cube_size(n)
int n;
{
    register int q, i;
    static int called_before = 0;

    /* check if the cube is already just the right size */
    if (cube.fullset != 0 && cube.num_binary_vars == n && cube.num_vars == n)
    return;

    /* We can't handle more than 100 inputs */
    if (n > 100) {
    cautious_define_cube_size(n);
    called_before = 0;
    return;
    }

    if (cube.fullset == 0 || ! called_before) {
    cautious_define_cube_size(100);
    called_before = 1;
    }

    cube.num_vars = n;
    cube.num_binary_vars = n;
    cube.num_mv_vars = 0;
    cube.output = -1;
    cube.size = n * 2;

    /* first_part, last_part, first_word, last_word, part_size OKAY */
    /* cube.sparse is OKAY */

    /* need to completely re-make cube.fullset and cube.binary_mask */
    (void) set_fill(cube.fullset, n*2);
    (void) set_fill(cube.binary_mask, n*2);

    /* need to resize each set in cube.var_mask and cube.temp */
    q = cube.fullset[0];
    for(i = 0; i < cube.num_vars; i++)
    cube.var_mask[i][0] = q;
    for(i = 0; i < CUBE_TEMP; i++)
    cube.temp[i][0] = q;

    /* need to resize cube.emptyset and cube.mv_mask */
    cube.emptyset[0] = q;
    cube.mv_mask[0] = q;

    /* need to reset the inword and inmask */
    if (cube.num_binary_vars != 0) {
    cube.inword = cube.last_word[cube.num_binary_vars - 1];
    cube.inmask = cube.binary_mask[cube.inword] & DISJOINT;
    } else {
    cube.inword = -1;
    cube.inmask = 0;
    }

    /* cdata (entire structure) is OKAY */
}


void
undefine_cube_size()
{
    if (cube.num_binary_vars > 100) {
    if (cube.fullset != 0) {
        setdown_cube();
        FREE(cube.part_size);
    }
    } else {
    cube.num_vars = cube.num_binary_vars = 100;
    if (cube.fullset != 0) {
        setdown_cube();
        FREE(cube.part_size);
    }
    }
}


void
set_espresso_flags()
{
    summary = FALSE;
    trace = FALSE;
    remove_essential = TRUE;
    force_irredundant = TRUE;
    unwrap_onset = TRUE;
    single_expand = FALSE;
    pos = FALSE;
    recompute_onset = FALSE;
    use_super_gasp = FALSE;
    use_random_order = FALSE;
}
ABC_NAMESPACE_IMPL_END