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

📄 inp2dot.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
	} 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);}static intdot_tran(char *line, void *ckt, INPtables *tab, card *current,	 void *task, void *gnode, void *foo){    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 */    int which;			/* which analysis we are performing */    int i;			/* generic loop variable */    double dtemp;		/* random double precision temporary */    char *word;			/* something to stick a word of input into */    /* .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);}static intdot_sens(char *line, void *ckt, INPtables *tab, card *current,	 void *task, void *gnode, void *foo){    char *name;			/* the resistor's name */    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 */    int which;			/* which analysis we are performing */    int i;			/* generic loop variable */    char *nname1;		/* the first node's name */    char *nname2;		/* the second node's name */    void *node1;		/* the first node's node pointer */    void *node2;		/* the second node's node pointer */    char *steptype;		/* ac analysis, type of stepping function */    which = -1;			/* Bug fix from Glao Dezai */    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 != '(') {	    LITERR("Syntax error: '(' expected after 'v'\n");	    return 0;	}	INPgetNetTok(&line, &nname1, 0);	INPtermInsert(ckt, &nname1, tab, &node1);	ptemp.nValue = (IFnode) node1;	GCA(INPapName, (ckt, which, foo, "outpos", &ptemp))	    if (*line != ')') {		INPgetNetTok(&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 WANT_SENSE2static intdot_sens2(char *line, void *ckt, INPtables *tab, card *current,	  void *task, void *gnode, void *foo){    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 */    int which;			/* which analysis we are performing */    int i;			/* generic loop variable */    char *token;		/* a token from the line */    /* .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);}#endifstatic intdot_options(char *line, void *ckt, INPtables *tab, card *current,	  void *task, void *gnode, void *foo){	/* .option - specify program options - rather complicated */	/* use a subroutine to handle all of them to keep this    */	/* subroutine managable.                                  */    	    	INPdoOpts(ckt,task,current,tab);	    	return (0);}intINP2dot(void *ckt, INPtables *tab, card *current, void *task, void *gnode){    /* .<something> Many possibilities */    char *token;		/* a token from the line, tmalloc'ed */    void *foo = NULL;		/* pointer to analysis */    /* the part of the current line left to parse */    char *line = current->line;    int rtn = 0;        INPgetTok(&line, &token, 1);    if (strcmp(token, ".model") == 0) {	/* don't have to do anything, since models were all done in	 * pass 1 */	goto quit;    } else if ((strcmp(token, ".width") == 0) ||	       strcmp(token, ".print") == 0 || strcmp(token, ".plot") == 0) {	/* obsolete - ignore */	LITERR(" Warning: obsolete control card - ignored \n");	goto quit;    } 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");	goto quit;    } else if ((strcmp(token, ".op") == 0)) {	rtn = dot_op(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".nodeset") == 0)) {	 goto quit;    } else if ((strcmp(token, ".disto") == 0)) {	rtn = dot_disto(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".noise") == 0)) {	rtn = dot_noise(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".four") == 0)	       || (strcmp(token, ".fourier") == 0)) {	/* .four */	/* not implemented - warn & ignore */	LITERR("Use fourier command to obtain fourier analysis\n");	goto quit;    } else if ((strcmp(token, ".ic") == 0)) {	goto quit;    } else if ((strcmp(token, ".ac") == 0)) {	rtn = dot_ac(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".pz") == 0)) {	rtn = dot_pz(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".dc") == 0)) {	rtn = dot_dc(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".tf") == 0)) {	rtn = dot_tf(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".tran") == 0)) {	rtn = dot_tran(line, ckt, tab, current, task, gnode, foo);	goto quit;    } else if ((strcmp(token, ".subckt") == 0) ||	       (strcmp(token, ".ends") == 0)) {	/* not yet implemented - warn & ignore */	LITERR(" Warning: Subcircuits not yet implemented - ignored \n");	goto quit;    } else if ((strcmp(token, ".end") == 0)) {	/* .end - end of input */	/* not allowed to pay attention to additional input - return */	rtn = 1;	goto quit;    } else if (strcmp(token, ".sens") == 0) {	rtn = dot_sens(line, ckt, tab, current, task, gnode, foo);	goto quit;    }#ifdef WANT_SENSE2    else if ((strcmp(token, ".sens2") == 0)) {	rtn = dot_sens2(line, ckt, tab, current, task, gnode, foo);	goto quit;    }#endif    else if ((strcmp(token, ".probe") == 0)) {	/* Maybe generate a "probe" format file in the future. */	goto quit;    }    else if ((strcmp(token, ".options") == 0)||            (strcmp(token,".option")==0) ||            (strcmp(token,".opt")==0)) {	rtn = dot_options(line, ckt, tab, current, task, gnode, foo);	goto quit;    }    /* Added by H.Tanaka to find .global option */    else if (strcmp(token, ".global") == 0) {	rtn = 0;	LITERR(" Warning: .global not yet implemented - ignored \n");	goto quit;    }    LITERR(" unimplemented control card - error \n");quit:    tfree(token);    return rtn;}

⌨️ 快捷键说明

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