| #include "espresso.h" | |
| find_equiv_outputs(PLA) | |
| 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); | |
| } | |
| int check_equiv(f1, f2) | |
| pcover f1, 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; | |
| } |