# HG changeset patch # User Mychaela Falconia # Date 1454225528 0 # Node ID 455a0051f9d2b7487402d9357ef137be04d7cd1b # Parent 9d7e2937883d3025f234b180dd63b63b07effd5a pads2gpcb: PARTTYPE parsing implemented, compiles diff -r 9d7e2937883d -r 455a0051f9d2 pads2gpcb/Makefile --- a/pads2gpcb/Makefile Sun Jan 31 05:30:33 2016 +0000 +++ b/pads2gpcb/Makefile Sun Jan 31 07:32:08 2016 +0000 @@ -1,7 +1,7 @@ CC= gcc CFLAGS= -O2 -OBJS= decals.o globals.o gpcbout.o main.o rdunits.o readpads.o silkselect.o \ - writeelem.o +OBJS= decals.o globals.o gpcbout.o main.o parttype.o rdunits.o readpads.o \ + silkselect.o util.o writeelem.o HDRS= globals.h gpcbout.h struct.h PROG= pads2gpcb BINDIR= /usr/local/bin diff -r 9d7e2937883d -r 455a0051f9d2 pads2gpcb/decals.c --- a/pads2gpcb/decals.c Sun Jan 31 05:30:33 2016 +0000 +++ b/pads2gpcb/decals.c Sun Jan 31 07:32:08 2016 +0000 @@ -592,3 +592,15 @@ process_one_decal(); } } + +struct part_decal * +find_decal_by_name(name) + char *name; +{ + struct part_decal *p; + + for (p = part_decal_list; p; p = p->next) + if (!strcmp(p->name, name)) + break; + return(p); +} diff -r 9d7e2937883d -r 455a0051f9d2 pads2gpcb/parttype.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pads2gpcb/parttype.c Sun Jan 31 07:32:08 2016 +0000 @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#include +#include "globals.h" +#include "struct.h" + +extern struct part_decal *find_decal_by_name(); +extern char *savestr(); + +static struct part_type *our_parttype; +static int ngates, nsignals; + +static void +enter_parttype() +{ + struct part_type *p, **pp; + char *name = input_line_fields[0]; + + for (pp = &part_type_list; p = *pp; pp = &p->next) + if (!strcmp(p->name, name)) { + fprintf(stderr, + "%s line %d: part type name \"%s\" already defined\n", + input_filename, input_lineno, name); + exit(1); + } + p = malloc(sizeof(struct part_type) + strlen(name) + 1); + if (!p) { + perror("malloc of struct part_type"); + exit(1); + } + bzero(p, sizeof(struct part_type)); + p->name = (char *)(p + 1); + strcpy(p->name, name); + *pp = p; + our_parttype = p; +} + +static void +find_decals() +{ + char *cp, *np; + struct part_decal *decal; + + for (cp = input_line_fields[1]; cp; cp = np) { + np = index(cp, ':'); + if (np) + *np++ = '\0'; + if (!*cp) + continue; + decal = find_decal_by_name(cp); + if (!decal) { + fprintf(stderr, +"%s line %d: part type definition refers to unknown decal name \"%s\"\n", + input_filename, input_lineno, cp); + exit(1); + } + if (our_parttype->ndecals >= MAX_DECALS_PER_PART_TYPE) { + fprintf(stderr, + "%s line %d: MAX_DECALS_PER_PART_TYPE exceeded\n", + input_filename, input_lineno); + exit(1); + } + our_parttype->decals[our_parttype->ndecals++] = decal; + } + if (!our_parttype->ndecals) { + fprintf(stderr, + "%s line %d: empty list of decals in part type def\n", + input_filename, input_lineno); + exit(1); + } +} + +static void +process_header_line() +{ + if (input_line_nfields < 6) { + fprintf(stderr, +"%s line %d: expected beginning of part type definition, wrong # of fields\n", + input_filename, input_lineno); + exit(1); + } + enter_parttype(); + printf("Processing part type %s\n", our_parttype->name); + find_decals(); + ngates = atoi(input_line_fields[3]); + nsignals = atoi(input_line_fields[4]); + our_parttype->num_alpha_pins = atoi(input_line_fields[5]); +} + +static void +get_line_internal() +{ + if (!get_input_line()) { + fprintf(stderr, + "error: EOF in the middle of a part type definition\n"); + exit(1); + } +} + +static void +process_one_gate_def() +{ + int gatepins; + + get_line_internal(); + parse_input_line_fields(); + if (input_line_nfields != 3 || strcmp(input_line_fields[0], "G")) { + fprintf(stderr, "%s line %d: expected gate def header line\n", + input_filename, input_lineno); + exit(1); + } + gatepins = atoi(input_line_fields[2]); + while (gatepins > 0) { + get_line_internal(); + parse_input_line_fields(); + gatepins -= input_line_nfields; + } +} + +static void +alloc_alpha_pins_array() +{ + our_parttype->alpha_pins = + malloc(sizeof(char *) * our_parttype->num_alpha_pins); + if (!our_parttype->alpha_pins) { + perror("malloc of alpha_pins array"); + exit(1); + } +} + +static void +read_alpha_pins() +{ + int idx, i; + + for (idx = 0; idx < our_parttype->num_alpha_pins; ) { + get_line_internal(); + parse_input_line_fields(); + for (i = 0; i < input_line_nfields; i++) { + if (idx >= our_parttype->num_alpha_pins) { + fprintf(stderr, + "%s line %d: alpha_pins array overflow\n", + input_filename, input_lineno); + exit(1); + } + our_parttype->alpha_pins[idx++] = + savestr(input_line_fields[i]); + } + } +} + +static void +process_one_parttype() +{ + int i; + + process_header_line(); + for (i = 0; i < ngates; i++) + process_one_gate_def(); + for (i = 0; i < nsignals; i++) + get_line_internal(); + if (our_parttype->num_alpha_pins) { + alloc_alpha_pins_array(); + read_alpha_pins(); + } +} + +process_parttype_section() +{ + for (;;) { + if (!get_input_line()) { + fprintf(stderr, "error: EOF in PARTTYPE section\n"); + exit(1); + } + if (input_line_buf[0] == '*') { + parse_starline(); + if (strcmp(input_line_starkw, "REMARK")) + break; + else + continue; + } + parse_input_line_fields(); + if (input_line_nfields) + process_one_parttype(); + } +} diff -r 9d7e2937883d -r 455a0051f9d2 pads2gpcb/struct.h --- a/pads2gpcb/struct.h Sun Jan 31 05:30:33 2016 +0000 +++ b/pads2gpcb/struct.h Sun Jan 31 07:32:08 2016 +0000 @@ -65,7 +65,8 @@ struct part_type { char *name; int ndecals; - struct part_decals *decals[MAX_DECALS_PER_PART_TYPE]; + struct part_decal *decals[MAX_DECALS_PER_PART_TYPE]; + int num_alpha_pins; char **alpha_pins; struct part_type *next; }; diff -r 9d7e2937883d -r 455a0051f9d2 pads2gpcb/util.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pads2gpcb/util.c Sun Jan 31 07:32:08 2016 +0000 @@ -0,0 +1,19 @@ +#include +#include +#include +#include + +char * +savestr(srcstr) + char *srcstr; +{ + char *buf; + + buf = malloc(strlen(srcstr) + 1); + if (!buf) { + perror("malloc in savestr"); + exit(1); + } + strcpy(buf, srcstr); + return(buf); +}