⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subckt.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
	            }    }    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 + -