FreeCalypso > hg > ueda-linux
diff ueda/unet-bind/outcomp.c @ 101:ffab0a4424ad
ueda: unet-bind program moved into sensibly named unet-bind subdir
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 29 Sep 2019 22:42:41 +0000 |
parents | ueda/sverp-bind/outcomp.c@c59f52e4bacf |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ueda/unet-bind/outcomp.c Sun Sep 29 22:42:41 2019 +0000 @@ -0,0 +1,103 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "../libueda/mcl.h" +#include "../libueda/xga.h" +#include "struct.h" + +extern struct component components[]; +extern int ncomponents; + +extern char *get_comp_attr(); +extern struct grid_pkg_desc *read_grid_pkg_file(); + +extern int check_completeness; + +struct outcomp *netlist_comps; + +static int +try_numpins(oc) + register struct outcomp *oc; +{ + char *npins_attr; + register int n; + + npins_attr = get_comp_attr(oc->mclcomp, "npins"); + if (!npins_attr) + return(0); + n = atoi(npins_attr); + if (n <= 0) { + fprintf(stderr, "component %s: invalid npins attribute\n", + oc->name); + exit(1); + } + oc->npins = n; + return(1); +} + +static int +try_gridpkg(oc) + register struct outcomp *oc; +{ + char *attr; + register struct grid_pkg_desc *desc; + + attr = get_comp_attr(oc->mclcomp, "grid_pkg"); + if (!attr) + return(0); + desc = read_grid_pkg_file(attr); + oc->grid_pkg = desc; + oc->npins = desc->nrows * desc->ncolumns; + return(1); +} + +static void +init_one_outcomp(oc) + register struct outcomp *oc; +{ + register struct pinconn **conn_array; + register char *attr; + + oc->name = oc->mclcomp->name; + try_numpins(oc); + if (!oc->npins) + try_gridpkg(oc); + if (!oc->npins) { + fprintf(stderr, + "error: %s has neither npins nor grid_pkg attribute\n", + oc->name); + exit(1); + } + conn_array = (struct pinconn **) malloc(sizeof(struct pinconn *) * + oc->npins); + if (!conn_array) { + perror("malloc"); + exit(1); + } + bzero(conn_array, sizeof(struct pinconn *) * oc->npins); + oc->conn_array = conn_array; + if (attr = get_comp_attr(oc->mclcomp, "hier")) + process_hier_attr(oc, attr); + else if (attr = get_comp_attr(oc->mclcomp, "slotmap")) + process_slotmap_attr(oc, attr); + else if (check_completeness) + fprintf(stderr, "MCL component %s has no binding\n", oc->name); +} + +init_outcomp_from_MCL() +{ + register int i; + + netlist_comps = (struct outcomp *) + malloc(sizeof(struct outcomp) * ncomponents); + if (!netlist_comps) { + perror("malloc"); + exit(1); + } + bzero(netlist_comps, sizeof(struct outcomp) * ncomponents); + for (i = 0; i < ncomponents; i++) { + netlist_comps[i].mclcomp = components + i; + init_one_outcomp(netlist_comps + i); + } +}