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

📄 device.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
	do {	    if (!j)		printf("%*.*s", LEFT_WIDTH, LEFT_WIDTH, p->wl_word);	    else		printf("%*s", LEFT_WIDTH, " ");	    k = dgen_for_n(dg, count, bogus2, 0, j);	    printf("\n");	    j += 1;	} while (k > 0);    }}int bogus1(dgen *dg){   printf(" %*s", DEV_WIDTH, "---------");    return 0;}int bogus2(dgen *dg){    printf(" %*s", DEV_WIDTH, "?????????");    return 0;}intprintvals(dgen *dg, IFparm *p, int i){    IFvalue	val;    int		n;    if (dg->flags & DGEN_INSTANCE)	(*ft_sim->askInstanceQuest)(ft_curckt->ci_ckt, dg->instance,	    p->id, &val, &val);    else	(*ft_sim->askModelQuest)(ft_curckt->ci_ckt, dg->model,	    p->id, &val, &val);    if (p->dataType & IF_VECTOR)	n = val.v.numValue;    else	n = 1;    if (((p->dataType & IF_VARTYPES) & ~IF_VECTOR) == IF_COMPLEX)	n *= 2;    if (i >= n) {	if (i == 0)	    printf("         -");	else	    printf("          ");	return 0;    }    if (p->dataType & IF_VECTOR) {        /* va: ' ' is no flag for %s */	switch ((p->dataType & IF_VARTYPES) & ~IF_VECTOR) {	    case IF_FLAG:		    printf(" % *d", DEV_WIDTH, val.v.vec.iVec[i]);		    break;	    case IF_INTEGER:		    printf(" % *d", DEV_WIDTH, val.v.vec.iVec[i]);		    break;	    case IF_REAL:		    printf(" % *.6g", DEV_WIDTH, val.v.vec.rVec[i]);		    break;	    case IF_COMPLEX:		    if (!(i % 2))			   printf(" % *.6g", DEV_WIDTH, val.v.vec.cVec[i / 2].real);		    else			   printf(" % *.6g", DEV_WIDTH, val.v.vec.cVec[i / 2].imag);		    break;	    case IF_STRING:		    printf(" %*.*s", DEV_WIDTH, DEV_WIDTH, val.v.vec.sVec[i]);		    break;	    case IF_INSTANCE:		    printf(" %*.*s", DEV_WIDTH, DEV_WIDTH, val.v.vec.uVec[i]);		    break;	    default:		    printf(" %*.*s", DEV_WIDTH, DEV_WIDTH, " ******** ");	}    } else {	switch ((p->dataType & IF_VARTYPES) & ~IF_VECTOR) {	    case IF_FLAG:		    printf(" % *d", DEV_WIDTH, val.iValue);		    break;	    case IF_INTEGER:		    printf(" % *d", DEV_WIDTH, val.iValue);		    break;	    case IF_REAL:		    printf(" % *.6g", DEV_WIDTH, val.rValue);		    break;	    case IF_COMPLEX:		    if (i % 2)			   printf(" % *.6g", DEV_WIDTH, val.cValue.real);		    else			   printf(" % *.6g", DEV_WIDTH, val.cValue.imag);		    break;	    case IF_STRING:		    printf(" %*.*s", DEV_WIDTH, DEV_WIDTH, val.sValue);		    break;	    case IF_INSTANCE:		    printf(" %*.*s", DEV_WIDTH, DEV_WIDTH, val.uValue);		    break;	    default:		    printf(" %*.*s", DEV_WIDTH, DEV_WIDTH, " ******** ");	}    }    return n - 1;}/* (old "show" command) * Display various device parameters.  The syntax of this command is *   show devicelist : parmlist * where devicelist can be "all", the name of a device, a string like r*, * which means all devices with names that begin with 'r', repeated one * or more times.   The parms are names of parameters that are (hopefully) * valid for all the named devices, or "all". */voidold_show(wordlist *wl){    wordlist *devs, *parms, *tw, *ww;    struct variable *v;    char *nn;    devs = wl;    while (wl && !eq(wl->wl_word, ":"))        wl = wl->wl_next;    if (!wl)        parms = NULL;    else {        if (wl->wl_prev)            wl->wl_prev->wl_next = NULL;        parms = wl->wl_next;        if (parms)            parms->wl_prev = NULL;    }    /* Now expand the devicelist... */    for (tw = NULL; devs; devs = devs->wl_next) {        inp_casefix(devs->wl_word);        tw = wl_append(tw, devexpand(devs->wl_word));    }    devs = tw;    for (tw = parms; tw; tw = tw->wl_next)        if (eq(tw->wl_word, "all"))            break;    if (tw)        parms = NULL;    /* This is a crock... */    if (!devs)        devs = cp_cctowl(ft_curckt->ci_devices);    out_init();    while (devs) {        out_printf("%s:\n", devs->wl_word);        if (parms) {            for (tw = parms; tw; tw = tw->wl_next) {                nn = copy(devs->wl_word);                v = (*if_getparam)(ft_curckt->ci_ckt,			&nn, tw->wl_word, 0, 0);		if (!v)		    v = (*if_getparam)(ft_curckt->ci_ckt,			    &nn, tw->wl_word, 0, 1);                if (v) {                    out_printf("\t%s =", tw->wl_word);                    for (ww = cp_varwl(v); ww; ww =                            ww->wl_next)                        out_printf(" %s", ww->wl_word);                    out_send("\n");                }            }        } else {            nn = copy(devs->wl_word);            v = (*if_getparam)(ft_curckt->ci_ckt, &nn, "all", 0, 0);	    if (!v)		v = (*if_getparam)(ft_curckt->ci_ckt, &nn, "all", 0, 1);            while (v) {                out_printf("\t%s =", v->va_name);                for (ww = cp_varwl(v); ww; ww = ww->wl_next)                    out_printf(" %s", ww->wl_word);                out_send("\n");                v = v->va_next;            }        }        devs = devs->wl_next;    }    return;}/* Alter a device parameter.  The new syntax here is *	alter @device[parameter] = expr *	alter device = expr *	alter device parameter = expr * expr must be real (complex isn't handled right now, integer is fine though, * but no strings ... for booleans, use 0/1). */voidcom_alter(wordlist *wl){    if (!wl) {	fprintf(cp_err, "usage: alter dev param = expression\n");	fprintf(cp_err, "  or   alter @dev[param] = expression\n");	fprintf(cp_err, "  or   alter dev = expression\n");	return;    }    com_alter_common(wl, 0);}voidcom_altermod(wordlist *wl){    com_alter_common(wl, 1);}voidcom_alter_common(wordlist *wl, int do_model){    wordlist *eqword, *words;    char *dev, *p;    char *param;    struct dvec *dv;    struct pnode *names;    if (!ft_curckt) {        fprintf(cp_err, "Error: no circuit loaded\n");        return;    }    words = wl;    while (words) {	p = words->wl_word;	eqword = words;	words = words->wl_next;	if (eq(p, "=")) {	    break;	}    }    if (!words) {	fprintf(cp_err, "Error: no assignment found.\n");	return;    }    /* device parameter = expr       device = expr       @dev[param] = expr     */    dev = NULL;    param = NULL;    words = wl;    while (words != eqword) {	p = words->wl_word;	if (param) {	    fprintf(cp_err, "Error: excess parameter name \"%s\" ignored.\n",		p);	} else if (dev) {	    param = words->wl_word;	} else if (*p == '@' || *p == '#') {	    dev = p + 1;	    p =strchr(p, '[');	    if (p) {		*p++ = 0;		param = p;		p =strchr(p, ']');		if (p)		    *p = 0;	    }	} else {	    dev = p;	}	words = words->wl_next;    }    if (!dev) {	fprintf(cp_err, "Error: no model or device name provided.\n" );	return;    }    words = eqword->wl_next;    names = ft_getpnames(words, FALSE);    if (!names) {	fprintf(cp_err, "Error: cannot parse new parameter value.\n");	return;    }    dv = ft_evaluate(names);    if (!dv)	return;    if (dv->v_length < 1) {	fprintf(cp_err, "Error: cannot evaluate new parameter value.\n");	return;    }    if_setparam(ft_curckt->ci_ckt, &dev, param, dv, do_model);    /* va: garbage collection for dv, if pnode names is no simple value */    if (names->pn_value==NULL && dv!=NULL) vec_free(dv);    free_pnode(names); /* free also dv, if pnode names is simple value */    return;}/* Given a device name, possibly with wildcards, return the matches. */static wordlist *devexpand(char *name){    wordlist *wl, *devices, *tw;    if (index(name, '*') ||strchr(name, '[') ||strchr(name, '?')) {        devices = cp_cctowl(ft_curckt->ci_devices);        for (wl = NULL; devices; devices = devices->wl_next)            if (cp_globmatch(name, devices->wl_word)) {                tw = alloc(struct wordlist);                if (wl) {                    wl->wl_prev = tw;                    tw->wl_next = wl;                    wl = tw;                } else                    wl = tw;                wl->wl_word = devices->wl_word;            }    } else if (cieq(name, "all")) {        wl = cp_cctowl(ft_curckt->ci_devices);    } else {        wl = alloc(struct wordlist);        wl->wl_word = name;    }    wl_sort(wl);    return (wl);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -