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

📄 inp2y.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/**********Copyright 1992 Regents of the University of California.  All rightsreserved.Author: 1992 Charles Hough**********/#include "ngspice.h"#include <stdio.h>#include "ifsim.h"#include "inpdefs.h"#include "inpmacs.h"#include "fteext.h"#include "inp.h"voidINP2Y(ckt,tab,current)    void *ckt;    INPtables *tab;    card *current;{/* parse a txl card *//* Yxxxx node1 node2 name */int mytype; /* the type to determine txl */int mytype2; /* the type to determine cpl */int type;   /* the type the model says it is */char *line; /* the part of the current line left to parse */char *name; /* the resistor's name */char *buf; /* temporary buffer for parsing */char *model;    /* the name of the resistor's model */char *nname1;   /* the first node's name */char *nname2;   /* the second node's name */char rname1[10], rname2[10], rname3[10];char cname1[10], cname2[10], cname3[10], cname4[10];char *internal1, *internal2;char *ground1, *ground2;void *node1; /* the first node's node pointer */void *node2; /* the second node's node pointer */void *gnode1, *gnode2, *inode1, *inode2;int error;      /* error code temporary */int error1;     /* secondary error code temporary */INPmodel *thismodel;    /* pointer to model structure describing our model */void *mdfast;    /* pointer to the actual model */void *fast;  /* pointer to the actual instance */void *mdfast2, *mdfast3, *mdfast4, *mdfast5, *mdfast6;void *fast2, *fast3, *fast4, *fast5, *fast6;IFuid uid;      /* uid for default model */GENinstance *txl;IFvalue ptemp;  /* a value structure to package into */double lval=0, rval=0, cval=0, lenval=0;int lenvalgiven = 0;    mytype = INPtypelook("TransLine");    mytype2 = INPtypelook("CplLines");    if(mytype < 0 ) {        LITERR("Device type TransLine not supported by this binary\n")        return;    }    line = current->line;    INPgetTok(&line,&name,1);    INPinsert(&name,tab);    INPgetNetTok(&line,&nname1,1);    INPtermInsert(ckt,&nname1,tab,&node1);    INPgetNetTok(&line,&ground1,1);    INPtermInsert(ckt,&ground1,tab,&gnode1);    INPgetNetTok(&line,&nname2,1);    INPtermInsert(ckt,&nname2,tab,&node2);    INPgetNetTok(&line,&ground2,1);    INPtermInsert(ckt,&ground2,tab,&gnode2);	    INPgetTok(&line,&model,1);	if (strcmp(model, "len") == 0) {		lenval = INPevaluate(&line,&error1,1);		lenvalgiven = 1;		INPgetTok(&line,&model,1);	}	if(*model) { /* token isn't null */		INPinsert(&model,tab);		thismodel = (INPmodel *)NULL;		current->error = INPgetMod(ckt,model,&thismodel,tab);		if(thismodel != NULL) {			if (thismodel->INPmodType == mytype2) {				INP2P(ckt,tab,current);				return;			}			else if (mytype != thismodel->INPmodType) { 				LITERR("incorrect model type")				return;			}			line = thismodel->INPmodLine->line;			INPgetTok(&line,&buf,1);  /* throw out .model */			INPgetTok(&line,&buf,1);  /* throw out model name */			INPgetTok(&line,&buf,1);  /* throw out txl */			INPgetTok(&line,&buf,1);			while (*line != '\0') {				if (*buf == 'R' || *buf == 'r') {					INPgetTok(&line,&buf,1);					rval = atof(buf);				}				if ((strcmp(buf,"L") == 0)  || (strcmp(buf,"l") == 0)) {					INPgetTok(&line,&buf,1);					lval = atof(buf);				}				if ((strcmp(buf,"C") == 0)  || (strcmp(buf,"c") == 0)) {					INPgetTok(&line,&buf,1);					cval = atof(buf);				}				if (lenvalgiven == 0) {					if (strcmp(buf,"length")== 0) {						INPgetTok(&line,&buf,1);						lenval = atof(buf);					}				}				INPgetTok(&line,&buf,1);			}			if (lenval && rval && lval && rval/lval > 1.6e10) {				/* use 3-pi model */				rval = 3.0 / (rval * lenval);				cval = cval * lenval / 6.0;				type = INPtypelook("Resistor");				/* resistor between node1 and internal1 */				internal1 = (char *) malloc (10);				strcpy(internal1, "txlnd1");   				INPtermInsert(ckt, &internal1, tab, &inode1);				if(!tab->defRmod) {					/* create default R model */					IFnewUid(ckt,&uid,(IFuid)NULL,"R",UID_MODEL,(void**)NULL);					IFC(newModel, (ckt,type,&(tab->defRmod),uid))				}				mdfast = tab->defRmod;				strcpy(rname1, "txlres1");				IFC(newInstance,(ckt,mdfast,&fast,rname1))				IFC(bindNode,(ckt,fast,1,node1))				IFC(bindNode,(ckt,fast,2,inode1))				ptemp.rValue = rval;				GCA(INPpName,("resistance",&ptemp,ckt,type,fast))				/* resistor between internal1 and internal2 */				internal2 = (char *) malloc (10);				strcpy(internal2, "txlnd2");				INPtermInsert(ckt, &internal2, tab, &inode2);				strcpy(rname2, "txlres2");				mdfast2 = tab->defRmod;				IFC(newInstance,(ckt,mdfast2,&fast2,rname2))				IFC(bindNode,(ckt,fast2,1,inode1))				IFC(bindNode,(ckt,fast2,2,inode2))				ptemp.rValue = rval;				GCA(INPpName,("resistance",&ptemp,ckt,type,fast2))				/* resistor between internal2 and node2 */				strcpy(rname3, "txlres3");				mdfast3 = tab->defRmod;				IFC(newInstance,(ckt,mdfast3,&fast3,rname3))				IFC(bindNode,(ckt,fast3,1,inode2))				IFC(bindNode,(ckt,fast3,2,node2))				ptemp.rValue = rval;				GCA(INPpName,("resistance",&ptemp,ckt,type,fast3))				/* capacitor on node1 */				type = INPtypelook("Capacitor");				if(!tab->defCmod) {					IFnewUid(ckt,&uid,(IFuid)NULL,"C",UID_MODEL,(void**)NULL);					IFC(newModel,(ckt,type,&(tab->defCmod),uid))				}				mdfast4 = tab->defCmod;				strcpy(cname1, "txlcap1");				IFC(newInstance,(ckt,mdfast4,&fast4,cname1))				IFC(bindNode,(ckt,fast4,1,node1))				IFC(bindNode,(ckt,fast4,2,gnode1))				ptemp.rValue = cval;				GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4))				/* capacitor on internal1 */				strcpy(cname2, "txlcap2");				mdfast4 = tab->defCmod;				IFC(newInstance,(ckt,mdfast4,&fast4,cname2))				IFC(bindNode,(ckt,fast4,1,inode1))				IFC(bindNode,(ckt,fast4,2,gnode1))				ptemp.rValue = cval * 2;				GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4))				/* capacitor on internal2 */				strcpy(cname3, "txlcap3");				mdfast5 = tab->defCmod;				IFC(newInstance,(ckt,mdfast5,&fast5,cname3))				IFC(bindNode,(ckt,fast5,1,inode2))				IFC(bindNode,(ckt,fast5,2,gnode1))				ptemp.rValue = cval * 2;				GCA(INPpName,("capacitance",&ptemp,ckt,type,fast5))				/* capacitor on node2 */				strcpy(cname4, "txlcap4");				mdfast6 = tab->defCmod;				IFC(newInstance,(ckt,mdfast6,&fast6,cname4))				IFC(bindNode,(ckt,fast6,1,node2))				IFC(bindNode,(ckt,fast6,2,gnode1))				ptemp.rValue = cval;				GCA(INPpName,("capacitance",&ptemp,ckt,type,fast6))				return;			}			/* use regular txl model */			mdfast = thismodel->INPmodfast;			type = thismodel->INPmodType;		} else {			type = mytype;			if(!tab->defYmod) {				/* create default Y model */				IFnewUid(ckt,&uid,(IFuid)NULL,"Y",UID_MODEL,(void**)NULL);				IFC(newModel, (ckt,type,&(tab->defYmod),uid))			}			mdfast = tab->defYmod;    	}    	IFC(newInstance,(ckt,mdfast,&fast,name))	} else  {		LITERR("model name is not found")		return;	}		if (error1 == 0 && lenvalgiven) {		ptemp.rValue = lenval;		GCA(INPpName,("length",&ptemp,ckt,type,fast))	}    IFC(bindNode,(ckt,fast,1,node1))    IFC(bindNode,(ckt,fast,2,node2))	txl = (GENinstance *)fast;    return;}

⌨️ 快捷键说明

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