📄 subckt.c
字号:
} } return(gotone);}/*-------------------------------------------------------------------* * Devmodtranslate scans through the deck, and translates the * name of the model in a line held in a .subckt. For example: * before: .subckt U1 . . . . * Q1 c b e 2N3904 * after: Q1 c b e U1:2N3904 *-------------------------------------------------------------------*/static voiddevmodtranslate(struct line *deck, char *subname){ struct line *s; char *buffer, *name, *t, c; wordlist *wlsub; bool found;#ifdef XSPICE char *next_name;#endif /* XSPICE */ for (s = deck; s; s = s->li_next) { t = s->li_line;#ifdef TRACE /* SDB debug stuff */ printf("In devmodtranslate, examining line %s.\n", t);#endif while (*t && isspace(*t)) t++; c = isupper(*t) ? tolower(*t) : *t; /* set c to first char in line. . . . */ found = FALSE; buffer = tmalloc(strlen(t) + strlen(subname) + 4); switch (c) {#ifdef XSPICE case 'a': /* Code for codemodels (dev prefix "A") added by SDB on 6.10.2004. * The algorithm is simple. We don't know how many nodes or sources are attached, * but the name of the model is always last. Therefore, just iterate through all * tokens until the last one is reached. Then translate it. */#ifdef TRACE /* SDB debug statement */ printf("In devmodtranslate, found codemodel, line= %s\n", t);#endif /* first do refdes. */ name = gettok(&t); /* get refdes */ (void) sprintf(buffer,"%s ",name); tfree(name); /* now do remainder of line. */ next_name = gettok(&t); while(1) { name = next_name; next_name = gettok(&t); if(next_name == NULL) { /* if next_name is NULL, we are at the line end. * name holds the model name. Therefore, break */ break; } else { /* next_name holds something. Write name into the buffer and continue. */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); } } /* while */ /* Now, is name a subcircuit model? * Note that we compare against submod = untranslated names of models. */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) {#ifdef TRACE /* SDB debug statement */ printf("In devmodtranslate, comparing model name against submod list item %s\n", wlsub->wl_word );#endif if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name);#ifdef TRACE /* SDB debug statement */ printf("In devmodtranslate, translated codemodel line= %s\n", buffer);#endif (void) strcat(buffer, t); tfree(s->li_line); s->li_line = buffer; break;#endif /* XSPICE */ case 'r': case 'c': name = gettok(&t); /* get refdes */ (void) sprintf(buffer,"%s ",name); tfree(name); name = gettok_node(&t); /* get first netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get second netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); if (*t) { /* if there is a model, process it. . . . */ name = gettok(&t); /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); } found = FALSE; if (*t) { name = gettok(&t); /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); } (void) strcat(buffer, t); tfree(s->li_line); s->li_line = buffer; break; case 'd': name = gettok(&t); /* get refdes */ (void) sprintf(buffer,"%s ",name); tfree(name); name = gettok_node(&t); /* get first attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get second attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok(&t); /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); (void) strcat(buffer, t); tfree(s->li_line); s->li_line = buffer; break; case 'w': case 'u': case 'j': case 'z': /* What are these devices anyway? J = JFET, W = trans line (?), and u = IC, but what is Z?. Also, why is 'U' here? A 'U' element can have an arbitrary number of nodes attached. . . . -- SDB. */ name = gettok(&t); (void) sprintf(buffer,"%s ",name); name = gettok(&t); (void) sprintf(buffer + strlen(buffer), "%s ", name); name = gettok(&t); (void) sprintf(buffer + strlen(buffer), "%s ", name); name = gettok(&t); (void) sprintf(buffer + strlen(buffer), "%s ", name); name = gettok(&t); /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); (void) strcat(buffer, t); tfree(s->li_line); s->li_line = buffer; break; /* Changed gettok() to gettok_node() on 12.2.2003 by SDB to enable parsing lines like "S1 10 11 (80,51) SLATCH1" which occur in real Analog Devices SPICE models. */ case 'o': /* what is this element? -- SDB */ case 's': case 'm': name = gettok(&t); /* get refdes */ (void) sprintf(buffer,"%s ",name); tfree(name); name = gettok_node(&t); /* get first attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get second attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get third attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get fourth attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok(&t); /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); (void) strcat(buffer, t); tfree(s->li_line); s->li_line = buffer; tfree(name); break; case 'q': name = gettok(&t); /* get refdes */ (void) sprintf(buffer,"%s ",name); tfree(name); name = gettok_node(&t); /* get first attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get second attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* get third attached netname */ (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); name = gettok_node(&t); /* this can be either a model name or a node name. */ /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); found = FALSE; if (*t) { name = gettok(&t); /* Now, is this a subcircuit model? */ for (wlsub = submod; wlsub; wlsub = wlsub->wl_next) { if (eq(name, wlsub->wl_word)) { (void) sprintf(buffer + strlen(buffer), "%s:%s ", subname, name); found = TRUE; break; } } if (!found) (void) sprintf(buffer + strlen(buffer), "%s ", name); tfree(name); } (void) strcat(buffer, t); tfree(s->li_line); s->li_line = buffer; break; default: tfree(buffer); break; } } return;}/*----------------------------------------------------------------------* * inp_numnodes returns the number of nodes (netnames) attached to the * component. * This is a spice-dependent thing. It should probably go somewhere * else, but... Note that we pretend that dependent sources and mutual * inductors have more nodes than they really do... *----------------------------------------------------------------------*/static intinp_numnodes(char c){ if (isupper(c)) c = tolower(c); switch (c) { case ' ': case '\t': case '.': case 'x': case '*': return (0); case 'b': return (2); case 'c': return (2); case 'd': return (2); case 'e': return (2); /* changed from 4 to 2 by SDB on 4.22.2003 to enable POLY */ case 'f': return (2); case 'g': return (2); /* changed from 4 to 2 by SDB on 4.22.2003 to enable POLY */ case 'h': return (2); case 'i': return (2); case 'j': return (3); case 'k': return (0); case 'l': return (2); case 'm': return (7); /* This means that 7 is the maximun number of nodes */ case 'o': return (4); case 'p': return (0); case 'q': return (4); case 'r': return (2); case 's': return (4); case 't': return (4); case 'u': return (3); case 'v': return (2); /* change 3 to 2 here to fix w bug, NCF 1/31/95 */ case 'w': return (2); case 'y': return (2); case 'z': return (3); default: fprintf(cp_err, "Warning: unknown device type: %c\n", c); return (2); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -