#header begin #define MAXNUMTECH 10 char *tech_ttl_string[] = {"tech_ttl",0}; char *fall_ttl_string[] = {"fall","fall_delay",0}; char *ttl_in_string[] = {"loads","sink_cur",0}; char *ttl_out_string[] = {"drive","drive_cur",0}; char *TTLTYPES[] = {"STD","LS","ALS","AS","S","F","L","H",0}; /* int matches(s,p) char *p[]; char *s; { int i; for (i=0;p[i];i++) if (!strcmp(p[i],s)) { return(1); } return(0); /* "not found" */ } */ int atotech(s,p) char *p[]; char *s; { int i; for (i=0;p[i];i++) if (!strcmp(p[i],s)) { return(i); } return(-1); /* "not found" */ } int add_ttl_tech(s,p) char *p[]; char *s; { int i; for (i=0;p[i];i++) if (!strcmp(p[i],s)) { return(i); } if (i < MAXNUMTECH) { p[i] = strcpy(malloc(strlen(s) + 1), s); return(i); } else return(-1); /* Too many technologys */ } typedef struct nodememory *nodememptr; struct nodememory { char **attr; float iload; }; int make_node_iload(n) nptr n; { if (n->nflags & ALIAS) return(0); n->memory = (char *) malloc(sizeof(struct nodememory)); ((nodememptr)(n->memory))->attr = NULL; ((nodememptr)(n->memory))->iload = 0; return (1); } int numdriven(n) register nptr n; { register plistptr p; register int count; switch (n->tag) { case PORT: n = ((portptr) n)->node; case CNODE: break; default: (void) fprintf(stderr, "Bad use of pointer in driven\n"); exit(1); } count = 0; for (p = n->head_driven; p; p = p->next) count++; return(count); } int printdriven(n) register nptr n; { register plistptr p; switch (n->tag) { case PORT: n = ((portptr) n)->node; case CNODE: break; default: (void) fprintf(stderr, "Bad use of pointer in driven\n"); exit(1); } while (n->nflags & ALIAS) n = n->nlink; if (n->nflags & ALIAS) return(0); lprintf(stdout,"%s has %d ports driving - ",n->nname,numdriven(n)); for (p = n->head_driven; p; p = p->next) lprintf(stdout,"(%s-%d) ",p->port->instance->name,p->port->pos); lprintf(stdout,"\n"); return(1); } portptr portdriven(n) register nptr n; { register plistptr p; switch (n->tag) { case PORT: n = ((portptr) n)->node; case CNODE: break; default: (void) fprintf(stderr, "Bad use of pointer in driven\n"); exit(1); } while (n->nflags & ALIAS) n = n->nlink; if (n->nflags & ALIAS) return(NULL); if (n->head_driven) return (n->head_driven->port); return(NULL); } int only_port_driving(n) register portptr n; { register nptr nd; register plistptr p; int val; switch (n->tag) { case PORT: nd = ((portptr) n)->node; break; default:(void)fprintf(stderr, "Bad use of pointer in only_port_driving\n"); exit(1); } val = 0; for (p = nd->head_driven; p; p = p->next) { if (p->port == n) val = 1; else if (p->port->val != TRISTATE) return(0); } return(val); } int add_iload_to_node(n,value) nptr n; float value; { while (n->nflags & ALIAS) n = n->nlink; if (n->nflags & ALIAS) return(0); if (n->memory) ((nodememptr)(n->memory))->iload += value; else return(0); return (1); } float get_node_iload(n) nptr n; { while (n->nflags & ALIAS) n = n->nlink; if (n->nflags & ALIAS) return(0); if (n->memory) return(((nodememptr)(n->memory))->iload); return(0); } int add_attr_to_node(n,attr,value) nptr n; char *attr; char *value; { int i; char **temp; char **tmpp; nodememptr memory; char *tempatt; int attrcnt; attrcnt = 0; while (n->nflags & ALIAS) n = n->nlink; if (n->nflags & ALIAS) return(0); if((memory = (nodememptr)(n->memory)) == NULL) return(0); tempatt = malloc((unsigned)strlen(attr)+strlen(value)+2); (void)sprintf(tempatt,"%s=%s",attr,value); if (memory->attr != NULL) for(attrcnt=0,tmpp = memory->attr; tmpp != NULL; attrcnt++) tmpp++; temp = (char **)malloc(sizeof(char *)*(attrcnt+2)); if (memory->attr != NULL) for (i=0,tmpp = (char **)memory->attr;iattr = temp; return (1); } #header end /* #control read_database int i; FILE *yyin; for (i=1;i