comparison netdiff/convert/tedax2donl.c @ 136:65f87111090c

netdiff: tedax2donl written
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 07 Sep 2020 03:02:42 +0000
parents
children 6f528e2a9e23
comparison
equal deleted inserted replaced
135:25634b3977a9 136:65f87111090c
1 /*
2 * This program converts a tEDAx netlist into our
3 * Diff-Oriented Netlist (DONL) format.
4 */
5
6 #include <ctype.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <strings.h>
11
12 #define MAX_FIELDS 32
13
14 static char *infname;
15 static FILE *inf;
16 static char linebuf[512];
17 static int lineno;
18 static char *fields[MAX_FIELDS];
19 static unsigned nfields;
20
21 static
22 get_line()
23 {
24 if (!fgets(linebuf, sizeof linebuf, inf))
25 return(0);
26 lineno++;
27 if (!index(linebuf, '\n')) {
28 fprintf(stderr, "%s line %d: missing newline\n",
29 infname, lineno);
30 exit(1);
31 }
32 return(1);
33 }
34
35 static void
36 parse_into_fields()
37 {
38 char *cp;
39
40 nfields = 0;
41 for (cp = linebuf; ; ) {
42 while (isspace(*cp))
43 cp++;
44 if (*cp == '\0' || *cp == '#')
45 break;
46 if (nfields >= MAX_FIELDS) {
47 fprintf(stderr, "%s line %d: too many fields\n",
48 infname, lineno);
49 exit(1);
50 }
51 fields[nfields++] = cp;
52 while (*cp) {
53 if (isspace(*cp)) {
54 *cp++ = '\0';
55 break;
56 }
57 if (*cp++ != '\\')
58 continue;
59 switch (*cp++) {
60 case '\\':
61 case 'n':
62 case 'r':
63 case 't':
64 case ' ':
65 case '\t':
66 continue;
67 default:
68 fprintf(stderr, "%s line %d: invalid escape\n",
69 infname, lineno);
70 exit(1);
71 }
72 }
73 }
74 }
75
76 static void
77 get_tedax_header()
78 {
79 do {
80 if (!get_line()) {
81 fprintf(stderr, "%s: EOF before tEDAx header\n",
82 infname);
83 exit(1);
84 }
85 parse_into_fields();
86 } while (!nfields);
87 if (strcmp(fields[0], "tEDAx")) {
88 fprintf(stderr, "%s line %d: expected tEDAx header\n",
89 infname, lineno);
90 exit(1);
91 }
92 if (nfields != 2 || strcmp(fields[1], "v1")) {
93 fprintf(stderr, "%s line %d: expected tEDAx v1\n",
94 infname, lineno);
95 exit(1);
96 }
97 }
98
99 static void
100 skip_wrong_block()
101 {
102 for (;;) {
103 if (!get_line()) {
104 fprintf(stderr,
105 "%s: EOF in the middle of a skip block\n",
106 infname, lineno);
107 exit(1);
108 }
109 if (!nfields)
110 continue;
111 if (!strcmp(fields[0], "begin")) {
112 fprintf(stderr, "%s line %d: nested block beginning\n",
113 infname, lineno);
114 exit(1);
115 }
116 if (!strcmp(fields[0], "end"))
117 return;
118 }
119 }
120
121 static void
122 find_begin_netlist()
123 {
124 for (;;) {
125 do {
126 if (!get_line()) {
127 fprintf(stderr,
128 "%s: EOF before beginning of netlist block\n",
129 infname);
130 exit(1);
131 }
132 parse_into_fields();
133 } while (!nfields);
134 if (strcmp(fields[0], "begin")) {
135 fprintf(stderr, "%s line %d: expected begin line\n",
136 infname, lineno);
137 exit(1);
138 }
139 if (nfields != 4) {
140 fprintf(stderr,
141 "%s line %d: begin line has wrong number of fields\n",
142 infname, lineno);
143 exit(1);
144 }
145 if (!strcmp(fields[1], "netlist"))
146 break;
147 skip_wrong_block();
148 }
149 if (strcmp(fields[2], "v1")) {
150 fprintf(stderr,
151 "%s line %d: netlist block has wrong version\n",
152 infname, lineno);
153 exit(1);
154 }
155 }
156
157 static void
158 process_netlist_block()
159 {
160 for (;;) {
161 if (!get_line()) {
162 fprintf(stderr,
163 "%s: EOF in the middle of the netlist block\n",
164 infname, lineno);
165 exit(1);
166 }
167 if (!nfields)
168 continue;
169 if (!strcmp(fields[0], "begin")) {
170 fprintf(stderr, "%s line %d: nested block beginning\n",
171 infname, lineno);
172 exit(1);
173 }
174 if (!strcmp(fields[0], "end"))
175 return;
176 if (strcmp(fields[0], "conn"))
177 continue;
178 if (nfields != 4) {
179 fprintf(stderr,
180 "%s line %d: conn line has wrong number of fields\n",
181 infname, lineno);
182 exit(1);
183 }
184 printf("%s\t%s.%s\n", fields[1], fields[2], fields[3]);
185 }
186 }
187
188 main(argc, argv)
189 char **argv;
190 {
191 if (argc != 2) {
192 fprintf(stderr, "usage: %s tedax-netlist-file\n", argv[0]);
193 exit(1);
194 }
195 infname = argv[1];
196 inf = fopen(infname, "r");
197 if (!inf) {
198 perror(infname);
199 exit(1);
200 }
201 get_tedax_header();
202 find_begin_netlist();
203 process_netlist_block();
204 exit(0);
205 }