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

📄 inp2dot.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1988 Thomas L. QuarlesModified: 2000 AlansFixes**********/#include "ngspice.h"#include <stdio.h>#include "ifsim.h"#include "inpdefs.h"#include "inpmacs.h"#include "fteext.h"#include "inp.h"#include "cpdefs.h"static intdot_noise(char *line, void *ckt, INPtables *tab, card *current,	  void *task, void *gnode, void *foo){    int which;			/* which analysis we are performing */    int i;			/* generic loop variable */    int error;			/* error code temporary */    char *name;			/* the resistor's name */    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 */    IFvalue ptemp;		/* a value structure to package resistance into */    IFvalue *parm;		/* a pointer to a value struct for function returns */    char *steptype;		/* ac analysis, type of stepping function */    int found;    char *point;    /* .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) {	int length;	length = strlen(name);	if (((*name == 'V') || (*name == 'v')) && (length == 1)) {	    INPgetNetTok(&line, &nname1, 0);	    INPtermInsert(ckt, &nname1, tab, &node1);	    ptemp.nValue = (IFnode) node1;	    GCA(INPapName, (ckt, which, foo, "output", &ptemp))		if (*line != ')') {		    INPgetNetTok(&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;}static intdot_op(char *line, void *ckt, INPtables *tab, card *current,       void *task, void *gnode, void *foo){    int which;			/* which analysis we are performing */    int i;			/* generic loop variable */    int error;			/* error code temporary */    /* .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);}static intdot_disto(char *line, void *ckt, INPtables *tab, card *current,	  void *task, void *gnode, void *foo){    int which;			/* which analysis we are performing */    int i;			/* generic loop variable */    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 */    char *steptype;		/* ac analysis, type of stepping function */    /* .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);}static intdot_ac(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 *steptype;		/* ac analysis, type of stepping function */    /* .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));    tfree(steptype);    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);}static intdot_pz(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 *steptype;		/* ac analysis, type of stepping function */    /* .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));    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);}static intdot_dc(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 */    /* .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); /* vstart2 */	GCA(INPapName, (ckt, which, foo, "start2", parm));	parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstop2 */	GCA(INPapName, (ckt, which, foo, "stop2", parm));	parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc2 */	GCA(INPapName, (ckt, which, foo, "step2", parm));    }    return 0;}static intdot_tf(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 */    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 */    /* .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 != '(' ) {	    /* error, bad input format */	}	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));

⌨️ 快捷键说明

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