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

📄 shyu.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.**********//* Do a run of the circuit, of the given type. Type "resume" is special -- * it means to resume whatever simulation that was in progress. The * return value of this routine is 0 if the exit was ok, and 1 if there was * a reason to interrupt the circuit (interrupt typed at the keyboard, * error in the simulation, etc). args should be the entire command line, * e.g. "tran 1 10 20 uic" */#include "spice.h"#include "cpdefs.h"#include "ftedefs.h"#include "fteinp.h"#include "fteconst.h"#include "devdefs.h"#include "inpdefs.h"#include "iferrmsg.h"#include "ifsim.h"#include "util.h"#include "suffix.h"intif_sens_run(t,args,tab)char *t;wordlist *args;INPtables *tab;{    GENERIC *ckt = (GENERIC *) t;    GENERIC *senseJob;    GENERIC *acJob;    GENERIC *opJob;    GENERIC *dcJob;    GENERIC *tranJob;    GENERIC *foo;    card *current;    IFvalue ptemp;    IFvalue *parm;    char buf[BSIZE_SP];    int err;    char *token;    char *steptype;    char *name;    char *line;    struct line deck;    int i;    int j;    int error;    int save ;    int flag = 0;    int which = -1;    (void) sprintf(buf, ".%s", wl_flatten(args));    deck.li_next = deck.li_actual = NULL;    deck.li_error = NULL;    deck.li_linenum = 0;    deck.li_line = buf;    current = (card *) &deck;    line = current->line;    INPgetTok(&line,&token,1);    if(ft_curckt->ci_specTask) {        err=(*(ft_sim->deleteTask))(ft_curckt->ci_ckt,        ft_curckt->ci_specTask);        if(err) {            ft_sperror(err,"deleteTask");            return(0); /* temporary */        }    }    err = (*(ft_sim->newTask))(ft_curckt->ci_ckt,	    (GENERIC **) &(ft_curckt->ci_specTask),"special");    if(err) {        ft_sperror(err,"newTask");        return(0); /* temporary */    }    for(j=0;j<ft_sim->numAnalyses;j++) {        if(strcmp(ft_sim->analyses[j]->name,"options")==0) {            which = j;            break;        }    }     if(which != -1) {        err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"options",		(GENERIC **) &(ft_curckt->ci_specOpt),ft_curckt->ci_specTask);        if(err) {            ft_sperror(err,"createOptions");            return(0);/* temporary */        }        ft_curckt->ci_curOpt  = ft_curckt->ci_specOpt;    }     else ;    { /* in DEEP trouble */    }    ft_curckt->ci_curTask = ft_curckt->ci_specTask;    which = -1;    for(j=0;j<ft_sim->numAnalyses;j++) {        if(strcmp(ft_sim->analyses[j]->name,"SEN")==0) {            which = j;            break;        }    }     if(which != -1) {        err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"sense",        &(senseJob),ft_curckt->ci_specTask);        if(err) {            ft_sperror(err,"createSense");            return(0);/* temporary */        }    }     else{         current->error = INPerrCat(current->error,INPmkTemp(        "sensetivity analysis unsupported\n"));        return(0);    }    save = which;    INPgetTok(&line,&token,1);    if(strcmp(token ,"ac")==0){        which = -1;        for(j=0;j<ft_sim->numAnalyses;j++) {            if(strcmp(ft_sim->analyses[j]->name,"AC")==0) {                which = j;                break;            }        }         if(which != -1) {            err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"acan",            &(acJob),ft_curckt->ci_specTask);            if(err) {                ft_sperror(err,"createAC"); /* or similar error message */                return(0);            }        }         else{             current->error = INPerrCat(current->error,INPmkTemp(            "ac analysis unsupported\n"));        }        INPgetTok(&line,&steptype,1); /* get DEC, OCT, or LIN */        ptemp.iValue=1;        error = INPapName(ckt,which,acJob,steptype,&ptemp);        if(error) current->error = INPerrCat(current->error,        INPerror(error));        parm=INPgetValue(ckt,&line,IF_INTEGER,tab);/* number of points*/        error = INPapName(ckt,which,acJob,"numsteps",parm);        if(error) current->error = INPerrCat(current->error,        INPerror(error));        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* fstart */        error = INPapName(ckt,which,acJob,"start",parm);        if(error) current->error = INPerrCat(current->error,        INPerror(error));        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* fstop */        error = INPapName(ckt,which,acJob,"stop",parm);        if(error) current->error = INPerrCat(current->error,        INPerror(error));    }    if(strcmp(token ,"op")==0){        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"DCOP")==0) {                which=i;                break;            }        }        if(which == -1) {            current->error = INPerrCat(current->error,INPmkTemp(            "DC operating point analysis unsupported\n"));        }        else {            err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"dcop",                     &(opJob),ft_curckt->ci_specTask);            if(err) {                ft_sperror(err,"createOP"); /* or similar error message */                return(0);            }        }    }    if(strcmp(token ,"dc")==0){        /* .dc SRC1NAME Vstart1 Vstop1 Vinc1 [SRC2NAME Vstart2 */        /*        Vstop2 Vinc2 */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"DCTransfer")==0) {                which=i;                break;            }        }        if(which==-1) {            current->error = INPerrCat(current->error,INPmkTemp(            "DC transfer curve analysis unsupported\n"));        }        err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"DCtransfer",                 &(dcJob),ft_curckt->ci_specTask);        if(err) {            ft_sperror(err,"createOP"); /* or similar error message */            return(0);        }        INPgetTok(&line,&name,1);        INPinsert(&name,tab);        ptemp.uValue=name;        error = INPapName(ckt,which,dcJob,"name1",&ptemp);        if(error) current->error = INPerrCat(current->error,INPerror(error));        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstart1 */        error = INPapName(ckt,which,dcJob,"start1",parm);        if(error) current->error = INPerrCat(current->error,INPerror(error));        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstop1 */        error = INPapName(ckt,which,dcJob,"stop1",parm);        if(error) current->error = INPerrCat(current->error,INPerror(error));        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vinc1 */        error = INPapName(ckt,which,dcJob,"step1",parm);        if(error) current->error = INPerrCat(current->error,INPerror(error));        if(*line) {            if(*line == 'd') goto next;            INPgetTok(&line,&name,1);            INPinsert(&name,tab);            ptemp.uValue=name;            error = INPapName(ckt,which,dcJob,"name2",&ptemp);            if(error) current->error= INPerrCat(current->error,INPerror(error));            parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstart1 */            error = INPapName(ckt,which,dcJob,"start2",parm);            if(error) current->error= INPerrCat(current->error,INPerror(error));            parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstop1 */            error = INPapName(ckt,which,dcJob,"stop2",parm);            if(error) current->error= INPerrCat(current->error,INPerror(error));            parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vinc1 */            error = INPapName(ckt,which,dcJob,"step2",parm);            if(error) current->error= INPerrCat(current->error,INPerror(error));        }    }    if(strcmp(token ,"tran")==0){        which = -1;        for(j=0;j<ft_sim->numAnalyses;j++) {            if(strcmp(ft_sim->analyses[j]->name,"TRAN")==0) {                which = j;                break;            }        }         if(which != -1) {            err = (*(ft_sim->newAnalysis))(ft_curckt->ci_ckt,which,"tranan",            &(tranJob),ft_curckt->ci_specTask);            if(err) {                ft_sperror(err,"createTRAN");                 return(0);            }        }         else{             current->error = INPerrCat(current->error,INPmkTemp(            "transient analysis unsupported\n"));        }        parm=INPgetValue(ckt,&line,IF_REAL,tab);/* Tstep */        error = INPapName(ckt,which,tranJob,"tstep",parm);        if(error) current->error = INPerrCat(current->error,        INPerror(error));        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* Tstop*/        error = INPapName(ckt,which,tranJob,"tstop",parm);        if(error) current->error = INPerrCat(current->error,        INPerror(error));        if(*line){            if(*line == 'd') goto next;            if(*line == 'u') goto uic;            parm=INPgetValue(ckt,&line,IF_REAL,tab);/* Tstart */            error = INPapName(ckt,which,tranJob,"tstart",parm);            if(error) current->error = INPerrCat(current->error,            INPerror(error));            if(*line == 'u') goto uic;            parm=INPgetValue(ckt,&line,IF_REAL,tab);/* Tmax */            error = INPapName(ckt,which,tranJob,"tmax",parm);            if(error) current->error = INPerrCat(current->error,            INPerror(error));uic:                        if(*line == 'u') {                INPgetTok(&line,&name,1);                if(strcmp(name,"uic")==0) {                    ptemp.iValue = 1;                    error = INPapName(ckt,which,tranJob,"tstart",&ptemp);                    if(error) current->error = INPerrCat(current->error,                    INPerror(error));                }            }        }    }next:              while(*line) { /* read the entire line */        if(flag){            INPgetTok(&line,&token,1);        }        else{            flag = 1;        }        for(i=0;i<ft_sim->analyses[save]->numParms;i++) {            /* find the parameter */            if(0==strcmp(token ,            ft_sim->analyses[save]->analysisParms[i].                keyword) ){                /* found it, analysis which, parameter i */                if(ft_sim->analyses[save]->analysisParms[i].                    dataType & IF_FLAG) {                    /* one of the keywords! */                    ptemp.iValue = 1;                    error = (*(ft_sim->setAnalysisParm))(ckt,                        senseJob, ft_sim->analyses[save]->                        analysisParms[i].id,&ptemp,(IFvalue*)NULL);                    if(error) current->error = INPerrCat(                    current->error, INPerror(error));                }                 else {                    parm = INPgetValue(ckt,&line,ft_sim->                        analyses[save]->analysisParms[i].                        dataType,tab);                    error = (*(ft_sim->setAnalysisParm))(ckt,                        senseJob, ft_sim->analyses[save]->                        analysisParms[i].id,parm,(IFvalue*)NULL);                    if(error) current->error = INPerrCat(                    current->error, INPerror(error));                }                break;            }        }        if(i==ft_sim->analyses[save]->numParms) {            /* didn't find it! */            current->error = INPerrCat(current->error,INPmkTemp(            " Error: unknown parameter on .sens - ignored \n"));        }    }    if((err = (*(ft_sim->doAnalyses))(ckt, 1, ft_curckt->ci_curTask))!=OK){        ft_sperror(err, "doAnalyses");        return(0);/* temporary */    }    return(0);}

⌨️ 快捷键说明

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