Ejemplo n.º 1
0
pcover espresso(pset_family F, pset_family D1, pset_family R)
{
    pcover E, D, Fsave;
    pset last, p;
    cost_t cost, best_cost;

begin:
    Fsave = sf_save(F);		/* save original function */
    D = sf_save(D1);		/* make a scratch copy of D */

    /* Setup has always been a problem */
    if (recompute_onset) {
	EXEC(E = simplify(cube1list(F)),     "SIMPLIFY   ", E);
	free_cover(F);
	F = E;
    }
    cover_cost(F, &cost);
    if (unwrap_onset && (cube.part_size[cube.num_vars - 1] > 1)
      && (cost.out != cost.cubes*cube.part_size[cube.num_vars-1])
      && (cost.out < 5000))
	EXEC(F = sf_contain(unravel(F, cube.num_vars - 1)), "SETUP      ", F);

    /* Initial expand and irredundant */
    foreach_set(F, last, p) {
	RESET(p, PRIME);
    }
Ejemplo n.º 2
0
void find_equiv_outputs(pPLA PLA)
{
  int i, j, ipart, jpart, some_equiv;
  pcover *R, *F;

  some_equiv = FALSE;

  makeup_labels(PLA);

  F = ALLOC(pcover, cube.part_size[cube.output]);
  R = ALLOC(pcover, cube.part_size[cube.output]);

  for(i = 0; i < cube.part_size[cube.output]; i++) {
    ipart = cube.first_part[cube.output] + i;
    R[i] = cof_output(PLA->R, ipart);
    F[i] = complement(cube1list(R[i]));
  }

  for(i = 0; i < cube.part_size[cube.output]-1; i++) {
    for(j = i+1; j < cube.part_size[cube.output]; j++) {
      ipart = cube.first_part[cube.output] + i;
      jpart = cube.first_part[cube.output] + j;

      if (check_equiv(F[i], F[j])) {
        printf("# Outputs %d and %d (%s and %s) are equivalent\n",
            i, j, PLA->label[ipart], PLA->label[jpart]);
        some_equiv = TRUE;
      } else if (check_equiv(F[i], R[j])) {
        printf("# Outputs %d and NOT %d (%s and %s) are equivalent\n",
            i, j, PLA->label[ipart], PLA->label[jpart]);
        some_equiv = TRUE;
      } else if (check_equiv(R[i], F[j])) {
        printf("# Outputs NOT %d and %d (%s and %s) are equivalent\n",
            i, j, PLA->label[ipart], PLA->label[jpart]);
        some_equiv = TRUE;
      } else if (check_equiv(R[i], R[j])) {
        printf("# Outputs NOT %d and NOT %d (%s and %s) are equivalent\n",
            i, j, PLA->label[ipart], PLA->label[jpart]);
        some_equiv = TRUE;
      }
    }
  }

  if (! some_equiv) {
    printf("# No outputs are equivalent\n");
  }

  for(i = 0; i < cube.part_size[cube.output]; i++) {
    free_cover(F[i]);
    free_cover(R[i]);
  }
  FREE(F);
  FREE(R);
}
Ejemplo n.º 3
0
int check_equiv(pset_family f1, pset_family f2)
{
register pset *f1list, *f2list;
register pset p, last;
f1list = cube1list(f1);
for( p=f2->data, last= p+f2->count*f2->wsize; p< last; p+=f2->wsize) {
if (! cube_is_covered(f1list, p)) {
return 0;
}
}
((f1list[0]) ? (free((char *) (f1list[0])), (f1list[0]) = 0) : 0); ((f1list) ? (free((char *) (f1list)), (f1list) = 0) : 0);;
f2list = cube1list(f2);
for( p=f1->data, last= p+f1->count*f1->wsize; p< last; p+=f1->wsize) {
if (! cube_is_covered(f2list, p)) {
return 0;
}
}
((f2list[0]) ? (free((char *) (f2list[0])), (f2list[0]) = 0) : 0); ((f2list) ? (free((char *) (f2list)), (f2list) = 0) : 0);;
return 1;
}
Ejemplo n.º 4
0
int check_equiv(pset_family f1, pset_family f2)
{
  register pcube *f1list, *f2list;
  register pcube p, last;

  f1list = cube1list(f1);
  foreach_set(f2, last, p) {
    if (! cube_is_covered(f1list, p)) {
      return FALSE;
    }
  }
  free_cubelist(f1list);

  f2list = cube1list(f2);
  foreach_set(f1, last, p) {
    if (! cube_is_covered(f2list, p)) {
      return FALSE;
    }
  }
  free_cubelist(f2list);

  return TRUE;
}
Ejemplo n.º 5
0
find_equiv_outputs(pPLA PLA)
{
int i, j, ipart, jpart, some_equiv;
pset_family *R, *F;
some_equiv = 0;
makeup_labels(PLA);
F = ((pset_family *) malloc(sizeof(pset_family) * ( cube.part_size[cube.output])));
R = ((pset_family *) malloc(sizeof(pset_family) * ( cube.part_size[cube.output])));
for(i = 0; i < cube.part_size[cube.output]; i++) {
ipart = cube.first_part[cube.output] + i;
R[i] = cof_output(PLA->R, ipart);
F[i] = complement(cube1list(R[i]));
}
for(i = 0; i < cube.part_size[cube.output]-1; i++) {
for(j = i+1; j < cube.part_size[cube.output]; j++) {
ipart = cube.first_part[cube.output] + i;
jpart = cube.first_part[cube.output] + j;
if (check_equiv(F[i], F[j])) {
printf("# Outputs %d and %d (%s and %s) are equivalent\n",
i, j, PLA->label[ipart], PLA->label[jpart]);
some_equiv = 1;
} else if (check_equiv(F[i], R[j])) {
printf("# Outputs %d and NOT %d (%s and %s) are equivalent\n",
i, j, PLA->label[ipart], PLA->label[jpart]);
some_equiv = 1;
} else if (check_equiv(R[i], F[j])) {
printf("# Outputs NOT %d and %d (%s and %s) are equivalent\n",
i, j, PLA->label[ipart], PLA->label[jpart]);
some_equiv = 1;
} else if (check_equiv(R[i], R[j])) {
printf("# Outputs NOT %d and NOT %d (%s and %s) are equivalent\n",
i, j, PLA->label[ipart], PLA->label[jpart]);
some_equiv = 1;
}
}
}
if (! some_equiv) {
printf("# No outputs are equivalent\n");
}
for(i = 0; i < cube.part_size[cube.output]; i++) {
sf_free(F[i]);
sf_free(R[i]);
}
((F) ? (free((char *) (F)), (F) = 0) : 0);
((R) ? (free((char *) (R)), (R) = 0) : 0);
}