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