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

📄 options.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Wayne A. Christopher, U. C. Berkeley CAD Group**********//* * The user-supplied routine to deal with variables. Most variables we * don't use often, so just call cp_getvar when they are needed. Spice * variables, though, and a few commonly used ones are dealt with here. */#include "spice.h"#include "cpdefs.h"#include "ftedefs.h"#include "ftedata.h"#include "fteinp.h"#include "suffix.h"bool ft_acctprint = false, ft_listprint = false;bool ft_nodesprint = false, ft_optsprint = false;/* The user-supplied routine to query the values of variables. This * recognises the $&varname notation, and also searches the values of * plot and circuit environment variables. */struct variable *cp_enqvar(word)    char *word;{    struct dvec *d;    struct variable *vv, *tv;    struct plot *pl;    int i;    if (*word == '&') {        word++;        d = vec_get(word);        if (d) {            if (d->v_length == 1) {                vv = alloc(struct variable);                vv->va_name = copy(word);                vv->va_next = NULL;                vv->va_type = VT_REAL;                if (isreal(d)) {                    vv->va_real = d->v_realdata[0];                } else {                    vv->va_real =                         realpart(&d->v_compdata[0]);                }            } else {                vv = alloc(struct variable);                vv->va_next = NULL;                vv->va_name = copy(word);                vv->va_type = VT_LIST;                vv->va_vlist = NULL;                for (i = d->v_length - 1; i >= 0; i--) {                    tv = alloc(struct variable);                    tv->va_type = VT_REAL;                    if (isreal(d)) {                        tv->va_real = d->v_realdata[i];                    } else {                        tv->va_real =                             realpart(&d->v_compdata[i]);                    }                    tv->va_next = vv->va_vlist;                    vv->va_vlist = tv;                }            }            if (d->v_link2)                fprintf(cp_err,     "Warning: only one vector may be accessed with the $& notation.\n");            return (vv);        } else            return (NULL);    }     if (plot_cur) {        for (vv = plot_cur->pl_env; vv; vv = vv->va_next)            if (eq(vv->va_name, word))                break;        if (vv)            return (vv);        if (eq(word, "curplotname")) {            vv = alloc(struct variable);	    vv->va_next = NULL;            vv->va_name = word;            vv->va_type = VT_STRING;            vv->va_string = copy(plot_cur->pl_name);        } else if (eq(word, "curplottitle")) {            vv = alloc(struct variable);	    vv->va_next = NULL;            vv->va_name = word;            vv->va_type = VT_STRING;            vv->va_string = copy(plot_cur->pl_title);        } else if (eq(word, "curplotdate")) {            vv = alloc(struct variable);	    vv->va_next = NULL;            vv->va_name = word;            vv->va_type = VT_STRING;            vv->va_string = copy(plot_cur->pl_date);        } else if (eq(word, "curplot")) {            vv = alloc(struct variable);	    vv->va_next = NULL;            vv->va_name = word;            vv->va_type = VT_STRING;            vv->va_string = copy(plot_cur->pl_typename);        } else if (eq(word, "plots")) {            vv = alloc(struct variable);	    vv->va_next = NULL;	    vv->va_vlist = NULL;            vv->va_name = word;            vv->va_type = VT_LIST;	    vv->va_vlist = NULL;            for (pl = plot_list; pl; pl = pl->pl_next) {                tv = alloc(struct variable);                tv->va_type = VT_STRING;                tv->va_string = copy(pl->pl_typename);                tv->va_next = vv->va_vlist;                vv->va_vlist = tv;            }        }        if (vv) {            return (vv);	}    }    if (ft_curckt) {        for (vv = ft_curckt->ci_vars; vv; vv = vv->va_next)            if (eq(vv->va_name, word))                break;        if (vv)            return (vv);    }    return (NULL);}/* Return the plot and ckt env vars, $plots, and $curplot{name,title,date,} */voidcp_usrvars(v1, v2)    struct variable **v1, **v2;{    struct variable *v, *tv;    if (plot_cur)        v =  plot_cur->pl_env;    else        v = NULL;    if (tv = cp_enqvar("plots")) {        tv->va_next = v;        v = tv;    }    if (tv = cp_enqvar("curplot")) {        tv->va_next = v;        v = tv;    }    if (tv = cp_enqvar("curplottitle")) {        tv->va_next = v;        v = tv;    }    if (tv = cp_enqvar("curplotname")) {        tv->va_next = v;        v = tv;    }    if (tv = cp_enqvar("curplotdate")) {        tv->va_next = v;        v = tv;    }    *v1 = v;    if (ft_curckt)        *v2 = ft_curckt->ci_vars;    else        *v2 = NULL;    return;}/* Extract the .option lines from the deck */struct line *inp_getopts(deck)    struct line *deck;{    struct line *last = NULL, *opts = NULL, *dd, *next = NULL;    for (dd = deck->li_next; dd; dd = next) {        next = dd->li_next;        if (ciprefix(".opt", dd->li_line)) {            inp_casefix(dd->li_line);            if (last)                last->li_next = dd->li_next;            else                deck->li_next = dd->li_next;            dd->li_next = opts;            opts = dd;        } else            last = dd;    }    return (opts);}static void setdb();/* The one variable that we consider read-only so far is plots.  The ones * that are 'dontrecord' are curplottitle, curplotname, and curplotdate. * Also things already in the plot env are 'dontrecord'. */intcp_usrset(var, isset)    struct variable *var;    bool isset;{    char val[BSIZE_SP];    char *vv, *s;    struct variable *tv;    int iv;    double dv;    bool bv;    if (eq(var->va_name, "debug")) {        if (var->va_type == VT_BOOL) {            cp_debug = ft_simdb = ft_parsedb = ft_evdb = ft_vecdb =                ft_grdb = ft_gidb = ft_controldb = isset;        } else if (var->va_type == VT_LIST) {            for (tv = var->va_vlist; tv; tv = tv->va_next)                if (var->va_type != VT_STRING)                    fprintf(cp_err,                    "Error: bad type for debug var\n");                else                    setdb(tv->va_string);        } else if (var->va_type == VT_STRING) {            setdb(var->va_string);        } else            fprintf(cp_err, "Error: bad type for debug var\n");#ifndef FTEDEBUG        fprintf(cp_err, "Warning: %s compiled without debug messages\n",                cp_program);#endif    } else if (eq(var->va_name, "program")) {        cp_program = copy(var->va_string);    } else if (eq(var->va_name, "rawfile")) {        ft_rawfile = copy(var->va_string);    } else if (eq(var->va_name, "acct")) {        ft_acctprint = isset;    } else if (eq(var->va_name, "list")) {        ft_listprint = isset;    } else if (eq(var->va_name, "nopage")) {        ft_nopage = isset;    } else if (eq(var->va_name, "nomod")) {        ft_nomod = isset;    } else if (eq(var->va_name, "node")) {        ft_nodesprint = isset;    } else if (eq(var->va_name, "opts")) {        ft_optsprint = isset;    } else if (eq(var->va_name, "strictnumparse")) {        ft_strictnumparse = isset;    } else if (eq(var->va_name, "rawfileprec")) {        if ((var->va_type == VT_BOOL) && (isset == false))            raw_prec = -1;        else if (var->va_type == VT_REAL)            raw_prec = var->va_real;        else if (var->va_type == VT_NUM)            raw_prec = var->va_num;        else            fprintf(cp_err, "Bad 'rawfileprec' \"%s\"\n", var->va_name);    } else if (eq(var->va_name, "numdgt")) {        if ((var->va_type == VT_BOOL) && (isset == false))            cp_numdgt = -1;        else if (var->va_type == VT_REAL)            cp_numdgt = var->va_real;        else if (var->va_type == VT_NUM)            cp_numdgt = var->va_num;        else            fprintf(cp_err, "Excuse me??\n");    } else if (eq(var->va_name, "unixcom")) {#ifdef HAS_SYSTEM        cp_dounixcom = isset;        if (isset) {            s = getenv("PATH");            if (s)                cp_rehash(s, true);            else                fprintf(cp_err, "Warning: no PATH in environment.\n");        }#else        fprintf(cp_err, "Note: 'unixcom' will not work with this system.\n");#endif    } else if (eq(var->va_name, "units") && (var->va_type == VT_STRING)) {        if (isset && ((*var->va_string == 'd') ||                (*var->va_string == 'D')))            cx_degrees = true;        else            cx_degrees = false;    } else if (eq(var->va_name, "curplot")) {        if (var->va_type == VT_STRING)            plot_setcur(var->va_string);        else            fprintf(cp_err, "Error: plot name not a string\n");        return (US_DONTRECORD);    } else if (eq(var->va_name, "curplotname")) {        if (plot_cur && (var->va_type == VT_STRING))            plot_cur->pl_name = copy(var->va_string);        else            fprintf(cp_err, "Error: can't set plot name\n");        return (US_DONTRECORD);    } else if (eq(var->va_name, "curplottitle")) {        if (plot_cur && (var->va_type == VT_STRING))            plot_cur->pl_title = copy(var->va_string);        else            fprintf(cp_err, "Error: can't set plot title\n");        return (US_DONTRECORD);    } else if (eq(var->va_name, "curplotdate")) {        if (plot_cur && (var->va_type == VT_STRING))            plot_cur->pl_date = copy(var->va_string);        else            fprintf(cp_err, "Error: can't set plot date\n");        return (US_DONTRECORD);    } else if (eq(var->va_name, "plots")) {        return (US_READONLY);    }    if (plot_cur)        for (tv = plot_cur->pl_env; tv; tv = tv->va_next)            if (eq(tv->va_name, var->va_name))                return (US_READONLY);    /*    if (ft_curckt)        for (tv = ft_curckt->ci_vars; tv; tv = tv->va_next)            if (eq(tv->va_name, var->va_name))                return (US_READONLY);    */    if (ft_nutmeg)        return (US_OK);    /* Now call the interface option routine. */    switch (var->va_type) {        case VT_BOOL:            if (var->va_bool) {                /*val[0] = '\0';*/                bv = true;                vv = (char *) &bv;                /*break;*/            } else {                bv = false;                vv = (char *) &bv;            }	    break;        case VT_STRING:            (void) strcpy(val, var->va_string);            vv = val;            break;        case VT_NUM:            /*(void) sprintf(val, "%d", var->va_num);*/            iv = var->va_num;            vv = (char *) &iv;            break;        case VT_REAL:            /*(void) strcpy(val, printnum(var->va_real));*/            dv = var->va_real;            vv = (char *) &dv;            break;        case VT_LIST:            /* if_option can't handle lists anyway. */	    vv = NULL;            break;        default:            fprintf(cp_err,             "cp_usrset: Internal Error: Bad var type %d\n",                    var->va_type);	    return (0);    }    if (ft_curckt) {        if (if_option(ft_curckt->ci_ckt, var->va_name, var->va_type, vv))	    return US_SIMVAR;    } else if (if_option(NULL, var->va_name, var->va_type, vv))	    return US_NOSIMVAR;    return (US_OK);}static voidsetdb(str)    char *str;{    if (eq(str, "siminterface"))        ft_simdb = true;    else if (eq(str, "cshpar"))        cp_debug = true;    else if (eq(str, "parser"))        ft_parsedb = true;    else if (eq(str, "eval"))        ft_evdb = true;    else if (eq(str, "vecdb"))        ft_vecdb = true;    else if (eq(str, "graf"))        ft_grdb = true;    else if (eq(str, "ginterface"))        ft_gidb = true;    else if (eq(str, "control"))        ft_controldb = true;    else if (eq(str, "async"))        ft_asyncdb = true;    else        fprintf(cp_err, "Warning: no such debug class %s\n", str);    return;}

⌨️ 快捷键说明

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