blob: 93ca9110e97afaa8f69e5e9aa5a478970ab996a2 [file] [log] [blame]
/*
Module: cubestr.c -- routines for managing the global cube structure
*/
#include "espresso.h"
/*
cube_setup -- assume that the fields "num_vars", "num_binary_vars", and
part_size[num_binary_vars .. num_vars-1] are setup, and initialize the
rest of cube and cdata.
If a part_size is < 0, then the field size is abs(part_size) and the
field read from the input is symbolic.
*/
void cube_setup()
{
register int i, var;
register pcube p;
if (cube.num_binary_vars < 0 || cube.num_vars < cube.num_binary_vars)
fatal("cube size is silly, error in .i/.o or .mv");
cube.num_mv_vars = cube.num_vars - cube.num_binary_vars;
cube.output = cube.num_mv_vars > 0 ? cube.num_vars - 1 : -1;
cube.size = 0;
cube.first_part = ALLOC(int, cube.num_vars);
cube.last_part = ALLOC(int, cube.num_vars);
cube.first_word = ALLOC(int, cube.num_vars);
cube.last_word = ALLOC(int, cube.num_vars);
for(var = 0; var < cube.num_vars; var++) {
if (var < cube.num_binary_vars)
cube.part_size[var] = 2;
cube.first_part[var] = cube.size;
cube.first_word[var] = WHICH_WORD(cube.size);
cube.size += ABS(cube.part_size[var]);
cube.last_part[var] = cube.size - 1;
cube.last_word[var] = WHICH_WORD(cube.size - 1);
}
cube.var_mask = ALLOC(pset, cube.num_vars);
cube.sparse = ALLOC(int, cube.num_vars);
cube.binary_mask = new_cube();
cube.mv_mask = new_cube();
for(var = 0; var < cube.num_vars; var++) {
p = cube.var_mask[var] = new_cube();
for(i = cube.first_part[var]; i <= cube.last_part[var]; i++)
set_insert(p, i);
if (var < cube.num_binary_vars) {
INLINEset_or(cube.binary_mask, cube.binary_mask, p);
cube.sparse[var] = 0;
} else {
INLINEset_or(cube.mv_mask, cube.mv_mask, p);
cube.sparse[var] = 1;
}
}
if (cube.num_binary_vars == 0)
cube.inword = -1;
else {
cube.inword = cube.last_word[cube.num_binary_vars - 1];
cube.inmask = cube.binary_mask[cube.inword] & DISJOINT;
}
cube.temp = ALLOC(pset, CUBE_TEMP);
for(i = 0; i < CUBE_TEMP; i++)
cube.temp[i] = new_cube();
cube.fullset = set_fill(new_cube(), cube.size);
cube.emptyset = new_cube();
cdata.part_zeros = ALLOC(int, cube.size);
cdata.var_zeros = ALLOC(int, cube.num_vars);
cdata.parts_active = ALLOC(int, cube.num_vars);
cdata.is_unate = ALLOC(int, cube.num_vars);
}
/*
setdown_cube -- free memory allocated for the cube/cdata structs
(free's all but the part_size array)
(I wanted to call this cube_setdown, but that violates the 8-character
external routine limit on the IBM !)
*/
void setdown_cube()
{
register int i, var;
FREE(cube.first_part);
FREE(cube.last_part);
FREE(cube.first_word);
FREE(cube.last_word);
FREE(cube.sparse);
free_cube(cube.binary_mask);
free_cube(cube.mv_mask);
free_cube(cube.fullset);
free_cube(cube.emptyset);
for(var = 0; var < cube.num_vars; var++)
free_cube(cube.var_mask[var]);
FREE(cube.var_mask);
for(i = 0; i < CUBE_TEMP; i++)
free_cube(cube.temp[i]);
FREE(cube.temp);
FREE(cdata.part_zeros);
FREE(cdata.var_zeros);
FREE(cdata.parts_active);
FREE(cdata.is_unate);
cube.first_part = cube.last_part = (int *) NULL;
cube.first_word = cube.last_word = (int *) NULL;
cube.sparse = (int *) NULL;
cube.binary_mask = cube.mv_mask = (pcube) NULL;
cube.fullset = cube.emptyset = (pcube) NULL;
cube.var_mask = cube.temp = (pcube *) NULL;
cdata.part_zeros = cdata.var_zeros = cdata.parts_active = (int *) NULL;
cdata.is_unate = (bool *) NULL;
}
void save_cube_struct()
{
temp_cube_save = cube; /* structure copy ! */
temp_cdata_save = cdata; /* "" */
cube.first_part = cube.last_part = (int *) NULL;
cube.first_word = cube.last_word = (int *) NULL;
cube.part_size = (int *) NULL;
cube.binary_mask = cube.mv_mask = (pcube) NULL;
cube.fullset = cube.emptyset = (pcube) NULL;
cube.var_mask = cube.temp = (pcube *) NULL;
cdata.part_zeros = cdata.var_zeros = cdata.parts_active = (int *) NULL;
cdata.is_unate = (bool *) NULL;
}
void restore_cube_struct()
{
cube = temp_cube_save; /* structure copy ! */
cdata = temp_cdata_save; /* "" */
}