FreeCalypso > hg > ueda-linux
diff netdiff/convert/pads2donl.c @ 134:ab7b9f01ac6a
netdiff: pads2donl converter added
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 07 Sep 2020 00:40:55 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/netdiff/convert/pads2donl.c Mon Sep 07 00:40:55 2020 +0000 @@ -0,0 +1,103 @@ +/* + * This program converts a PADS ASCII netlist into our + * Diff-Oriented Netlist (DONL) format. + */ + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> + +#define MAX_NETNAME 127 + +static char *infname; +static FILE *inf; +static char linebuf[512], netname[MAX_NETNAME+1]; +static int lineno; + +static void +process_signal_line() +{ + char *cp, *np; + + cp = linebuf + 1; + while (*cp != '*') + cp++; + cp++; + if (!isspace(*cp)) { +badsig: fprintf(stderr, "%s line %d: malformed SIGNAL line\n", + infname, lineno); + exit(1); + } + while (isspace(*cp)) + cp++; + if (!*cp) + goto badsig; + for (np = cp; *cp && !isspace(*cp); cp++) + ; + if (*cp) + *cp = '\0'; + if (strlen(np) > MAX_NETNAME) { + fprintf(stderr, "%s line %d: signal name too long\n", + infname, lineno); + exit(1); + } + strcpy(netname, np); +} + +static void +process_data_line() +{ + char *cp, *np; + + for (cp = linebuf; ; ) { + while (isspace(*cp)) + cp++; + if (!*cp) + break; + for (np = cp; *cp && !isspace(*cp); cp++) + ; + if (*cp) + *cp++ = '\0'; + printf("%s\t%s\n", netname, np); + } +} + +main(argc, argv) + char **argv; +{ + if (argc != 2) { + fprintf(stderr, "usage: %s pads-netlist-file\n", argv[0]); + exit(1); + } + infname = argv[1]; + inf = fopen(infname, "r"); + if (!inf) { + perror(infname); + exit(1); + } + for (;;) { + if (!fgets(linebuf, sizeof linebuf, inf)) + break; + lineno++; + if (!index(linebuf, '\n')) { + fprintf(stderr, "%s line %d: missing newline\n", + infname, lineno); + exit(1); + } + if (linebuf[0] == '*') { + if (!strncmp(linebuf, "*END*", 5)) + break; + if (!strncmp(linebuf, "*SIG*", 5) || + !strncmp(linebuf, "*SIGNAL*", 8)) + process_signal_line(); + else + netname[0] = '\0'; + continue; + } + if (netname[0]) + process_data_line(); + } + exit(0); +}