📄 device.c
字号:
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 + -