FreeCalypso > hg > ueda-linux
diff ueda/uschem-netlist/nets.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/nets.c Mon Jul 20 00:24:37 2015 +0000 @@ -0,0 +1,127 @@ +/* + * Working with struct net objects (netheads) + */ + +#include <sys/types.h> +#include <stdio.h> +#include <strings.h> +#include "netlist.h" + +extern char *malloc(); + +#define HASH_SIZE 1103 + +static struct net *named_net_hash[HASH_SIZE]; +int total_named_nets; + +struct net **sorted_named_nets; + +struct net *unnamed_net_list; +int total_unnamed_nets; + +struct net noconnect_pseudo_net = {"NO_CONNECT", NULL, 0, NULL}; + +static int +hash_netname(str) + char *str; +{ + register u_long accum = 0; + register char *cp; + register int c, i; + + for (cp = str, i = 1; c = *cp; cp++, i++) + accum += c * i; + return(accum % HASH_SIZE); +} + +struct net * +alloc_nethead() +{ + register struct net *n; + + n = (struct net *) malloc(sizeof(struct net)); + if (!n) { + perror("malloc"); + exit(1); + } + bzero(n, sizeof(struct net)); + return(n); +} + +struct net * +get_nethead_for_netname(netname) + register char *netname; +{ + register struct net *n, **np; + + for (np = named_net_hash + hash_netname(netname); n = *np; + np = &n->next) + if (!strcmp(n->netname, netname)) + return(n); + n = alloc_nethead(); + n->netname = netname; + *np = n; + total_named_nets++; + return(n); +} + +report_named_net_hash_quality() +{ + int maxchain; + register int hb, curchain; + register struct net *n; + + for (hb = 0, maxchain = 0; hb < HASH_SIZE; hb++) { + for (n = named_net_hash[hb], curchain = 0; n; n = n->next) + curchain++; + if (curchain > maxchain) + maxchain = curchain; + } + printf("Total named nets: %d\n", total_named_nets); + printf("Longest hash chain: %d\n", maxchain); +} + +named_net_forall(callback) + int (*callback)(); +{ + register struct net *n, **hb; + register int i; + + for (hb = named_net_hash, i = 0; i < HASH_SIZE; hb++, i++) + for (n = *hb; n; n = n->next) + callback(n); +} + +static +netname_sort_compare(net1, net2) + struct net **net1, **net2; +{ + return(strcmp((*net1)->netname, (*net2)->netname)); +} + +sort_named_nets() +{ + register struct net *n, **hb, **op; + register int i; + + sorted_named_nets = + (struct net **) malloc(sizeof(struct net *) * total_named_nets); + if (!sorted_named_nets) { + perror("malloc"); + exit(1); + } + op = sorted_named_nets; + for (hb = named_net_hash, i = 0; i < HASH_SIZE; hb++, i++) + for (n = *hb; n; n = n->next) + *op++ = n; + qsort(sorted_named_nets, total_named_nets, sizeof(struct net *), + netname_sort_compare); +} + +add_unnamed_net(n) + register struct net *n; +{ + n->next = unnamed_net_list; + unnamed_net_list = n; + total_unnamed_nets++; +}