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

📄 compose.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
                step = *td;            } else if (cieq(var, "center")) {                centergiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                center = *td;            } else if (cieq(var, "span")) {                spangiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                span = *td;            } else if (cieq(var, "mean")) {                meangiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                mean = *td;            } else if (cieq(var, "sd")) {                sdgiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                sd = *td;            } else if (cieq(var, "lin")) {                lingiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                lin = *td;            } else if (cieq(var, "log")) {                loggiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                log = *td;            } else if (cieq(var, "dec")) {                decgiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                dec = *td;            } else if (cieq(var, "gauss")) {                gaussgiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                gauss = *td;            } else if (cieq(var, "random")) {                randmgiven = true;                if (!(td = ft_numparse(&val, false))) {                    fprintf(cp_err,                        "Error: bad parm %s = %s\n",                        var, val);                    return;                }                randm = *td;            } else if (cieq(var, "pool")) {                poolgiven = true;                pool = val;            }        }#ifdef LINT/* XXX Now, doesn't this look just a little suspicious */        if (centergiven || spangiven || meangiven || sdgiven ||                poolgiven)            j = k = l = m = q = inds = center + span + mean + sd +                    log + dec + gauss + randm + pool;#endif        /* Now see what we have... start and stop are pretty much         * compatible with everything...         */        if (stepgiven && (step == 0.0)) {            fprintf(cp_err, "Error: step cannot = 0.0\n");            return;        }        if (startgiven && stopgiven && (start > stop)) {            tt = start;            start = stop;            stop = tt;            reverse = true;        }        if (lingiven + loggiven + decgiven + randmgiven + gaussgiven                > 1) {            fprintf(cp_err,    "Error: can have at most one of (lin, log, dec, random, gauss)\n");            return;        } else if (lingiven + loggiven + decgiven + randmgiven +                gaussgiven == 0) {            /* Hmm, if we have a start, stop, and step we're ok. */            if (startgiven && stopgiven && stepgiven) {                lingiven = true;                lin = (stop - start) / step + 1;                stepgiven = false;  /* Problems below... */            } else {                fprintf(cp_err,"Error: either one of (lin, log, dec, random, gauss) must be given, or all\n");                fprintf(cp_err,            "\tof (start, stop, and step) must be given.\n");                return;            }        }        if (lingiven) {            /* Create a linear sweep... */            data = (double *) tmalloc(sizeof (double) * (int) lin);            if (stepgiven && startgiven && stopgiven) {                if (step != (stop - start) / lin * (reverse ?                        -1 : 1)) {                    fprintf(cp_err,                     "Warning: bad step -- should be %lg\n",                            (stop - start) / lin *                            (reverse ? -1 : 1));                    stepgiven = false;                }            }             if (!startgiven) {                if (stopgiven && stepgiven) {                    start = stop - step * lin;                } else if (stopgiven) {                    start = stop - lin;                } else {                    start = 0;                }                startgiven = true;            }            if (!stopgiven) {                if (stepgiven)                    stop = start + lin * step;                else                    stop = start + lin;                stopgiven = true;            }             if (!stepgiven) {                step = (stop - start) / lin;            }            if (reverse)                for (i = 0, tt = stop; i < lin;                        i++, tt -= step)                    data[i] = tt;            else                for (i = 0, tt = start; i < lin;                        i++, tt += step)                    data[i] = tt;            length = lin;        } else if (loggiven || decgiven) {            /* Create a log sweep... */        } else if (randmgiven) {            /* Create a set of random values... */        } else if (gaussgiven) {            /* Create a gaussian distribution... */        }    }    result = alloc(struct dvec);    ZERO(result, struct dvec);    result->v_name = copy(resname);    result->v_type = type;    result->v_flags = (realflag ? VF_REAL : VF_COMPLEX) | VF_PERMANENT;    if (realflag)        result->v_realdata = data;    else        result->v_compdata = cdata;    result->v_length = length;    result->v_numdims = 1;    result->v_dims[0] = length;    vec_new(result);    cp_addkword(CT_VECTOR, result->v_name);    return;}/* Copy the data from a vector into a buffer with larger dimensions. */static voiddimxpand(v, newdims, data)    struct dvec *v;    int *newdims;    double *data;{    complex *cdata = (complex *) data;    bool realflag = isreal(v);    int i, j, o, n, t, u;    int ncount[MAXDIMS], ocount[MAXDIMS];    for (i = 0; i < MAXDIMS; i++)        ncount[i] = ocount[i] = 0;        for (;;) {        for (o = n = i = 0; i < v->v_numdims; i++) {            for (j = i, t = u = 1; j < v->v_numdims; j++) {                t *= v->v_dims[j];                u *= newdims[j];            }            o += ocount[i] * t;            n += ncount[i] * u;        }        if (realflag) {            data[n] = v->v_realdata[o];        } else {            realpart(&cdata[n]) = realpart(&v->v_compdata[o]);            imagpart(&cdata[n]) = imagpart(&v->v_compdata[o]);        }        /* Now find the next index element... */        for (i = v->v_numdims - 1; i >= 0; i--) {            if ((ocount[i] < v->v_dims[i] - 1) &&                    (ncount[i] < newdims[i] - 1)) {                ocount[i]++;                ncount[i]++;                break;            } else                ocount[i] = ncount[i] = 0;        }        if (i < 0)            break;    }    return;}

⌨️ 快捷键说明

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