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);
+	}
+}