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

📄 inp2dot.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
        parm = INPgetValue(ckt,&line,IF_NODE,tab);         GCA(INPapName,(ckt,which,foo,"nodek",parm))        INPgetTok(&line,&steptype,1); /* get V or I */        ptemp.iValue=1;        GCA(INPapName,(ckt,which,foo,steptype,&ptemp))        INPgetTok(&line,&steptype,1); /* get POL, ZER, or PZ */        ptemp.iValue=1;        GCA(INPapName,(ckt,which,foo,steptype,&ptemp))        return(0);    } else 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,"DC")==0) {                which=i;                break;            }        }        if(which==-1) {            LITERR("DC transfer curve analysis unsupported\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"DC transfer characteristic",&foo, task))        INPgetTok(&line,&name,1);        INPinsert(&name,tab);        ptemp.uValue=name;        GCA(INPapName,(ckt,which,foo,"name1",&ptemp))        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstart1 */        GCA(INPapName,(ckt,which,foo,"start1",parm))        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstop1 */        GCA(INPapName,(ckt,which,foo,"stop1",parm))        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vinc1 */        GCA(INPapName,(ckt,which,foo,"step1",parm))        if(*line) {            INPgetTok(&line,&name,1);            INPinsert(&name,tab);            ptemp.uValue=name;            GCA(INPapName,(ckt,which,foo,"name2",&ptemp))            parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstart1 */            GCA(INPapName,(ckt,which,foo,"start2",parm))            parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vstop1 */            GCA(INPapName,(ckt,which,foo,"stop2",parm))            parm = INPgetValue(ckt,&line,IF_REAL,tab); /* vinc1 */            GCA(INPapName,(ckt,which,foo,"step2",parm))        }        return(0);    } else if ( (strcmp(token,".tf")==0)){        /* .tf v( node1, node2 ) src */        /* .tf vsrc2             src */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"TF")==0) {                which=i;                break;            }        }        if(which==-1) {            LITERR("Transfer Function analysis unsupported.\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"Transfer Function",&foo,task))        INPgetTok(&line,&name,0);        /* name is now either V or I or a serious error */        if(*name == 'v' && strlen(name)==1) {            if(*line != '(' /* match) */ ) {                 /* error, bad input format */            }            INPgetTok(&line,&nname1,0);            INPtermInsert(ckt,&nname1,tab,&node1);            ptemp.nValue=(IFnode)node1;            GCA(INPapName,(ckt,which,foo,"outpos",&ptemp))            if(*line != /* match ( */ ')') {                INPgetTok(&line,&nname2,1);                INPtermInsert(ckt,&nname2,tab,&node2);                ptemp.nValue=(IFnode)node2;                GCA(INPapName,(ckt,which,foo,"outneg",&ptemp))                ptemp.sValue = (char *)                        MALLOC(sizeof(char)*(5+strlen(nname1)+strlen(nname2)));                (void)sprintf(ptemp.sValue,"V(%s,%s)",nname1,nname2);                GCA(INPapName,(ckt,which,foo,"outname",&ptemp))            } else {                ptemp.nValue=(IFnode)gnode;                GCA(INPapName,(ckt,which,foo,"outneg",&ptemp))                ptemp.sValue = (char *)MALLOC(sizeof(char)*(4+strlen(nname1)));                (void)sprintf(ptemp.sValue,"V(%s)",nname1);                GCA(INPapName,(ckt,which,foo,"outname",&ptemp))            }        } else if(*name == 'i' && strlen(name)==1) {            INPgetTok(&line,&name,1);            INPinsert(&name,tab);            ptemp.uValue=name;            GCA(INPapName,(ckt,which,foo,"outsrc",&ptemp))        } else {	    LITERR("Syntax error: voltage or current expected.\n")	    return 0;	}        INPgetTok(&line,&name,1);        INPinsert(&name,tab);        ptemp.uValue=name;        GCA(INPapName,(ckt,which,foo,"insrc",&ptemp))        return(0);    } else if ( (strcmp(token,".tran")==0)){        /* .tran Tstep Tstop <Tstart <Tmax> > <UIC> */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"TRAN")==0) {                which=i;                break;            }        }        if(which == -1) {            LITERR("Transient analysis unsupported.\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"Transient Analysis",&foo, task))        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* Tstep */        GCA(INPapName,(ckt,which,foo,"tstep",parm))        parm = INPgetValue(ckt,&line,IF_REAL,tab); /* Tstop */        GCA(INPapName,(ckt,which,foo,"tstop",parm))        if(*line) {            dtemp = INPevaluate(&line,&error,1);  /* tstart? */            if(error==0) {                ptemp.rValue=dtemp;                GCA(INPapName,(ckt,which,foo,"tstart",&ptemp))                dtemp = INPevaluate(&line,&error,1);  /* tmax? */                if(error==0) {                    ptemp.rValue=dtemp;                    GCA(INPapName,(ckt,which,foo,"tmax",&ptemp))                }            }        }        if(*line) {            INPgetTok(&line,&word,1); /* uic? */            if(strcmp(word,"uic")==0) {                ptemp.iValue=1;                GCA(INPapName,(ckt,which,foo,"uic",&ptemp))            } else {                LITERR(" Error: unknown parameter on .tran - ignored\n")            }        }        return(0);    } else if ( (strcmp(token,".subckt")==0) ||            (strcmp(token,".ends")==0)  ){        /* not yet implemented - warn & ignore */        LITERR(" Warning: Subcircuits not yet implemented - ignored \n")        return(0);    } else if ( (strcmp(token,".end")==0)){        /* .end - end of input */        /* not allowed to pay attention to additional input - return */        return(1);        /*NOTREACHED*/    } else if ( (strcmp(token,".options")==0) ||            (strcmp(token,".option")==0) ||            (strcmp(token,".opt")==0) ){        /* .option - specify program options - rather complicated */        /* use a subroutine to handle all of them to keep this */        /* subroutine managable */        INPdoOpts(ckt,ft_curckt->ci_curOpt,current,tab);        return(0);    } else if (strcmp(token, ".sens") == 0) {        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"SENS")==0) {                which=i;                break;            }        }        if(which==-1) {            LITERR("Sensitivity unsupported.\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"Sensitivity Analysis",&foo, task))	/* Format is:	 *	.sens <output>	 *	+ [ac [dec|lin|oct] <pts> <low freq> <high freq> | dc ]	 */	/* Get the output voltage or current */        INPgetTok(&line,&name,0);        /* name is now either V or I or a serious error */        if (*name == 'v' && strlen(name) == 1) {            if (*line != '(' /* match) */) {                 LITERR("Syntax error: '(' expected after 'v'\n");		return 0;            }            INPgetTok(&line, &nname1, 0);            INPtermInsert(ckt, &nname1, tab, &node1);            ptemp.nValue=(IFnode)node1;            GCA(INPapName,(ckt,which,foo,"outpos",&ptemp))            if(*line != /* match ( */ ')') {                INPgetTok(&line, &nname2, 1);                INPtermInsert(ckt, &nname2, tab, &node2);                ptemp.nValue = (IFnode)node2;                GCA(INPapName,(ckt,which,foo,"outneg",&ptemp))                ptemp.sValue = (char *)                        MALLOC(sizeof(char)*(5+strlen(nname1)+strlen(nname2)));                (void)sprintf(ptemp.sValue,"V(%s,%s)",nname1,nname2);                GCA(INPapName,(ckt,which,foo,"outname",&ptemp))            } else {                ptemp.nValue=(IFnode)gnode;                GCA(INPapName,(ckt,which,foo,"outneg",&ptemp))                ptemp.sValue = (char *)MALLOC(sizeof(char)*(4+strlen(nname1)));                (void)sprintf(ptemp.sValue,"V(%s)",nname1);                GCA(INPapName,(ckt,which,foo,"outname",&ptemp))            }        } else if (*name == 'i' && strlen(name) == 1) {            INPgetTok(&line,&name,1);            INPinsert(&name,tab);            ptemp.uValue=name;            GCA(INPapName,(ckt,which,foo,"outsrc",&ptemp))        } else {	    LITERR("Syntax error: voltage or current expected.\n")	    return 0;	}	INPgetTok(&line,&name,1);	if (name && !strcmp(name, "pct")) {		ptemp.iValue = 1;                GCA(INPapName,(ckt,which,foo,"pct",&ptemp))		INPgetTok(&line,&name,1);	}	if (name && !strcmp(name, "ac")) {		INPgetTok(&line,&steptype,1); /* get DEC, OCT, or LIN */		ptemp.iValue=1;		GCA(INPapName,(ckt,which,foo,steptype,&ptemp))		parm=INPgetValue(ckt,&line,IF_INTEGER,tab);/* number of points*/		GCA(INPapName,(ckt,which,foo,"numsteps",parm))		parm = INPgetValue(ckt,&line,IF_REAL,tab); /* fstart */		GCA(INPapName,(ckt,which,foo,"start",parm))		parm = INPgetValue(ckt,&line,IF_REAL,tab); /* fstop */		GCA(INPapName,(ckt,which,foo,"stop",parm))		return(0);	} else if (name && *name && strcmp(name, "dc")) {		/* Bad flag */	        LITERR("Syntax error: 'ac' or 'dc' expected.\n")	        return 0;	}	return(0);    }#ifdef HAS_SENSE2    else if ( (strcmp(token,".sens2")==0)) {        /* .sens {AC} {DC} {TRAN} [dev=nnn parm=nnn]* */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"SENS2")==0) {                which=i;                break;            }        }        if(which == -1) {            LITERR("Sensitivity-2 analysis unsupported\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"Sensitivity-2 Analysis",&foo, task))        while(*line) { /* read the entire line */            INPgetTok(&line,&token,1);            for(i=0;i<ft_sim->analyses[which]->numParms;i++) {                /* find the parameter */                if(0==strcmp(token ,                        ft_sim->analyses[which]->analysisParms[i].                        keyword) ){                    /* found it, analysis which, parameter i */                    if(ft_sim->analyses[which]->analysisParms[i].                            dataType & IF_FLAG) {                        /* one of the keywords! */                        ptemp.iValue = 1;                        error = (*(ft_sim->setAnalysisParm))(ckt,                                foo, ft_sim->analyses[which]->                                analysisParms[i].id,&ptemp,(IFvalue*)NULL);                        if(error) current->error = INPerrCat(                                current->error, INPerror(error));                    } else {                        parm = INPgetValue(ckt,&line,ft_sim->                                analyses[which]->analysisParms[i].                                dataType,tab);                        error = (*(ft_sim->setAnalysisParm))(ckt,                                foo, ft_sim->analyses[which]->                                analysisParms[i].id,parm,(IFvalue*)NULL);                        if(error) current->error = INPerrCat(                                current->error, INPerror(error));                                            }                    break;                }            }            if(i==ft_sim->analyses[which]->numParms) {                /* didn't find it! */                LITERR(" Error: unknown parameter on .sens-ignored \n")            }        }        return(0);    }#endif    else if ( (strcmp(token,".probe")==0)) {	/* Maybe generate a "probe" format file in the future. */	return 0;    }    LITERR(" unimplemented control card - error \n")    return(0);}

⌨️ 快捷键说明

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