📄 inp2dot.c
字号:
/**********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 + -