diff ueda/uschem-netlist/main.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ueda/uschem-netlist/main.c	Mon Jul 20 00:24:37 2015 +0000
@@ -0,0 +1,148 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <strings.h>
+#include "../libuschem/schemstruct.h"
+
+extern int optind;
+extern char *optarg;
+
+extern char *MCLfile;
+
+extern struct schem *read_schem();
+
+extern int pcb_netlist_output();
+extern int pinlist_output();
+extern int stats_output();
+
+struct schem *curschem;
+int allow_unnamed_nets, check_completeness, sort_netlist_output;
+int global_errflag;
+char *outfilename;
+FILE *outfile;
+int (*do_output)() = pcb_netlist_output;
+
+main(argc, argv)
+	char **argv;
+{
+	register int c;
+	register struct schem *schem;
+	char **avp;
+
+	while ((c = getopt(argc, argv, "cI:M:o:O:su")) != EOF)
+		switch (c) {
+		case 'c':
+			check_completeness++;
+			break;
+		case 'I':
+			add_symfile_dir(optarg);
+			break;
+		case 'M':
+			MCLfile = optarg;
+			break;
+		case 'o':
+			outfilename = optarg;
+			break;
+		case 'O':
+			select_output_backend(optarg);
+			break;
+		case 's':
+			sort_netlist_output++;
+			break;
+		case 'u':
+			allow_unnamed_nets++;
+			break;
+		default:
+usage:			fprintf(stderr, "usage: %s [-options] schemfile...\n",
+				argv[0]);
+			exit(1);
+		}
+	if (!argv[optind])
+		goto usage;
+
+	read_MCL();
+	hash_MCL();
+	set_default_sympath();
+	read_pinouts();
+	alloc_nlcomp_array();
+
+	for (avp = argv + optind; *avp; avp++) {
+		schem = read_schem(*avp);
+		curschem = schem;
+		match_schem_to_mcl(schem);
+		if (hash_component_instances(schem) < 0)
+			exit(1);
+		if (preen_graphnets(schem, 1, 0, 0, 0) < 0)
+			exit(1);
+		process_schem();
+	}
+	if (global_errflag)
+		fprintf(stderr, "Errors found; netlist may be incomplete\n");
+	do_output();
+
+	exit(0);
+}
+
+process_schem()
+{
+	register struct schemobj *obj;
+	int has_netlines = 0;
+
+	for (obj = curschem->obj_next; obj != (struct schemobj *)curschem;
+	     obj = obj->obj_next)
+	switch (obj->obj_type) {
+	case OBJTYPE_COMPINST:
+		check_compinst_pintonet(obj);
+		continue;
+	case OBJTYPE_NET:
+	case OBJTYPE_GRAPHNET:
+		process_netobj(obj);
+		continue;
+	case OBJTYPE_NETLINE:
+		if (!has_netlines) {
+			fprintf(stderr,
+		"%s contains NetLine objects which are not netlistable\n",
+				curschem->orig_filename);
+			has_netlines++;
+			global_errflag++;
+		}
+		continue;
+	}
+}
+
+struct output_backend_spec {
+	char *keyword;
+	int (*func)();
+} output_backend_list[] = {
+	{"pcb", pcb_netlist_output},
+	{"geda", pcb_netlist_output},
+	{"pinlist", pinlist_output},
+	{"stats", stats_output},
+	{NULL, NULL}};
+
+select_output_backend(arg)
+	char *arg;
+{
+	register struct output_backend_spec *tp;
+
+	for (tp = output_backend_list; tp->keyword; tp++)
+		if (!strcmp(tp->keyword, arg))
+			break;
+	if (!tp->func) {
+		fprintf(stderr, "%s: unknown or unimplemented output backend\n",
+			arg);
+		exit(1);
+	}
+	do_output = tp->func;
+}
+
+open_output_file()
+{
+	if (outfilename) {
+		outfile = fopen(outfilename, "w");
+		if (!outfile) {
+			perror(outfilename);
+			exit(1);
+		}
+	} else
+		outfile = stdout;
+}