# HG changeset patch # User Space Falcon # Date 1438892411 0 # Node ID 7e8a2cb54b6be9ea10fa76ccd498e30dd7046cc1 # Parent 558269596a5c3dde9bf9aa6920730ad35e2e0e75 started implementing unet-destar diff -r 558269596a5c -r 7e8a2cb54b6b .hgignore --- a/.hgignore Sun Aug 02 07:29:28 2015 +0000 +++ b/.hgignore Thu Aug 06 20:20:11 2015 +0000 @@ -7,5 +7,6 @@ ^ueda/mclutils/shortbom$ ^ueda/sverp/ueda-sverp$ ^ueda/sverp-bind/unet-bind$ +^ueda/unet-utils/unet-destar$ ^ueda/utils/cutelements$ ^ueda/utils/instfileelem$ diff -r 558269596a5c -r 7e8a2cb54b6b ueda/unet-utils/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ueda/unet-utils/Makefile Thu Aug 06 20:20:11 2015 +0000 @@ -0,0 +1,18 @@ +CC= gcc +CFLAGS= -O2 +PROGS= unet-destar +LIBUNET=../libunet/libunet.a +BINDIR= /usr/local/bin + +all: ${PROGS} + +${PROGS}: ${LIBUNET} + ${CC} ${CFLAGS} -o $@ $@.o ${LIBUNET} + +install: + install -c -o bin -g bin -m 755 ${PROGS} ${BINDIR} + +clean: + rm -f *.[ao] a.out core errs ${PROGS} + +unet-destar: unet-destar.o diff -r 558269596a5c -r 7e8a2cb54b6b ueda/unet-utils/unet-destar.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ueda/unet-utils/unet-destar.c Thu Aug 06 20:20:11 2015 +0000 @@ -0,0 +1,274 @@ +#include +#include +#include +#include +#include +#include "../libunet/unetrd.h" +#include "../libunet/nethash.h" + +extern struct net *enter_net_object(); +extern struct net *find_net_by_name(); + +static char *input_filename, *output_filename; +static struct unetrd_state rdstate; +static struct unetrd_out rdout; +static int total_input_nets; +static struct net *starpoint_head; +static FILE *tempFILE, *outFILE; + +struct netextra { + struct net *squashed_to; + int npoints; +}; + +static FILE * +tempfile() +{ + char template[16]; + register int fd; + register FILE *f; + + strcpy(template, "/tmp/uedaXXXXXX"); + fd = mkstemp(template); + if (fd < 0) { + perror("mkstemp"); + exit(1); + } + unlink(template); + f = fdopen(fd, "r+w"); + if (!f) { + perror("fdopen"); + exit(1); + } + return(f); +} + +static void +dump_tempfile() +{ + register FILE *inf = tempFILE; + register FILE *outf = outFILE; + register int c; + + rewind(inf); + while ((c = getc(inf)) != EOF) + putc(c, outf); + fclose(inf); +} + +static void +process_starpoint_head() +{ + register struct net *n; + register struct netextra *nx; + + n = find_net_by_name(rdout.connect_to_net); + for (;;) { + nx = (struct netextra *)(n + 1); + if (!nx->squashed_to) + break; + n = nx->squashed_to; + } + starpoint_head = n; +} + +static void +process_starpoint_arm() +{ + register struct net *n; + register struct netextra *nx; + + n = find_net_by_name(rdout.connect_to_net); + if (n == starpoint_head) { + fprintf(stderr, + "%s line %d: starpoint between net %s and itself!\n", + input_filename, rdstate.lineno, n->name); + exit(1); + } + nx = (struct netextra *)(n + 1); + if (nx->squashed_to) { + fprintf(stderr, + "%s line %d: net %s has already been squashed\n", + input_filename, rdstate.lineno, n->name); + exit(1); + } + nx->squashed_to = starpoint_head; +} + +static void +process_starpoint() +{ + starpoint_head = 0; + for (;;) { + if (!read_unet_line(&rdstate, &rdout)) { + fprintf(stderr, "%s error: EOF in STARPOINT block\n", + input_filename); + exit(1); + } + if (rdout.typecode == UNETOBJ_CLOSINGBRACE) + break; + switch(rdout.typecode) { + case UNETOBJ_PRIMITIVE: + case UNETOBJ_ALTNAME: + continue; + case UNETOBJ_PIN: + if (!rdout.connect_to_net) { + fprintf(stderr, + "%s line %d: no-connect is meaningless for a starpoint arm\n", + input_filename, rdstate.lineno); + exit(1); + } + if (!starpoint_head) + process_starpoint_head(); + else + process_starpoint_arm(); + continue; + case UNETOBJ_PINMAP: + fprintf(stderr, + "%s line %d: PINMAP meaningless in a STARPOINT block\n", + input_filename, rdstate.lineno); + exit(1); + default: + fprintf(stderr, + "%s line %d: object type %s unexpected in STARPOINT block\n", + input_filename, rdstate.lineno, rdout.keyword); + exit(1); + } + } +} + +static void +process_component_pin() +{ + register struct net *n; + register struct netextra *nx; + + if (!rdout.connect_to_net) { + fprintf(tempFILE, " %s %s = NC (%s)\n", rdout.keyword, + rdout.objname, rdout.nc_comment); + return; + } + n = find_net_by_name(rdout.connect_to_net); + for (;;) { + nx = (struct netextra *)(n + 1); + if (!nx->squashed_to) + break; + n = nx->squashed_to; + } + fprintf(tempFILE, " %s %s = NET %s\n", rdout.keyword, rdout.objname, + n->name); + nx->npoints++; +} + +static void +process_component() +{ + fprintf(tempFILE, "\nCOMPONENT %s {\n", rdout.objname); + for (;;) { + if (!read_unet_line(&rdstate, &rdout)) { + fprintf(stderr, "%s error: EOF in COMPONENT block\n", + input_filename); + exit(1); + } + if (rdout.typecode == UNETOBJ_CLOSINGBRACE) + break; + switch(rdout.typecode) { + case UNETOBJ_PRIMITIVE: + case UNETOBJ_ALTNAME: + fprintf(tempFILE, " %s %s\n", rdout.keyword, + rdout.objname); + continue; + case UNETOBJ_PIN: + case UNETOBJ_PINMAP: + process_component_pin(); + continue; + default: + fprintf(stderr, + "%s line %d: object type %s unexpected in COMPONENT block\n", + input_filename, rdstate.lineno, rdout.keyword); + exit(1); + } + } + fputs("}\n", tempFILE); +} + +static void +process_input_unet() +{ + struct net *n; + int state = 0; + + open_unet_input_file(input_filename, &rdstate); + while (read_unet_line(&rdstate, &rdout)) { + switch(rdout.typecode) { + case UNETOBJ_CLOSINGBRACE: + fprintf(stderr, + "%s line %d: unexpected '}' outside of component block\n", + input_filename, rdstate.lineno); + exit(1); + case UNETOBJ_NET: + if (state == 0) + state = 1; + else if (state > 1) { + fprintf(stderr, +"error: all input nets must precede all starpoints and components (%s line %d)\n", + input_filename, rdstate.lineno); + exit(1); + } + n = enter_net_object(rdout.objname, + sizeof(struct netextra)); + bzero(n + 1, sizeof(struct netextra)); + total_input_nets++; + continue; + case UNETOBJ_STARPOINT: + if (state < 1) { + fprintf(stderr, + "error (%s line %d): STARPOINT without any preceding NETs\n", + input_filename, rdstate.lineno); + exit(1); + } + if (state > 2) { + fprintf(stderr, + "error: all STARPOINTs must precede all COMPONENTs (%s line %d)\n", + input_filename, rdstate.lineno); + exit(1); + } + state = 2; + process_starpoint(); + continue; + case UNETOBJ_COMPONENT: + if (state < 1) { + fprintf(stderr, + "error (%s line %d): COMPONENT without any preceding NETs\n", + input_filename, rdstate.lineno); + exit(1); + } + if (state < 3) { + tempFILE = tempfile(); + state = 3; + } + process_component(); + continue; + default: + fprintf(stderr, + "%s line %d: unexpected object type %s\n", + input_filename, rdstate.lineno, rdout.keyword); + exit(1); + } + } +} + +main(argc, argv) + char **argv; +{ + if (argc < 2 || argc > 3) { + fprintf(stderr, "usage: %s input.unet [output.unet]\n", + argv[0]); + exit(1); + } + input_filename = argv[1]; + output_filename = argv[2]; + process_input_unet(); + /* output remains to be implemented */ + exit(0); +}