comparison ueda/migration/g2uschem.c @ 0:cd92449fdb51

initial import of ueda and ifctf-part-lib from ifctfvax CVS
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 20 Jul 2015 00:24:37 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:cd92449fdb51
1 #include <ctype.h>
2 #include <stdio.h>
3 #include <strings.h>
4
5 #define MAXLINE 256
6 #define MAXATTRS 16
7 #define ATTRBUF_SIZE 4096
8
9 struct attr {
10 int graphparams[8];
11 char *name;
12 char *value;
13 };
14
15 FILE *inf, *outf;
16 char *infname, *outfname;
17 int lineno;
18 int x_offset, y_offset;
19
20 main(argc, argv)
21 char **argv;
22 {
23 char line[MAXLINE];
24 int objlineno;
25 struct attr attrs[MAXATTRS];
26 char attrbuf[ATTRBUF_SIZE];
27 int nattrs;
28 register int c;
29
30 if (argc > 1) {
31 infname = argv[1];
32 inf = fopen(infname, "r");
33 if (!inf) {
34 perror(infname);
35 exit(1);
36 }
37 } else {
38 inf = stdin;
39 infname = "stdin";
40 }
41 if (argc > 2) {
42 outfname = argv[2];
43 outf = fopen(outfname, "w");
44 if (!outf) {
45 perror(outfname);
46 exit(1);
47 }
48 } else {
49 outf = stdout;
50 outfname = "stdout";
51 }
52
53 while (getline(line)) {
54 if (!isalpha(line[0])) {
55 fprintf(stderr, "%s: line %d: gschem object expected\n",
56 infname, lineno);
57 exit(1);
58 }
59 objlineno = lineno;
60 /* check for attached attributes */
61 c = getc(inf);
62 if (c == '{') {
63 skipline();
64 nattrs = read_attrs(attrs, attrbuf);
65 } else {
66 if (c != EOF)
67 ungetc(c, inf);
68 nattrs = 0;
69 }
70 /* dispatch by object type */
71 switch (line[0]) {
72 case 'v':
73 continue; /* ignore */
74 /* simple graphics */
75 case 'L':
76 case 'B':
77 case 'V':
78 case 'A':
79 if (nattrs)
80 fprintf(stderr,
81 "%s: line %d: attributes attached to %c object (ignored)\n",
82 infname, objlineno, line[0]);
83 handle_simple_graph(line, objlineno);
84 continue;
85 case 'T':
86 handle_T_obj(line, objlineno);
87 continue;
88 case 'N':
89 handle_net(line, objlineno, attrs, nattrs);
90 continue;
91 case 'U':
92 handle_bus(line, objlineno, attrs, nattrs);
93 continue;
94 case 'C':
95 handle_component(line, objlineno, attrs, nattrs);
96 continue;
97 default:
98 fprintf(stderr,
99 "%s: line %d: object type %c not supported\n",
100 infname, objlineno, line[0]);
101 }
102 }
103 exit(0);
104 }
105
106 handle_component(objline, objlineno, attrs, nattrs)
107 char *objline;
108 struct attr *attrs;
109 {
110 int numparams[5];
111 char *cp, *symname;
112 struct attr *refdes;
113 register int i;
114
115 parse_numline(objline, objlineno, numparams, 5, &cp);
116 if (!isspace(*cp)) {
117 inv: fprintf(stderr, "%s: line %d: invalid C line\n", infname,
118 objlineno);
119 exit(1);
120 }
121 while (isspace(*cp))
122 cp++;
123 if (!isalnum(*cp))
124 goto inv;
125 for (symname = cp; isalnum(*cp) || *cp == '-' || *cp == '_'; cp++)
126 ;
127 if (strcmp(cp, ".sym"))
128 goto inv;
129 *cp = '\0';
130
131 /* weed some out based on the symbol name */
132 if (!strcmp(symname, "nc-x"))
133 return; /* we'll do that differently */
134 if (strlen(symname) == 7 && !strncmp(symname, "title-", 6)) {
135 /* handle titleblock */
136 fprintf(outf, "Schem graph %c;\n", symname[6]);
137 x_offset = numparams[0];
138 y_offset = numparams[1];
139 return;
140 }
141
142 /* do we have a refdes? */
143 refdes = NULL;
144 for (i = 0; i < nattrs; i++)
145 if (!strcmp(attrs[i].name, "refdes")) {
146 refdes = attrs + i;
147 break;
148 }
149 if (refdes)
150 emit_component_instance(numparams, symname, attrs, nattrs,
151 refdes, objlineno);
152 else
153 emit_graph_symbol(numparams, symname, attrs, nattrs, objlineno);
154 }
155
156 emit_component_instance(numparams, symname, attrs, nattrs, refdes, objlineno)
157 int *numparams;
158 char *symname;
159 struct attr *attrs, *refdes;
160 {
161 register struct attr *ap;
162 register int i;
163
164 fprintf(outf, "Component %s graph \"%s\" %d %d", refdes->value, symname,
165 numparams[0] - x_offset, numparams[1] - y_offset);
166 if (numparams[3])
167 fprintf(outf, " rot %d", numparams[3]);
168 if (numparams[4])
169 fputs(" mirror", outf);
170 fputs(" {\n", outf);
171
172 /* attribute data */
173 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
174 if (ap != refdes)
175 fprintf(outf, "\t(%s=\"%s\")\n", ap->name, ap->value);
176 /* attribute graphics */
177 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
178 if (ap->graphparams[4])
179 fprintf(outf, "\tDisplayAttr %s %d %d %d %d %d;\n",
180 ap->name, ap->graphparams[0] - x_offset,
181 ap->graphparams[1] - y_offset,
182 ap->graphparams[3],
183 ap->graphparams[6], ap->graphparams[7]);
184 fputs("};\n", outf);
185 }
186
187 emit_graph_symbol(numparams, symname, attrs, nattrs, objlineno)
188 int *numparams;
189 char *symname;
190 struct attr *attrs;
191 {
192 register struct attr *ap;
193 register int i;
194
195 fprintf(outf, "GraphSym \"%s\" %d %d", symname,
196 numparams[0] - x_offset, numparams[1] - y_offset);
197 if (numparams[3])
198 fprintf(outf, " rot %d", numparams[3]);
199 if (numparams[4])
200 fputs(" mirror", outf);
201
202 if (nattrs)
203 fputs(" {\n", outf);
204 else {
205 fputs(";\n", outf);
206 return;
207 }
208
209 /* attribute data */
210 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
211 fprintf(outf, "\t(%s=\"%s\")\n", ap->name, ap->value);
212 /* attribute graphics */
213 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
214 if (ap->graphparams[4])
215 fprintf(outf, "\tDisplayAttr %s %d %d %d %d %d;\n",
216 ap->name, ap->graphparams[0] - x_offset,
217 ap->graphparams[1] - y_offset,
218 ap->graphparams[3],
219 ap->graphparams[6], ap->graphparams[7]);
220 fputs("};\n", outf);
221 }
222
223 handle_net(objline, objlineno, attrs, nattrs)
224 char *objline;
225 struct attr *attrs;
226 {
227 int numparams[5];
228 register struct attr *ap;
229 register int i;
230
231 parse_numline(objline, objlineno, numparams, 5, NULL);
232 fprintf(outf, "NetLine (%d,%d) (%d,%d)", numparams[0] - x_offset,
233 numparams[1] - y_offset, numparams[2] - x_offset,
234 numparams[3] - y_offset);
235 if (nattrs)
236 fputs(" {\n", outf);
237 else {
238 fputs(";\n", outf);
239 return;
240 }
241
242 /* attribute data */
243 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
244 fprintf(outf, "\t(%s=\"%s\")\n", ap->name, ap->value);
245 /* attribute graphics */
246 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
247 if (ap->graphparams[4])
248 fprintf(outf, "\tDisplayAttr %s %d %d %d %d %d;\n",
249 ap->name, ap->graphparams[0] - x_offset,
250 ap->graphparams[1] - y_offset,
251 ap->graphparams[3],
252 ap->graphparams[6], ap->graphparams[7]);
253 fputs("};\n", outf);
254 }
255
256 handle_bus(objline, objlineno, attrs, nattrs)
257 char *objline;
258 struct attr *attrs;
259 {
260 int numparams[6];
261 register struct attr *ap;
262 register int i;
263
264 parse_numline(objline, objlineno, numparams, 6, NULL);
265 fprintf(outf, "BusSeg (%d,%d) (%d,%d)", numparams[0] - x_offset,
266 numparams[1] - y_offset, numparams[2] - x_offset,
267 numparams[3] - y_offset);
268 if (nattrs)
269 fputs(" {\n", outf);
270 else {
271 fputs(";\n", outf);
272 return;
273 }
274
275 /* attribute data */
276 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
277 fprintf(outf, "\t(%s=\"%s\")\n", ap->name, ap->value);
278 /* attribute graphics */
279 for (ap = attrs, i = 0; i < nattrs; ap++, i++)
280 if (ap->graphparams[4])
281 fprintf(outf, "\tDisplayAttr %s %d %d %d %d %d;\n",
282 ap->name, ap->graphparams[0] - x_offset,
283 ap->graphparams[1] - y_offset,
284 ap->graphparams[3],
285 ap->graphparams[6], ap->graphparams[7]);
286 fputs("};\n", outf);
287 }
288
289 handle_simple_graph(objline, objlineno)
290 char *objline;
291 {
292 translate_simple_graph_line(objline, objlineno);
293 fprintf(outf, "GraphBlockG {\n%s\n}\n", objline);
294 }
295
296 translate_simple_graph_line(objline, objlineno)
297 char *objline;
298 {
299 int numparams[16];
300
301 switch (objline[0]) {
302 case 'L':
303 parse_numline(objline, objlineno, numparams, 10, NULL);
304 numparams[0] -= x_offset;
305 numparams[1] -= y_offset;
306 numparams[2] -= x_offset;
307 numparams[3] -= y_offset;
308 sprintf(objline, "L %d %d %d %d %d %d %d %d %d %d",
309 numparams[0], numparams[1], numparams[2], numparams[3],
310 numparams[4], numparams[5], numparams[6], numparams[7],
311 numparams[8], numparams[9]);
312 return;
313 case 'B':
314 parse_numline(objline, objlineno, numparams, 16, NULL);
315 numparams[0] -= x_offset;
316 numparams[1] -= y_offset;
317 sprintf(objline,
318 "B %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
319 numparams[0], numparams[1], numparams[2], numparams[3],
320 numparams[4], numparams[5], numparams[6], numparams[7],
321 numparams[8], numparams[9], numparams[10],numparams[11],
322 numparams[12],numparams[13],numparams[14],
323 numparams[15]);
324 return;
325 case 'V':
326 parse_numline(objline, objlineno, numparams, 15, NULL);
327 numparams[0] -= x_offset;
328 numparams[1] -= y_offset;
329 sprintf(objline,
330 "V %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
331 numparams[0], numparams[1], numparams[2], numparams[3],
332 numparams[4], numparams[5], numparams[6], numparams[7],
333 numparams[8], numparams[9], numparams[10],numparams[11],
334 numparams[12],numparams[13],numparams[14]);
335 return;
336 case 'A':
337 parse_numline(objline, objlineno, numparams, 11, NULL);
338 numparams[0] -= x_offset;
339 numparams[1] -= y_offset;
340 sprintf(objline, "A %d %d %d %d %d %d %d %d %d %d %d",
341 numparams[0], numparams[1], numparams[2], numparams[3],
342 numparams[4], numparams[5], numparams[6], numparams[7],
343 numparams[8], numparams[9], numparams[10]);
344 return;
345 default:
346 fprintf(stderr,
347 "unknown type in translate_simple_graph_line()\n");
348 exit(1);
349 }
350 }
351
352 handle_T_obj(objline, objlineno)
353 char *objline;
354 {
355 int numparams[9];
356 char textline[MAXLINE];
357 register int i;
358
359 parse_numline(objline, objlineno, numparams, 9, NULL);
360 if (numparams[8] < 1) {
361 fprintf(stderr, "%s: line %d: T object: num_lines<1!\n",
362 infname, objlineno);
363 exit(1);
364 }
365 fprintf(outf, "GraphBlockG {\nT %d %d %d %d %d %d %d %d %d\n",
366 numparams[0] - x_offset, numparams[1] - y_offset, numparams[2],
367 numparams[3], numparams[4], numparams[5], numparams[6],
368 numparams[7], numparams[8]);
369 for (i = numparams[8]; i; i--) {
370 if (!getline(textline)) {
371 fprintf(stderr, "%s: EOF in T object\n", infname);
372 exit(1);
373 }
374 fprintf(outf, "%s\n", textline);
375 }
376 fputs("}\n", outf);
377 }
378
379 read_attrs(attrs, attrbuf)
380 struct attr *attrs;
381 char *attrbuf;
382 {
383 char Tline[MAXLINE];
384 int Tline_parsed[9];
385 char attrline[MAXLINE];
386 int nattrs, chars_used;
387 char *bufptr;
388 register char *cp;
389 register int i;
390
391 for (nattrs = 0, chars_used = 0, bufptr = attrbuf; ; ) {
392 if (!getline(Tline)) {
393 badeof: fprintf(stderr, "%s: EOF in attribute block\n",
394 infname);
395 exit(1);
396 }
397 switch (Tline[0]) {
398 case 'T':
399 break;
400 case '}':
401 return(nattrs);
402 default:
403 fprintf(stderr,
404 "%s: line %d: wrong line type in attribute block\n",
405 infname, lineno);
406 exit(1);
407 }
408 parse_numline(Tline, lineno, Tline_parsed, 9, NULL);
409 if (Tline_parsed[8] < 1) {
410 fprintf(stderr, "%s: line %d: T object: num_lines<1!\n",
411 infname, lineno);
412 exit(1);
413 }
414 if (Tline_parsed[8] > 1) {
415 fprintf(stderr,
416 "%s: line %d: multiline text object in attribute block not supported\n",
417 infname, lineno);
418 exit(1);
419 }
420 if (!getline(attrline))
421 goto badeof;
422 cp = index(attrline, '=');
423 if (!cp) /* non-attribute text item */
424 continue; /* ignore these */
425 /* break name and value */
426 *cp++ = '\0';
427 if (nattrs >= MAXATTRS) {
428 fprintf(stderr, "%s: line %d: too many attributes\n",
429 infname, lineno);
430 exit(1);
431 }
432 for (i = 0; i < 8; i++)
433 attrs[nattrs].graphparams[i] = Tline_parsed[i];
434 i = strlen(attrline) + 1;
435 chars_used += i;
436 if (chars_used > ATTRBUF_SIZE) {
437 bufovflo: fprintf(stderr, "%s: line %d: attr text buf overflow\n",
438 infname, lineno);
439 exit(1);
440 }
441 bcopy(attrline, bufptr, i);
442 attrs[nattrs].name = bufptr;
443 bufptr += i;
444 i = strlen(cp) + 1;
445 chars_used += i;
446 if (chars_used > ATTRBUF_SIZE)
447 goto bufovflo;
448 bcopy(cp, bufptr, i);
449 attrs[nattrs].value = bufptr;
450 bufptr += i;
451 nattrs++;
452 }
453 }
454
455 parse_numline(line, lineno, numarray, nfields, endp)
456 char *line;
457 int lineno;
458 int *numarray;
459 int nfields;
460 char **endp;
461 {
462 register char *cp, *np;
463 register int i;
464
465 for (i = 0, cp = line+1; i < nfields; i++) {
466 if (!isspace(*cp)) {
467 inv: fprintf(stderr, "%s: line %d: invalid numeric line\n",
468 infname, lineno);
469 exit(1);
470 }
471 while (isspace(*cp))
472 cp++;
473 np = cp;
474 if (*cp == '-')
475 cp++;
476 if (!isdigit(*cp))
477 goto inv;
478 while (isdigit(*cp))
479 cp++;
480 numarray[i] = atoi(np);
481 }
482 if (endp)
483 *endp = cp;
484 else if (*cp)
485 goto inv;
486 }
487
488 getline(linebuf)
489 char *linebuf;
490 {
491 register char *cp;
492
493 if (fgets(linebuf, MAXLINE, inf) == NULL)
494 return(0);
495 lineno++;
496 /* strip trailing newline or other whitespace */
497 cp = index(linebuf, '\0');
498 while (cp > linebuf && isspace(cp[-1]))
499 cp--;
500 *cp = '\0';
501 return(1);
502 }
503
504 skipline()
505 {
506 char junkline[MAXLINE];
507
508 getline(junkline);
509 }