ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cvrin.c
Go to the documentation of this file.
1/*
2 * Revision Control Information
3 *
4 * $Source$
5 * $Author$
6 * $Revision$
7 * $Date$
8 *
9 */
10/*
11 module: cvrin.c
12 purpose: cube and cover input routines
13*/
14
15#include <ctype.h>
16#include "espresso.h"
17
19
20
21static bool line_length_error;
22static int lineno;
23
24void skip_line(fpin, fpout, echo)
25register FILE *fpin, *fpout;
26register bool echo;
27{
28 register int ch;
29 while ((ch=getc(fpin)) != EOF && ch != '\n')
30 if (echo)
31 putc(ch, fpout);
32 if (echo)
33 putc('\n', fpout);
34 lineno++;
35}
36
37char *get_word(fp, word)
38register FILE *fp;
39register char *word;
40{
41 register int ch, i = 0;
42 while ((ch = getc(fp)) != EOF && isspace(ch))
43 ;
44 word[i++] = ch;
45 while ((ch = getc(fp)) != EOF && ! isspace(ch))
46 word[i++] = ch;
47 word[i++] = '\0';
48 return word;
49}
50
51/*
52 * Yes, I know this routine is a mess
53 */
54void read_cube(fp, PLA)
55register FILE *fp;
56pPLA PLA;
57{
58 register int var, i;
59 pcube cf = cube.temp[0], cr = cube.temp[1], cd = cube.temp[2];
60 bool savef = FALSE, saved = FALSE, saver = FALSE;
61 char token[256]; /* for kiss read hack */
62 int varx, first, last, offset; /* for kiss read hack */
63
64 set_clear(cf, cube.size);
65
66 /* Loop and read binary variables */
67 for(var = 0; var < cube.num_binary_vars; var++)
68 switch(getc(fp)) {
69 case EOF:
70 goto bad_char;
71 case '\n':
72 if (! line_length_error)
73 (void) fprintf(stderr, "product term(s) %s\n",
74 "span more than one line (warning only)");
75 line_length_error = TRUE;
76 lineno++;
77 var--;
78 break;
79 case ' ': case '|': case '\t':
80 var--;
81 break;
82 case '2': case '-':
83 set_insert(cf, var*2+1);
84 case '0':
85 set_insert(cf, var*2);
86 break;
87 case '1':
88 set_insert(cf, var*2+1);
89 break;
90 case '?':
91 break;
92 default:
93 goto bad_char;
94 }
95
96
97 /* Loop for the all but one of the multiple-valued variables */
98 for(var = cube.num_binary_vars; var < cube.num_vars-1; var++)
99
100 /* Read a symbolic multiple-valued variable */
101 if (cube.part_size[var] < 0) {
102 (void) fscanf(fp, "%s", token);
103 if (equal(token, "-") || equal(token, "ANY")) {
104 if (kiss && var == cube.num_vars - 2) {
105 /* leave it empty */
106 } else {
107 /* make it full */
108 set_or(cf, cf, cube.var_mask[var]);
109 }
110 } else if (equal(token, "~")) {
111 ;
112 /* leave it empty ... (?) */
113 } else {
114 if (kiss && var == cube.num_vars - 2)
115 varx = var - 1, offset = ABS(cube.part_size[var-1]);
116 else
117 varx = var, offset = 0;
118 /* Find the symbolic label in the label table */
119 first = cube.first_part[varx];
120 last = cube.last_part[varx];
121 for(i = first; i <= last; i++)
122 if (PLA->label[i] == (char *) NULL) {
123 PLA->label[i] = util_strsav(token); /* add new label */
124 set_insert(cf, i+offset);
125 break;
126 } else if (equal(PLA->label[i], token)) {
127 set_insert(cf, i+offset); /* use column i */
128 break;
129 }
130 if (i > last) {
131 (void) fprintf(stderr,
132"declared size of variable %d (counting from variable 0) is too small\n", var);
133 exit(-1);
134 }
135 }
136
137 } else for(i = cube.first_part[var]; i <= cube.last_part[var]; i++)
138 switch (getc(fp)) {
139 case EOF:
140 goto bad_char;
141 case '\n':
142 if (! line_length_error)
143 (void) fprintf(stderr, "product term(s) %s\n",
144 "span more than one line (warning only)");
145 line_length_error = TRUE;
146 lineno++;
147 i--;
148 break;
149 case ' ': case '|': case '\t':
150 i--;
151 break;
152 case '1':
153 set_insert(cf, i);
154 case '0':
155 break;
156 default:
157 goto bad_char;
158 }
159
160 /* Loop for last multiple-valued variable */
161 if (kiss) {
162 saver = savef = TRUE;
163 (void) set_xor(cr, cf, cube.var_mask[cube.num_vars - 2]);
164 } else
165 set_copy(cr, cf);
166 set_copy(cd, cf);
167 for(i = cube.first_part[var]; i <= cube.last_part[var]; i++)
168 switch (getc(fp)) {
169 case EOF:
170 goto bad_char;
171 case '\n':
172 if (! line_length_error)
173 (void) fprintf(stderr, "product term(s) %s\n",
174 "span more than one line (warning only)");
175 line_length_error = TRUE;
176 lineno++;
177 i--;
178 break;
179 case ' ': case '|': case '\t':
180 i--;
181 break;
182 case '4': case '1':
183 if (PLA->pla_type & F_type)
184 set_insert(cf, i), savef = TRUE;
185 break;
186 case '3': case '0':
187 if (PLA->pla_type & R_type)
188 set_insert(cr, i), saver = TRUE;
189 break;
190 case '2': case '-':
191 if (PLA->pla_type & D_type)
192 set_insert(cd, i), saved = TRUE;
193 case '~':
194 break;
195 default:
196 goto bad_char;
197 }
198 if (savef) PLA->F = sf_addset(PLA->F, cf);
199 if (saved) PLA->D = sf_addset(PLA->D, cd);
200 if (saver) PLA->R = sf_addset(PLA->R, cr);
201 return;
202
203bad_char:
204 (void) fprintf(stderr, "(warning): input line #%d ignored\n", lineno);
205 skip_line(fp, stdout, TRUE);
206 return;
207}␌
208void parse_pla(fp, PLA)
209IN FILE *fp;
210INOUT pPLA PLA;
211{
212 int i, var, ch, np, last;
213 char word[256];
214
215 lineno = 1;
216 line_length_error = FALSE;
217
218loop:
219 switch(ch = getc(fp)) {
220 case EOF:
221 return;
222
223 case '\n':
224 lineno++;
225
226 case ' ': case '\t': case '\f': case '\r':
227 break;
228
229 case '#':
230 (void) ungetc(ch, fp);
231 skip_line(fp, stdout, echo_comments);
232 break;
233
234 case '.':
235 /* .i gives the cube input size (binary-functions only) */
236 if (equal(get_word(fp, word), "i")) {
237 if (cube.fullset != NULL) {
238 (void) fprintf(stderr, "extra .i ignored\n");
239 skip_line(fp, stdout, /* echo */ FALSE);
240 } else {
241 if (fscanf(fp, "%d", &cube.num_binary_vars) != 1)
242 fatal("error reading .i");
243 cube.num_vars = cube.num_binary_vars + 1;
244 cube.part_size = ALLOC(int, cube.num_vars);
245 }
246
247 /* .o gives the cube output size (binary-functions only) */
248 } else if (equal(word, "o")) {
249 if (cube.fullset != NULL) {
250 (void) fprintf(stderr, "extra .o ignored\n");
251 skip_line(fp, stdout, /* echo */ FALSE);
252 } else {
253 if (cube.part_size == NULL)
254 fatal(".o cannot appear before .i");
255 if (fscanf(fp, "%d", &(cube.part_size[cube.num_vars-1]))!=1)
256 fatal("error reading .o");
257 cube_setup();
258 PLA_labels(PLA);
259 }
260
261 /* .mv gives the cube size for a multiple-valued function */
262 } else if (equal(word, "mv")) {
263 if (cube.fullset != NULL) {
264 (void) fprintf(stderr, "extra .mv ignored\n");
265 skip_line(fp, stdout, /* echo */ FALSE);
266 } else {
267 if (cube.part_size != NULL)
268 fatal("cannot mix .i and .mv");
269 if (fscanf(fp,"%d %d",
270 &cube.num_vars,&cube.num_binary_vars) != 2)
271 fatal("error reading .mv");
272 if (cube.num_binary_vars < 0)
273fatal("num_binary_vars (second field of .mv) cannot be negative");
274 if (cube.num_vars < cube.num_binary_vars)
275 fatal(
276"num_vars (1st field of .mv) must exceed num_binary_vars (2nd field of .mv)");
277 cube.part_size = ALLOC(int, cube.num_vars);
278 for(var=cube.num_binary_vars; var < cube.num_vars; var++)
279 if (fscanf(fp, "%d", &(cube.part_size[var])) != 1)
280 fatal("error reading .mv");
281 cube_setup();
282 PLA_labels(PLA);
283 }
284
285 /* .p gives the number of product terms -- we ignore it */
286 } else if (equal(word, "p"))
287 (void) fscanf(fp, "%d", &np);
288 /* .e and .end specify the end of the file */
289 else if (equal(word, "e") || equal(word,"end")) {
290 if (cube.fullset == NULL) {
291 /* fatal("unknown PLA size, need .i/.o or .mv");*/
292 } else if (PLA->F == NULL) {
293 PLA->F = new_cover(10);
294 PLA->D = new_cover(10);
295 PLA->R = new_cover(10);
296 }
297 return;
298 }
299 /* .kiss turns on the kiss-hack option */
300 else if (equal(word, "kiss"))
301 kiss = TRUE;
302
303 /* .type specifies a logical type for the PLA */
304 else if (equal(word, "type")) {
305 (void) get_word(fp, word);
306 for(i = 0; pla_types[i].key != 0; i++)
307 if (equal(pla_types[i].key + 1, word)) {
308 PLA->pla_type = pla_types[i].value;
309 break;
310 }
311 if (pla_types[i].key == 0)
312 fatal("unknown type in .type command");
313
314 /* parse the labels */
315 } else if (equal(word, "ilb")) {
316 if (cube.fullset == NULL)
317 fatal("PLA size must be declared before .ilb or .ob");
318 if (PLA->label == NULL)
319 PLA_labels(PLA);
320 for(var = 0; var < cube.num_binary_vars; var++) {
321 (void) get_word(fp, word);
322 i = cube.first_part[var];
323 PLA->label[i+1] = util_strsav(word);
324 PLA->label[i] = ALLOC(char, strlen(word) + 6);
325 (void) sprintf(PLA->label[i], "%s.bar", word);
326 }
327 } else if (equal(word, "ob")) {
328 if (cube.fullset == NULL)
329 fatal("PLA size must be declared before .ilb or .ob");
330 if (PLA->label == NULL)
331 PLA_labels(PLA);
332 var = cube.num_vars - 1;
333 for(i = cube.first_part[var]; i <= cube.last_part[var]; i++) {
334 (void) get_word(fp, word);
335 PLA->label[i] = util_strsav(word);
336 }
337 /* .label assigns labels to multiple-valued variables */
338 } else if (equal(word, "label")) {
339 if (cube.fullset == NULL)
340 fatal("PLA size must be declared before .label");
341 if (PLA->label == NULL)
342 PLA_labels(PLA);
343 if (fscanf(fp, "var=%d", &var) != 1)
344 fatal("Error reading labels");
345 for(i = cube.first_part[var]; i <= cube.last_part[var]; i++) {
346 (void) get_word(fp, word);
347 PLA->label[i] = util_strsav(word);
348 }
349
350 } else if (equal(word, "symbolic")) {
351 symbolic_t *newlist, *p1;
352 if (read_symbolic(fp, PLA, word, &newlist)) {
353 if (PLA->symbolic == NIL(symbolic_t)) {
354 PLA->symbolic = newlist;
355 } else {
356 for(p1=PLA->symbolic;p1->next!=NIL(symbolic_t);
357 p1=p1->next){
358 }
359 p1->next = newlist;
360 }
361 } else {
362 fatal("error reading .symbolic");
363 }
364
365 } else if (equal(word, "symbolic-output")) {
366 symbolic_t *newlist, *p1;
367 if (read_symbolic(fp, PLA, word, &newlist)) {
368 if (PLA->symbolic_output == NIL(symbolic_t)) {
369 PLA->symbolic_output = newlist;
370 } else {
371 for(p1=PLA->symbolic_output;p1->next!=NIL(symbolic_t);
372 p1=p1->next){
373 }
374 p1->next = newlist;
375 }
376 } else {
377 fatal("error reading .symbolic-output");
378 }
379
380 /* .phase allows a choice of output phases */
381 } else if (equal(word, "phase")) {
382 if (cube.fullset == NULL)
383 fatal("PLA size must be declared before .phase");
384 if (PLA->phase != NULL) {
385 (void) fprintf(stderr, "extra .phase ignored\n");
386 skip_line(fp, stdout, /* echo */ FALSE);
387 } else {
388 do ch = getc(fp); while (ch == ' ' || ch == '\t');
389 (void) ungetc(ch, fp);
390 PLA->phase = set_save(cube.fullset);
391 last = cube.last_part[cube.num_vars - 1];
392 for(i=cube.first_part[cube.num_vars - 1]; i <= last; i++)
393 if ((ch = getc(fp)) == '0')
394 set_remove(PLA->phase, i);
395 else if (ch != '1')
396 fatal("only 0 or 1 allowed in phase description");
397 }
398
399 /* .pair allows for bit-pairing input variables */
400 } else if (equal(word, "pair")) {
401 int j;
402 if (PLA->pair != NULL) {
403 (void) fprintf(stderr, "extra .pair ignored\n");
404 } else {
405 ppair pair;
406 PLA->pair = pair = ALLOC(pair_t, 1);
407 if (fscanf(fp, "%d", &(pair->cnt)) != 1)
408 fatal("syntax error in .pair");
409 pair->var1 = ALLOC(int, pair->cnt);
410 pair->var2 = ALLOC(int, pair->cnt);
411 for(i = 0; i < pair->cnt; i++) {
412 (void) get_word(fp, word);
413 if (word[0] == '(') (void) strcpy(word, word+1);
414 if (label_index(PLA, word, &var, &j)) {
415 pair->var1[i] = var+1;
416 } else {
417 fatal("syntax error in .pair");
418 }
419
420 (void) get_word(fp, word);
421 if (word[strlen(word)-1] == ')') {
422 word[strlen(word)-1]='\0';
423 }
424 if (label_index(PLA, word, &var, &j)) {
425 pair->var2[i] = var+1;
426 } else {
427 fatal("syntax error in .pair");
428 }
429 }
430 }
431
432 } else {
434 printf("%c%s ", ch, word);
435 skip_line(fp, stdout, echo_unknown_commands);
436 }
437 break;
438 default:
439 (void) ungetc(ch, fp);
440 if (cube.fullset == NULL) {
441/* fatal("unknown PLA size, need .i/.o or .mv");*/
442 if (echo_comments)
443 putchar('#');
444 skip_line(fp, stdout, echo_comments);
445 break;
446 }
447 if (PLA->F == NULL) {
448 PLA->F = new_cover(10);
449 PLA->D = new_cover(10);
450 PLA->R = new_cover(10);
451 }
452 read_cube(fp, PLA);
453 }
454 goto loop;
455}␌
456/*
457 read_pla -- read a PLA from a file
458
459 Input stops when ".e" is encountered in the input file, or upon reaching
460 end of file.
461
462 Returns the PLA in the variable PLA after massaging the "symbolic"
463 representation into a positional cube notation of the ON-set, OFF-set,
464 and the DC-set.
465
466 needs_dcset and needs_offset control the computation of the OFF-set
467 and DC-set (i.e., if either needs to be computed, then it will be
468 computed via complement only if the corresponding option is TRUE.)
469 pla_type specifies the interpretation to be used when reading the
470 PLA.
471
472 The phase of the output functions is adjusted according to the
473 global option "pos" or according to an imbedded .phase option in
474 the input file. Note that either phase option implies that the
475 OFF-set be computed regardless of whether the caller needs it
476 explicitly or not.
477
478 Bit pairing of the binary variables is performed according to an
479 imbedded .pair option in the input file.
480
481 The global cube structure also reflects the sizes of the PLA which
482 was just read. If these fields have already been set, then any
483 subsequent PLA must conform to these sizes.
484
485 The global flags trace and summary control the output produced
486 during the read.
487
488 Returns a status code as a result:
489 EOF (-1) : End of file reached before any data was read
490 > 0 : Operation successful
491*/
492
493int read_pla(fp, needs_dcset, needs_offset, pla_type, PLA_return)
494IN FILE *fp;
496IN int pla_type;
497OUT pPLA *PLA_return;
498{
499 pPLA PLA;
500 int i, second, third;
501 long time;
502 cost_t cost;
503
504 /* Allocate and initialize the PLA structure */
505 PLA = *PLA_return = new_PLA();
506 PLA->pla_type = pla_type;
507
508 /* Read the pla */
509 time = ptime();
510 parse_pla(fp, PLA);
511
512 /* Check for nothing on the file -- implies reached EOF */
513 if (PLA->F == NULL) {
514 return EOF;
515 }
516
517 /* This hack merges the next-state field with the outputs */
518 for(i = 0; i < cube.num_vars; i++) {
519 cube.part_size[i] = ABS(cube.part_size[i]);
520 }
521 if (kiss) {
522 third = cube.num_vars - 3;
523 second = cube.num_vars - 2;
524 if (cube.part_size[third] != cube.part_size[second]) {
525 (void) fprintf(stderr," with .kiss option, third to last and second\n");
526 (void) fprintf(stderr, "to last variables must be the same size.\n");
527 return EOF;
528 }
529 for(i = 0; i < cube.part_size[second]; i++) {
530 PLA->label[i + cube.first_part[second]] =
531 util_strsav(PLA->label[i + cube.first_part[third]]);
532 }
533 cube.part_size[second] += cube.part_size[cube.num_vars-1];
534 cube.num_vars--;
535 setdown_cube();
536 cube_setup();
537 }
538
539 if (trace) {
540 totals(time, READ_TIME, PLA->F, &cost);
541 }
542
543 /* Decide how to break PLA into ON-set, OFF-set and DC-set */
544 time = ptime();
545 if (pos || PLA->phase != NULL || PLA->symbolic_output != NIL(symbolic_t)) {
547 }
548 if (needs_offset && (PLA->pla_type==F_type || PLA->pla_type==FD_type)) {
549 free_cover(PLA->R);
550 PLA->R = complement(cube2list(PLA->F, PLA->D));
551 } else if (needs_dcset && PLA->pla_type == FR_type) {
552 pcover X;
553 free_cover(PLA->D);
554 /* hack, why not? */
555 X = d1merge(sf_join(PLA->F, PLA->R), cube.num_vars - 1);
556 PLA->D = complement(cube1list(X));
557 free_cover(X);
558 } else if (PLA->pla_type == R_type || PLA->pla_type == DR_type) {
559 free_cover(PLA->F);
560 PLA->F = complement(cube2list(PLA->D, PLA->R));
561 }
562
563 if (trace) {
564 totals(time, COMPL_TIME, PLA->R, &cost);
565 }
566
567 /* Check for phase rearrangement of the functions */
568 if (pos) {
569 pcover onset = PLA->F;
570 PLA->F = PLA->R;
571 PLA->R = onset;
572 PLA->phase = new_cube();
573 set_diff(PLA->phase, cube.fullset, cube.var_mask[cube.num_vars-1]);
574 } else if (PLA->phase != NULL) {
575 (void) set_phase(PLA);
576 }
577
578 /* Setup minimization for two-bit decoders */
579 if (PLA->pair != (ppair) NULL) {
580 set_pair(PLA);
581 }
582
583 if (PLA->symbolic != NIL(symbolic_t)) {
584 EXEC(map_symbolic(PLA), "MAP-INPUT ", PLA->F);
585 }
586 if (PLA->symbolic_output != NIL(symbolic_t)) {
587 EXEC(map_output_symbolic(PLA), "MAP-OUTPUT ", PLA->F);
588 if (needs_offset) {
589 free_cover(PLA->R);
590EXECUTE(PLA->R=complement(cube2list(PLA->F,PLA->D)), COMPL_TIME, PLA->R, cost);
591 }
592 }
593
594 return 1;
595}
596
597void PLA_summary(PLA)
598pPLA PLA;
599{
600 int var, i;
601 symbolic_list_t *p2;
602 symbolic_t *p1;
603
604 printf("# PLA is %s", PLA->filename);
605 if (cube.num_binary_vars == cube.num_vars - 1)
606 printf(" with %d inputs and %d outputs\n",
607 cube.num_binary_vars, cube.part_size[cube.num_vars - 1]);
608 else {
609 printf(" with %d variables (%d binary, mv sizes",
610 cube.num_vars, cube.num_binary_vars);
611 for(var = cube.num_binary_vars; var < cube.num_vars; var++)
612 printf(" %d", cube.part_size[var]);
613 printf(")\n");
614 }
615 printf("# ON-set cost is %s\n", print_cost(PLA->F));
616 printf("# OFF-set cost is %s\n", print_cost(PLA->R));
617 printf("# DC-set cost is %s\n", print_cost(PLA->D));
618 if (PLA->phase != NULL)
619 printf("# phase is %s\n", pc1(PLA->phase));
620 if (PLA->pair != NULL) {
621 printf("# two-bit decoders:");
622 for(i = 0; i < PLA->pair->cnt; i++)
623 printf(" (%d %d)", PLA->pair->var1[i], PLA->pair->var2[i]);
624 printf("\n");
625 }
626 if (PLA->symbolic != NIL(symbolic_t)) {
627 for(p1 = PLA->symbolic; p1 != NIL(symbolic_t); p1 = p1->next) {
628 printf("# symbolic: ");
629 for(p2=p1->symbolic_list; p2!=NIL(symbolic_list_t); p2=p2->next) {
630 printf(" %d", p2->variable);
631 }
632 printf("\n");
633 }
634 }
635 if (PLA->symbolic_output != NIL(symbolic_t)) {
636 for(p1 = PLA->symbolic_output; p1 != NIL(symbolic_t); p1 = p1->next) {
637 printf("# output symbolic: ");
638 for(p2=p1->symbolic_list; p2!=NIL(symbolic_list_t); p2=p2->next) {
639 printf(" %d", p2->pos);
640 }
641 printf("\n");
642 }
643 }
644 (void) fflush(stdout);
645}
646
647
649{
650 pPLA PLA;
651
652 PLA = ALLOC(PLA_t, 1);
653 PLA->F = PLA->D = PLA->R = (pcover) NULL;
654 PLA->phase = (pcube) NULL;
655 PLA->pair = (ppair) NULL;
656 PLA->label = (char **) NULL;
657 PLA->filename = (char *) NULL;
658 PLA->pla_type = 0;
659 PLA->symbolic = NIL(symbolic_t);
661 return PLA;
662}
663
664
665void PLA_labels(PLA)
666pPLA PLA;
667{
668 int i;
669
670 PLA->label = ALLOC(char *, cube.size);
671 for(i = 0; i < cube.size; i++)
672 PLA->label[i] = (char *) NULL;
673}
674
675
676void free_PLA(PLA)
677pPLA PLA;
678{
679 symbolic_list_t *p2, *p2next;
680 symbolic_t *p1, *p1next;
681 int i;
682
683 if (PLA->F != (pcover) NULL)
684 free_cover(PLA->F);
685 if (PLA->R != (pcover) NULL)
686 free_cover(PLA->R);
687 if (PLA->D != (pcover) NULL)
688 free_cover(PLA->D);
689 if (PLA->phase != (pcube) NULL)
690 free_cube(PLA->phase);
691 if (PLA->pair != (ppair) NULL) {
692 FREE(PLA->pair->var1);
693 FREE(PLA->pair->var2);
694 FREE(PLA->pair);
695 }
696 if (PLA->label != NULL) {
697 for(i = 0; i < cube.size; i++)
698 if (PLA->label[i] != NULL)
699 FREE(PLA->label[i]);
700 FREE(PLA->label);
701 }
702 if (PLA->filename != NULL) {
703 FREE(PLA->filename);
704 }
705 for(p1 = PLA->symbolic; p1 != NIL(symbolic_t); p1 = p1next) {
706 for(p2 = p1->symbolic_list; p2 != NIL(symbolic_list_t); p2 = p2next) {
707 p2next = p2->next;
708 FREE(p2);
709 }
710 p1next = p1->next;
711 FREE(p1);
712 }
713 PLA->symbolic = NIL(symbolic_t);
714 for(p1 = PLA->symbolic_output; p1 != NIL(symbolic_t); p1 = p1next) {
715 for(p2 = p1->symbolic_list; p2 != NIL(symbolic_list_t); p2 = p2next) {
716 p2next = p2->next;
717 FREE(p2);
718 }
719 p1next = p1->next;
720 FREE(p1);
721 }
723 FREE(PLA);
724}
725
726
727int read_symbolic(fp, PLA, word, retval)
728FILE *fp;
729pPLA PLA;
730char *word; /* scratch string for words */
731symbolic_t **retval;
732{
733 symbolic_list_t *listp, *prev_listp;
734 symbolic_label_t *labelp, *prev_labelp;
735 symbolic_t *newlist;
736 int i, var;
737
738 newlist = ALLOC(symbolic_t, 1);
739 newlist->next = NIL(symbolic_t);
741 newlist->symbolic_list_length = 0;
743 newlist->symbolic_label_length = 0;
744 prev_listp = NIL(symbolic_list_t);
745 prev_labelp = NIL(symbolic_label_t);
746
747 for(;;) {
748 (void) get_word(fp, word);
749 if (equal(word, ";"))
750 break;
751 if (label_index(PLA, word, &var, &i)) {
752 listp = ALLOC(symbolic_list_t, 1);
753 listp->variable = var;
754 listp->pos = i;
755 listp->next = NIL(symbolic_list_t);
756 if (prev_listp == NIL(symbolic_list_t)) {
757 newlist->symbolic_list = listp;
758 } else {
759 prev_listp->next = listp;
760 }
761 prev_listp = listp;
762 newlist->symbolic_list_length++;
763 } else {
764 return FALSE;
765 }
766 }
767
768 for(;;) {
769 (void) get_word(fp, word);
770 if (equal(word, ";"))
771 break;
772 labelp = ALLOC(symbolic_label_t, 1);
773 labelp->label = util_strsav(word);
774 labelp->next = NIL(symbolic_label_t);
775 if (prev_labelp == NIL(symbolic_label_t)) {
776 newlist->symbolic_label = labelp;
777 } else {
778 prev_labelp->next = labelp;
779 }
780 prev_labelp = labelp;
781 newlist->symbolic_label_length++;
782 }
783
784 *retval = newlist;
785 return TRUE;
786}
787
788
789int label_index(PLA, word, varp, ip)
790pPLA PLA;
791char *word;
792int *varp;
793int *ip;
794{
795 int var, i;
796
797 if (PLA->label == NIL(char *) || PLA->label[0] == NIL(char)) {
798 if (sscanf(word, "%d", varp) == 1) {
799 *ip = *varp;
800 return TRUE;
801 }
802 } else {
803 for(var = 0; var < cube.num_vars; var++) {
804 for(i = 0; i < cube.part_size[var]; i++) {
805 if (equal(PLA->label[cube.first_part[var]+i], word)) {
806 *varp = var;
807 *ip = i;
808 return TRUE;
809 }
810 }
811 }
812 }
813 return FALSE;
814}
816
#define TRUE
Definition abcBm.c:38
#define FALSE
Definition abcBm.c:37
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
#define ALLOC(type, num)
Definition avl.h:27
#define NIL(type)
Definition avl.h:25
#define FREE(obj)
Definition avl.h:31
pcover complement(pcube *T)
Definition compl.c:49
void setdown_cube()
Definition cubestr.c:95
ABC_NAMESPACE_IMPL_START void cube_setup()
Definition cubestr.c:27
pPLA new_PLA()
Definition cvrin.c:648
#define pcover
Definition espresso.h:264
void parse_pla()
pset_family sf_addset()
#define new_cube()
Definition espresso.h:262
char * pc1()
void PLA_summary()
struct symbolic_label_struct symbolic_label_t
#define set_save(r)
Definition espresso.h:166
void skip_line()
void totals()
struct PLA_t * pPLA
struct cost_struct cost_t
#define set_insert(set, e)
Definition espresso.h:172
bool echo_unknown_commands
Definition globals.c:26
void fatal()
pset_family d1merge()
#define COMPL_TIME
Definition espresso.h:373
#define equal(a, b)
Definition espresso.h:326
pcube * cube2list()
#define F_type
Definition espresso.h:337
#define INOUT
Definition espresso.h:334
bool kiss
Definition globals.c:29
void free_PLA()
void map_output_symbolic()
#define pcube
Definition espresso.h:261
struct pla_types_struct pla_types[]
Definition globals.c:42
#define EXECUTE(fct, i, S, cost)
Definition espresso.h:422
#define free_cover(r)
Definition espresso.h:266
bool trace
Definition globals.c:36
int read_pla()
void PLA_labels()
pPLA set_phase()
pset set_diff()
#define READ_TIME
Definition espresso.h:372
#define free_cube(r)
Definition espresso.h:263
#define set_remove(set, e)
Definition espresso.h:171
char * print_cost()
#define R_type
Definition espresso.h:339
struct symbolic_list_struct symbolic_list_t
void read_cube()
char * get_word()
#define D_type
Definition espresso.h:338
#define FD_type
Definition espresso.h:345
void set_pair()
#define IN
Definition espresso.h:332
pset set_clear()
int read_symbolic()
pset set_or()
struct pair_struct * ppair
void map_symbolic()
#define EXEC(fct, name, S)
Definition espresso.h:418
bool pos
Definition globals.c:30
struct symbolic_struct symbolic_t
#define DR_type
Definition espresso.h:347
pset_family sf_join()
pset set_copy()
struct pair_struct pair_t
#define OUT
Definition espresso.h:333
bool echo_comments
Definition globals.c:25
#define FR_type
Definition espresso.h:346
pcube * cube1list()
#define new_cover(i)
Definition espresso.h:265
pset set_xor()
pcover complement()
int label_index()
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
bool needs_dcset
Definition main.h:28
enum keys key
Definition main.h:25
bool needs_offset
Definition main.h:27
char ** label
Definition espresso.h:321
pcover D
Definition espresso.h:316
ppair pair
Definition espresso.h:320
pcover R
Definition espresso.h:316
char * filename
Definition espresso.h:317
pcube phase
Definition espresso.h:319
symbolic_t * symbolic_output
Definition espresso.h:323
pcover F
Definition espresso.h:316
int pla_type
Definition espresso.h:318
symbolic_t * symbolic
Definition espresso.h:322
Definition exor.h:123
int * var1
Definition espresso.h:284
int * var2
Definition espresso.h:285
struct symbolic_label_struct * next
Definition espresso.h:300
struct symbolic_list_struct * next
Definition espresso.h:293
symbolic_label_t * symbolic_label
Definition espresso.h:308
struct symbolic_struct * next
Definition espresso.h:310
symbolic_list_t * symbolic_list
Definition espresso.h:306
int symbolic_list_length
Definition espresso.h:307
int symbolic_label_length
Definition espresso.h:309
#define ptime()
Definition util_old.h:283
int strlen()
char * sprintf()
char * strcpy()
VOID_HACK exit()
#define ABS(a)
Definition util_old.h:250