FreeCalypso > hg > ueda-linux
diff ueda/uschem-netlist/pcbout.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/pcbout.c Mon Jul 20 00:24:37 2015 +0000 @@ -0,0 +1,135 @@ +/* + * Netlist output in the gEDA/PCB format + */ + +#include <stdio.h> +#include <strings.h> +#include "../libueda/mcl.h" +#include "netlist.h" + +extern struct net **sorted_named_nets; +extern int total_named_nets; +extern struct net *unnamed_net_list; + +extern FILE *outfile; +extern int allow_unnamed_nets, check_completeness, sort_netlist_output; + +static int unnamed_net_count; + +static +emit_net(netname, points) + char *netname; + struct pinconn *points; +{ + register struct pinconn *pc; + int linelen, linefresh; + register int i; + + fprintf(outfile, "%s\t", netname); + linelen = (strlen(netname) + 8) & ~7; + for (pc = points, linefresh = 1; pc; pc = pc->next_in_net) { + i = strlen(pc->comp->mclcomp->name) + strlen(pc->pinnum) + 2; + if (!linefresh && linelen + i > 78) { + fputs(" \\\n\t", outfile); + linelen = 8; + linefresh = 1; + } + if (linefresh) + i--; + else + putc(' ', outfile); + fprintf(outfile, "%s-%s", pc->comp->mclcomp->name, pc->pinnum); + linelen += i; + linefresh = 0; + } + putc('\n', outfile); +} + +static +emit_named_net(net) + register struct net *net; +{ + if (net->npoints == 0) { + fprintf(stderr, "Net %s has no points, discarded\n", + net->netname); + return; + } + if (net->npoints == 1 && check_completeness) + fprintf(stderr, "Warning: net %s has only 1 point\n", + net->netname); + emit_net(net->netname, net->pins); +} + +static +do_sorted_named_nets() +{ + register struct net **np; + register int i; + + for (np = sorted_named_nets, i = 0; i < total_named_nets; np++, i++) + emit_named_net(*np); +} + +static +report_singular_unnamed_net(net) + struct net *net; +{ + register struct pinconn *pc; + + pc = net->pins; + fprintf(stderr, + "Pin %s-%s assigned to a singular unnamed net (%s line %d)\n", + pc->comp->mclcomp->name, pc->pinnum, pc->origin_file, + pc->origin_line); +} + +static +do_unnamed_nets() +{ + register struct net *net; + char bogonetname[32]; + + for (net = unnamed_net_list; net; net = net->next) { + if (net->npoints == 0) { + /* + * These can only result from previous errors, + * i.e., we thought we had a pin going to an unnamed + * net, allocated a nethead for it, but the pin + * turned out to be invalid. + * + * Here we silently discard these aberrations w/o + * printing anything because the original error + * must have already been reported. + */ + continue; + } + if (net->npoints == 1) { + report_singular_unnamed_net(net); + /* don't emit these */ + continue; + } + /* a *real* unnamed net */ + unnamed_net_count++; + if (allow_unnamed_nets) { + sprintf(bogonetname, "unnamed_net_%d", + unnamed_net_count); + emit_net(bogonetname, net->pins); + } + } + if (unnamed_net_count && !allow_unnamed_nets) + fprintf(stderr, "%d unnamed nets left out\n", + unnamed_net_count); +} + +pcb_netlist_output() +{ + open_output_file(); + if (sort_netlist_output) { + sort_named_nets(); + do_sorted_named_nets(); + } else + named_net_forall(emit_named_net); + do_unnamed_nets(); + if (check_completeness) + check_for_unused_comps(); +}