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

📄 urcsetup.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1987 Thomas L. Quarles**********/#include "ngspice.h"#include "ifsim.h"#include "urcdefs.h"#include "cktdefs.h"#include "gendefs.h"#include "sperror.h"#include "suffix.h"/* ARGSUSED */intURCsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state)        /* create the resistors/capacitors used to model the URC         */{    URCmodel *model = (URCmodel *)inModel;    URCinstance *here;    int rtype;    int ctype;    int dtype;    CKTnode * lowl;    CKTnode * lowr;    CKTnode * hil;    CKTnode * hir;    char *nameelt;    char *namehi;    CKTnode *nodehi;    CKTnode *nodelo;    char *namelo;    double r;    double c;    IFvalue ptemp;    double p;    double r0;    double c0;    double i0;    double r1;    double c1;    double i1;    double rd;    double wnorm;    double prop;    int i;    GENinstance  *fast;    GENmodel *modfast; /* capacitor or diode model */    GENmodel *rmodfast; /* resistor model */    int error;    IFuid dioUid;    IFuid resUid;    IFuid capUid;    IFuid eltUid;    rtype = CKTtypelook("Resistor");    ctype = CKTtypelook("Capacitor");    dtype = CKTtypelook("Diode");    /*  loop through all the URC models */    for( ; model != NULL; model = model->URCnextModel ) {	if(!model->URCkGiven)	    model->URCk = 1.5;	if(!model->URCfmaxGiven)	    model->URCfmax = 1e9;	if(!model->URCrPerLGiven)	    model->URCrPerL = 1000;	if(!model->URCcPerLGiven)	    model->URCcPerL = 1e-12;/* may need to put in limits:  k>=1.1, freq <=1e9, rperl >=.1 */        /* loop through all the instances of the model */        for (here = model->URCinstances; here != NULL ;                here=here->URCnextInstance)	{            p = model->URCk;            r0 = here->URClength * model->URCrPerL;            c0 = here->URClength * model->URCcPerL;            i0 = here->URClength * model->URCisPerL;            if(!here->URClumpsGiven) {                wnorm = model->URCfmax * r0 * c0 * 2.0 * M_PI;                here->URClumps=MAX(3.0,log(wnorm*(((p-1)/p)*((p-1)/p)))/log(p));                if(wnorm <35) here->URClumps=3;                /* may want to limit lumps to <= 100 or something like that */            }            r1 = (r0*(p-1))/((2*(pow(p,(double)here->URClumps)))-2);            c1 = (c0 * (p-1))/((pow(p,(double)(here->URClumps-1)))*(p+1)-2);            i1 = (i0 * (p-1))/((pow(p,(double)(here->URClumps-1)))*(p+1)-2);            rd = here->URClength * here->URClumps * model->URCrsPerL;            /* may want to check that c1 > 0 */            prop=1;            if(model->URCisPerLGiven) {                error = (*(SPfrontEnd->IFnewUid))(ckt,&dioUid,here->URCname,                        "diodemod",UID_MODEL,(void **)NULL);                if(error) return(error);                modfast = (GENmodel *)NULL;                error = CKTmodCrt((void *)ckt,dtype,(void **)&modfast,                        dioUid);                if(error) return(error);                ptemp.rValue = c1;                error= CKTpModName("cjo",&ptemp,ckt,dtype,dioUid,&modfast);                if(error) return(error);                ptemp.rValue = rd;                error = CKTpModName("rs",&ptemp,ckt,dtype,dioUid,&modfast);                if(error) return(error);                ptemp.rValue = i1;                error = CKTpModName("is",&ptemp,ckt,dtype,dioUid,&modfast);                if(error) return(error);            } else {                error = (*(SPfrontEnd->IFnewUid))((void *)ckt,&capUid,                        here->URCname, "capmod",UID_MODEL,(void **)NULL);                if(error) return(error);                modfast = (GENmodel *)NULL;                error = CKTmodCrt((void *)ckt,ctype,(void **)&modfast,                        capUid);                if(error) return(error);            }            error = (*(SPfrontEnd->IFnewUid))(ckt,&resUid,here->URCname,                    "resmod",UID_MODEL,(void **)NULL);            if(error) return(error);            rmodfast = (GENmodel *)NULL;            error = CKTmodCrt((void *)ckt,rtype,(void **)&rmodfast,resUid);            if(error) return(error);            lowl = CKTnum2nod(ckt,here->URCposNode);            hir = CKTnum2nod(ckt,here->URCnegNode);            for(i=1;i<=here->URClumps;i++) {                namehi = (char *)MALLOC(10*sizeof(char));                (void)sprintf(namehi,"hi%d",i);                error = CKTmkVolt(ckt,(CKTnode**)&nodehi,here->URCname,namehi);                if(error) return(error);                hil = nodehi;                if(i==here->URClumps) {                    lowr = hil;                } else {                    namelo = (char *)MALLOC(10*sizeof(char));                    (void)sprintf(namelo,"lo%d",i);                    error = CKTmkVolt(ckt,(CKTnode**)&nodelo,here->URCname,                            namelo);                    if(error) return(error);                    lowr = nodelo;                }                r = prop*r1;                c = prop*c1;                nameelt = (char *)MALLOC(10*sizeof(char));                (void)sprintf(nameelt,"rlo%d",i);                error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,here->URCname,                        nameelt,UID_INSTANCE, (void **)NULL);                if(error) return(error);                error = CKTcrtElt((void *)ckt,(void *)rmodfast,                        (void **)&fast,eltUid);                if(error) return(error);                error = CKTbindNode((void *)ckt,(void *)fast,1,lowl);                if(error) return(error);                error = CKTbindNode((void *)ckt,(void *)fast,2,lowr);                if(error) return(error);                ptemp.rValue = r;                error = CKTpName("resistance",&ptemp,ckt,rtype,nameelt,&fast);                if(error) return(error);		fast->GENowner = here->URCowner;                nameelt = (char *)MALLOC(10*sizeof(char));                (void)sprintf(nameelt,"rhi%d",i);                error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,here->URCname,                        nameelt,UID_INSTANCE, (void **)NULL);                if(error) return(error);                error = CKTcrtElt((void *)ckt,(void *)rmodfast,                        (void **)&fast,eltUid);                if(error) return(error);                error = CKTbindNode((void *)ckt,(void *)fast,1,hil);                if(error) return(error);                error = CKTbindNode((void *)ckt,(void *)fast,2,hir);                if(error) return(error);                ptemp.rValue = r;                error = CKTpName("resistance",&ptemp,ckt,rtype,nameelt,&fast);                if(error) return(error);		fast->GENowner = here->URCowner;                if(model->URCisPerLGiven) {                    /* use diode */                    nameelt = (char *)MALLOC(10*sizeof(char));                    (void)sprintf(nameelt,"dlo%d",i);                    error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,                            here->URCname,nameelt,UID_INSTANCE,                             (void **)NULL);                    if(error) return(error);                    error = CKTcrtElt((void *)ckt,(void *)modfast,                            (void **)&fast, eltUid);                    if(error) return(error);                    error = CKTbindNode((void *)ckt,(void *)fast,1,lowr);                    if(error) return(error);                    error = CKTbindNode((void *)ckt,(void *)fast,2,                            (void *)CKTnum2nod(ckt, here->URCgndNode));                    if(error) return(error);                    ptemp.rValue = prop;                    error = CKTpName("area",&ptemp,ckt,dtype,nameelt,&fast);                    if(error) return(error);		    fast->GENowner = here->URCowner;                } else {                    /* use simple capacitor */                    nameelt = (char *)MALLOC(10*sizeof(char));                    (void)sprintf(nameelt,"clo%d",i);                    error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,here->URCname                            ,nameelt,UID_INSTANCE, (void **)NULL);                    if(error) return(error);                    error = CKTcrtElt((void *)ckt,(void *)modfast,                            (void **)&fast, eltUid);                    if(error) return(error);                    error = CKTbindNode((void *)ckt,(void *)fast,1,lowr);                    if(error) return(error);                    error = CKTbindNode((void *)ckt,(void *)fast,2,                            (void  *)CKTnum2nod(ckt, here->URCgndNode));                    if(error) return(error);                    ptemp.rValue = c;                    error = CKTpName("capacitance",&ptemp,ckt,ctype,nameelt,                            &fast);                    if(error) return(error);		    fast->GENowner = here->URCowner;                }                if(i!=here->URClumps){                    if(model->URCisPerLGiven) {                        /* use diode */                        nameelt = (char *)MALLOC(10*sizeof(char));                        (void)sprintf(nameelt,"dhi%d",i);                        error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,                                here->URCname,nameelt,UID_INSTANCE,                                (void **)NULL);                        if(error) return(error);                        error = CKTcrtElt((void *)ckt,(void *)modfast,                                (void **) &fast,eltUid);                        if(error) return(error);                        error = CKTbindNode((void *)ckt,(void *)fast,1,hil);                        if(error) return(error);                        error = CKTbindNode((void *)ckt,(void *)fast,2,                                (void *)CKTnum2nod(ckt, here->URCgndNode));                        if(error) return(error);                        ptemp.rValue = prop;                        error=CKTpName("area",&ptemp,ckt,dtype,nameelt,&fast);                        if(error) return(error);			fast->GENowner = here->URCowner;                    } else {                        /* use simple capacitor */                        nameelt = (char *)MALLOC(10*sizeof(char));                        (void)sprintf(nameelt,"chi%d",i);                        error = (*(SPfrontEnd->IFnewUid))(ckt,&eltUid,                                here->URCname,nameelt,UID_INSTANCE,                                (void **)NULL);                        if(error) return(error);                        error = CKTcrtElt((void *)ckt,(void *)modfast,                                (void **)&fast,eltUid);                        if(error) return(error);                        error = CKTbindNode((void *)ckt,(void *)fast,1,hil);                        if(error) return(error);                        error = CKTbindNode((void *)ckt,(void *)fast,2,                                (void *)CKTnum2nod(ckt, here->URCgndNode));                        if(error) return(error);                        ptemp.rValue = c;                        error =CKTpName("capacitance",&ptemp,ckt,ctype,nameelt,                                &fast);                        if(error) return(error);			fast->GENowner = here->URCowner;                    }                }                prop *= p;                lowl = lowr;                hir = hil;            }        }    }    return(OK);}intURCunsetup(GENmodel *inModel, CKTcircuit *ckt){    IFuid	varUid;    int	error;    URCinstance *here;    URCmodel *model = (URCmodel *) inModel;    GENinstance *in;    GENmodel *modfast;    int type;    /* Delete models, devices, and intermediate nodes; */    for ( ; model; model = model->URCnextModel) {	for (here = model->URCinstances; here;	     here = here->URCnextInstance)	{	    if(model->URCisPerLGiven) {		/* Diodes */		error = (*(SPfrontEnd->IFnewUid))(ckt, &varUid,						  here->URCname,						  "diodemod",						  UID_MODEL,						  (void **)NULL);	    } else {		/* Capacitors */		error = (*(SPfrontEnd->IFnewUid))((void *)ckt, &varUid,						  here->URCname,						  "capmod",						  UID_MODEL,						  (void **)NULL);	    }	    if (error && error != E_EXISTS)		return error;	    modfast = NULL;	    type = -1;	    error = CKTfndMod(ckt, &type, (void **) &modfast, varUid);	    if (error)		return error;	    for (in = modfast->GENinstances; in; in = in->GENnextInstance)		CKTdltNNum(ckt, in->GENnode1);	    CKTdltMod(ckt, modfast);	/* Does the elements too */	    /* Resistors */	    error = (*(SPfrontEnd->IFnewUid))(ckt,&varUid,here->URCname,					      "resmod",UID_MODEL,(void **)NULL);	    if (error && error != E_EXISTS)		return error;	    modfast = NULL;	    type = -1;	    error = CKTfndMod(ckt, &type, (void **) &modfast, varUid);	    if (error)		return error;	    CKTdltMod(ckt, modfast);	}    }    return OK;}

⌨️ 快捷键说明

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