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

📄 inp2dot.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1988 Thomas L. Quarles**********/#include "spice.h"#include <stdio.h>#include "ifsim.h"#include "inpdefs.h"#include "inpmacs.h"#include "fteext.h"#include "util.h"#include "suffix.h"intINP2dot(ckt,tab,current,task,gnode)    GENERIC *ckt;    INPtables *tab;    card *current;    GENERIC *task;    GENERIC *gnode;{    /* .<something> Many possibilities */char *line; /* the part of the current line left to parse */char *name; /* the resistor's name */char *nname1;   /* the first node's name */char *nname2;   /* the second node's name */char *point;GENERIC *node1; /* the first node's node pointer */GENERIC *node2; /* the second node's node pointer */int error;      /* error code temporary */IFvalue ptemp;  /* a value structure to package resistance into */IFvalue *parm;  /* a pointer to a value struct for function returns */IFparm *prm;    /* pointer to parameter to search through array */char *token;    /* a token from the line */int which;      /* which analysis we are performing */int found;int i;          /* generic loop variable */GENERIC *foo;   /* pointer to analysis */int length;     /* length of a name */char *steptype; /* ac analysis, type of stepping function */double dtemp;   /* random double precision temporary */char *word;     /* something to stick a word of input into */    line = current->line;    INPgetTok(&line,&token,1);    if (strcmp(token,".model")==0) {        /* don't have to do anything, since models were all done in         * pass 1          */        return(0);    } else if ((strcmp(token,".width") == 0) ||            strcmp(token,".print") == 0 ||            strcmp(token,".plot") == 0) {        /* obsolete - ignore */        LITERR(" Warning: obsolete control card - ignored \n")        return(0);    } else if ( (strcmp(token,".temp")==0)){        /* .temp temp1 temp2 temp3 temp4 ..... */        /* not yet implemented - warn & ignore */        LITERR(" Warning: .TEMP card obsolete - use .options TEMP and TNOM\n")        return(0);    } else if ( (strcmp(token,".op")==0)){        /* .op */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"OP")==0) {                which=i;                break;            }        }        if(which == -1) {            LITERR("DC operating point analysis unsupported\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"Operating Point",&foo, task))        return(0);    } else if ( (strcmp(token,".nodeset")==0)){        /* .nodeset */        which = -1;        for(prm=ft_sim->nodeParms;                prm<ft_sim->nodeParms+ft_sim->numNodeParms;prm++) {            if(strcmp(prm->keyword,"nodeset")==0) {                which=prm->id;                break;            }        }        if(which == -1) {            LITERR("nodeset unknown to simulator. \n")            return(0);        }        for(;;) { /* loop until we run out of data */            INPgetTok(&line,&name,1);            /* check to see if in the form V(xxx) and grab the xxx */            if( *name == (char)NULL) break; /* end of line */            length = strlen(name);            if( (*name == 'V' || *(name) == 'v') && (length == 1)){                /* looks like V - must be V(xx) - get xx now*/                INPgetTok(&line,&name,1);                INPtermInsert(ckt,&name,tab,&node1);                ptemp.rValue = INPevaluate(&line,&error,1);                IFC(setNodeParm,(ckt,node1,which,&ptemp,(IFvalue*)NULL))                continue;            }            LITERR(" Error: .nodeset syntax error.\n")            break;        }        return(0);    } else if ( (strcmp(token,".disto")==0)){        /* .disto {DEC OCT LIN} NP FSTART FSTOP <F2OVERF1> */	which = -1;	for(i=0;i<ft_sim->numAnalyses;i++) {	    if(strcmp(ft_sim->analyses[i]->name,"DISTO")==0) {		which=i;		break;	    }	}	if(which == -1) {	    LITERR("Small signal distortion analysis unsupported.\n")	    return(0);	}	IFC(newAnalysis,(ckt,which,"Distortion Analysis",&foo, task))	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))	if(*line) {	    parm = INPgetValue(ckt,&line,IF_REAL,tab); /* f1phase */	    GCA(INPapName,(ckt,which,foo,"f2overf1",parm))	}        return(0);    } else if ( (strcmp(token,".noise")==0)){        /* .noise V(OUTPUT,REF) SRC {DEC OCT LIN} NP FSTART FSTOP <PTSPRSUM> */	which = -1;	for (i=0; i<ft_sim->numAnalyses; i++) {	    if (strcmp(ft_sim->analyses[i]->name, "NOISE") == 0) {		which = i;		break;	    }	}	if (which == -1) {	    LITERR("Noise analysis unsupported.\n");	    return(0);	}	IFC(newAnalysis, (ckt,which,"Noise Analysis",&foo,task))	INPgetTok(&line,&name,1);	/* Make sure the ".noise" command is followed by		*/	/* V(xxxx).  If it is, extract 'xxxx'.  If not, report an error. */	if (name != NULL) {	    length = strlen(name);	    if (((*name == 'V') || (*name == 'v')) && (length == 1)) {		INPgetTok(&line,&nname1,0);		INPtermInsert(ckt,&nname1,tab,&node1);		ptemp.nValue=(IFnode)node1;		GCA(INPapName,(ckt,which,foo,"output",&ptemp))		if (*line != /* match ( */ ')') {		    INPgetTok(&line,&nname2,1);		    INPtermInsert(ckt,&nname2,tab,&node2);		    ptemp.nValue=(IFnode)node2;		} else {		    ptemp.nValue=(IFnode)gnode;		}		GCA(INPapName,(ckt,which,foo,"outputref",&ptemp))		INPgetTok(&line,&name,1);		INPinsert(&name,tab);		ptemp.uValue=name;		GCA(INPapName,(ckt,which,foo,"input",&ptemp))		INPgetTok(&line,&steptype,1);		ptemp.iValue = 1;		error=INPapName(ckt,which,foo,steptype,&ptemp);		if (error)		    current->error = INPerrCat(current->error,INPerror(error));		parm = INPgetValue(ckt,&line,IF_INTEGER,tab);		error = INPapName(ckt,which,foo,"numsteps",parm);		if (error)		    current->error = INPerrCat(current->error,INPerror(error));		parm = INPgetValue(ckt,&line,IF_REAL,tab);		error = INPapName(ckt,which,foo,"start",parm);		if (error)		    current->error = INPerrCat(current->error,INPerror(error));		parm = INPgetValue(ckt,&line,IF_REAL,tab);		error = INPapName(ckt,which,foo,"stop",parm);		if (error)		    current->error = INPerrCat(current->error,INPerror(error));		/* now see if "ptspersum" has been specified by the user */		for (found=0, point=line; (!found) && (*point != '\0');		    found = ((*point != ' ') && (*(point++) != '\t')));		if (found) {		    parm = INPgetValue(ckt,&line,IF_INTEGER,tab);		    error = INPapName(ckt,which,foo,"ptspersum",parm);		    if (error)			current->error =			    INPerrCat(current->error,INPerror(error));		} else {		    ptemp.iValue = 0;		    error = INPapName(ckt,which,foo,"ptspersum",&ptemp);		    if (error) current->error =			INPerrCat(current->error,INPerror(error));		}	    } else	    LITERR("bad syntax [.noise v(OUT) SRC {DEC OCT LIN} NP FSTART FSTOP <PTSPRSUM>]\n");	}	else {	    LITERR("bad syntax [.noise v(OUT) SRC {DEC OCT LIN} NP FSTART FSTOP <PTSPRSUM>]\n");	}        return(0);    } else if ( (strcmp(token,".four")==0) || (strcmp(token,".fourier")==0) ){        /* .four */        /* not implemented - warn & ignore */        LITERR("Use fourier command to obtain fourier analysis\n")        return(0);    } else if ( (strcmp(token,".ic")==0)){        /* .ic */        which = -1;        for(prm=ft_sim->nodeParms;                prm<ft_sim->nodeParms+ft_sim->numNodeParms;prm++) {            if(strcmp(prm->keyword,"ic")==0) {                which=prm->id;                break;            }        }        if(which==-1) {            LITERR("ic unknown to simulator. \n")            return(0);        }        for(;;) { /* loop until we run out of data */            INPgetTok(&line,&name,1);            /* check to see if in the form V(xxx) and grab the xxx */            if( *name == 0) break; /* end of line */            length = strlen(name);            if( (*name == 'V' || *(name) == 'v') && (length == 1)){                /* looks like V - must be V(xx) - get xx now*/                INPgetTok(&line,&name,1);                INPtermInsert(ckt,&name,tab,&node1);                ptemp.rValue = INPevaluate(&line,&error,1);                IFC(setNodeParm,(ckt,node1,which,&ptemp,(IFvalue*)NULL))                continue;            }            LITERR(" Error: .ic syntax error.\n")            break;        }        return(0);    } else if ( (strcmp(token,".ac")==0)){        /* .ac {DEC OCT LIN} NP FSTART FSTOP */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"AC")==0) {                which=i;                break;            }        }        if(which == -1) {            LITERR("AC small signal analysis unsupported.\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"AC Analysis",&foo, task))        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 ( (strcmp(token,".pz")==0)){        /* .pz nodeI nodeG nodeJ nodeK {V I} {POL ZER PZ} */        which = -1;        for(i=0;i<ft_sim->numAnalyses;i++) {            if(strcmp(ft_sim->analyses[i]->name,"PZ")==0) {                which=i;                break;            }        }        if(which == -1) {            LITERR("Pole-zero analysis unsupported.\n")            return(0);        }        IFC(newAnalysis,(ckt,which,"Pole-Zero Analysis",&foo, task))        parm = INPgetValue(ckt,&line,IF_NODE,tab);         GCA(INPapName,(ckt,which,foo,"nodei",parm))        parm = INPgetValue(ckt,&line,IF_NODE,tab);         GCA(INPapName,(ckt,which,foo,"nodeg",parm))        parm = INPgetValue(ckt,&line,IF_NODE,tab);         GCA(INPapName,(ckt,which,foo,"nodej",parm))

⌨️ 快捷键说明

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