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

📄 mesasetup.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/**********Copyright 1993: T. Ytterdal, K. Lee, M. Shur and T. A. Fjeldly. All rights reserved.Author: Trond YtterdalModified: 2001 AlansFixes**********/#include "ngspice.h"#include "smpdefs.h"#include "cktdefs.h"#include "mesadefs.h"#include "const.h"#include "sperror.h"#include "suffix.h"intMESAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)        /* load the diode structure with those pointers needed later          * for fast matrix loading          */{    MESAmodel *model = (MESAmodel*)inModel;    MESAinstance *here;    int error;    CKTnode *tmp;    /*  loop through all the diode models */    for( ; model != NULL; model = model->MESAnextModel ) {        if(!model->MESAthresholdGiven) {            model->MESAthreshold = -1.26;        }        if(!model->MESAdGiven) {            model->MESAd = 0.12e-6;        }        if(!model->MESAduGiven) {            model->MESAdu = 0.035e-6;        }        if(!model->MESAlambdaGiven) {            model->MESAlambda = 0.045;        }        if(!model->MESAvsGiven) {            model->MESAvs = 1.5e5;        }        if(!model->MESAbetaGiven) {            model->MESAbeta = 0.0085;        }        if(!model->MESAetaGiven) {            model->MESAeta = 1.73;        }        if(!model->MESAmGiven) {            model->MESAm = 2.5;        }        if(!model->MESAmcGiven) {            model->MESAmc = 3.0;        }        if(!model->MESAalphaGiven) {            model->MESAalpha = 0.0;        }        if(!model->MESAsigma0Given) {            model->MESAsigma0 = 0.081;        }        if(!model->MESAvsigmatGiven) {            model->MESAvsigmat = 1.01;        }        if(!model->MESAvsigmaGiven) {            model->MESAvsigma = 0.1;        }        if(!model->MESAmuGiven) {            model->MESAmu = 0.23;        }        if(!model->MESAthetaGiven) {            model->MESAtheta = 0;        }        if(!model->MESAmu1Given) {            model->MESAmu1 = 0;        }        if(!model->MESAmu2Given) {            model->MESAmu2 = 0;        }        if(!model->MESAndGiven) {            model->MESAnd = 2.0e23;        }        if(!model->MESAnduGiven) {            model->MESAndu = 1e22;        }        if(!model->MESAndeltaGiven) {            model->MESAndelta = 6e24;        }        if(!model->MESAthGiven) {            model->MESAth = 0.01e-6;        }        if(!model->MESAdeltaGiven) {            model->MESAdelta = 5.0;        }        if(!model->MESAtcGiven) {            model->MESAtc = 0.0;        }        if(!model->MESAdrainResistGiven) {            model->MESAdrainResist = 0;        }        if(!model->MESAsourceResistGiven) {            model->MESAsourceResist = 0;        }        if(!model->MESAgateResistGiven) {            model->MESAgateResist = 0;        }        if(!model->MESAriGiven) {            model->MESAri = 0;        }        if(!model->MESArfGiven) {            model->MESArf = 0;        }        if(!model->MESArdiGiven) {            model->MESArdi = 0;        }        if(!model->MESArsiGiven) {            model->MESArsi = 0;        }        if(!model->MESAphibGiven) {            model->MESAphib = 0.5*CHARGE;        }        if(!model->MESAphib1Given) {            model->MESAphib1 = 0;        }        if(!model->MESAastarGiven) {            model->MESAastar = 4.0e4;        }        if(!model->MESAggrGiven) {            model->MESAggr = 40;        }        if(!model->MESAdelGiven) {            model->MESAdel = 0.04;        }        if(!model->MESAxchiGiven) {            model->MESAxchi = 0.033;        }        if(!model->MESAnGiven) {            model->MESAn = 1;        }        if(!model->MESAtvtoGiven) {            model->MESAtvto = 0;        }        if(!model->MESAtlambdaGiven) {            model->MESAtlambda = DBL_MAX;        }        if(!model->MESAteta0Given) {            model->MESAteta0 = DBL_MAX;        }        if(!model->MESAteta1Given) {            model->MESAteta1 = 0;        }        if(!model->MESAtmuGiven) {            model->MESAtmu = 300.15;        }        if(!model->MESAxtm0Given) {            model->MESAxtm0 = 0;        }        if(!model->MESAxtm1Given) {            model->MESAxtm1 = 0;        }        if(!model->MESAxtm2Given) {            model->MESAxtm2 = 0;        }        if(!model->MESAksGiven) {            model->MESAks = 0;        }        if(!model->MESAvsgGiven) {            model->MESAvsg = 0;        }        if(!model->MESAtfGiven) {            model->MESAtf = ckt->CKTtemp;        }        if(!model->MESAfloGiven) {            model->MESAflo = 0;        }        if(!model->MESAdelfoGiven) {            model->MESAdelfo = 0;        }        if(!model->MESAagGiven) {            model->MESAag = 0;        }        if(!model->MESAtc1Given) {            model->MESAtc1 = 0;        }        if(!model->MESAtc2Given) {            model->MESAtc2 = 0;        }        if(!model->MESAzetaGiven) {            model->MESAzeta = 1;        }        if(!model->MESAlevelGiven) {            model->MESAlevel = 2;        }        if(!model->MESAnmaxGiven) {            model->MESAnmax = 2e16;        }        if(!model->MESAgammaGiven) {            model->MESAgamma = 3.0;        }        if(!model->MESAepsiGiven) {            model->MESAepsi = 12.244*8.85418e-12;        }        if(!model->MESAcasGiven) {            model->MESAcas = 1;        }                              if(!model->MESAcbsGiven) {            model->MESAcbs = 1;        }                              /* loop through all the instances of the model */        for (here = model->MESAinstances; here != NULL ;                here=here->MESAnextInstance) {            if (here->MESAowner != ARCHme) goto matrixpointers;                     if(!here->MESAlengthGiven) {                here->MESAlength = 1e-6;            }            if(!here->MESAwidthGiven) {                here->MESAwidth = 20e-6;            }            if(!here->MESAmGiven) {                here->MESAm = 1.0;            }            if(!here->MESAdtempGiven) {                here->MESAdtemp = 0.0;            }            if(!here->MESAtdGiven) {                here->MESAtd = ckt->CKTtemp + here->MESAdtemp;            }            if(!here->MESAtsGiven) {                here->MESAts = ckt->CKTtemp + here->MESAdtemp;            }            here->MESAstate = *states;            *states += 20;matrixpointers:            if(model->MESAsourceResist != 0 && here->MESAsourcePrimeNode==0) {                error = CKTmkVolt(ckt,&tmp,here->MESAname,"source");                if(error) return(error);                here->MESAsourcePrimeNode = tmp->number;                                if (ckt->CKTcopyNodesets) {		    CKTnode *tmpNode;		    IFuid tmpName;                  if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }                            } else {                here->MESAsourcePrimeNode = here->MESAsourceNode;            }                        if(model->MESAdrainResist != 0 && here->MESAdrainPrimeNode==0) {                error = CKTmkVolt(ckt,&tmp,here->MESAname,"drain");                if(error) return(error);                here->MESAdrainPrimeNode = tmp->number;                                if (ckt->CKTcopyNodesets) {		    CKTnode *tmpNode;		    IFuid tmpName;                  if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }                            } else {                here->MESAdrainPrimeNode = here->MESAdrainNode;            }            if(model->MESAgateResist != 0 && here->MESAgatePrimeNode==0) {                error = CKTmkVolt(ckt,&tmp,here->MESAname,"gate");                if(error) return(error);                here->MESAgatePrimeNode = tmp->number;                                if (ckt->CKTcopyNodesets) {		    CKTnode *tmpNode;		    IFuid tmpName;                  if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }                                            } else {                here->MESAgatePrimeNode = here->MESAgateNode;            }                                    if(model->MESAri != 0 && here->MESAsourcePrmPrmNode==0) {                error = CKTmkVolt(ckt,&tmp,here->MESAname,"gs");                if(error) return(error);                here->MESAsourcePrmPrmNode = tmp->number;                                if (ckt->CKTcopyNodesets) {		    CKTnode *tmpNode;		    IFuid tmpName;                  if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }                            } else {                here->MESAsourcePrmPrmNode = here->MESAsourcePrimeNode;            }            if(model->MESArf != 0 && here->MESAdrainPrmPrmNode==0) {                error = CKTmkVolt(ckt,&tmp,here->MESAname,"gd");                if(error) return(error);                here->MESAdrainPrmPrmNode = tmp->number;                                if (ckt->CKTcopyNodesets) {		    CKTnode *tmpNode;		    IFuid tmpName;                  if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }                            } else {                here->MESAdrainPrmPrmNode = here->MESAdrainPrimeNode;            }#define TSTALLOC(ptr,first,second) \if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\    return(E_NOMEM);\}  TSTALLOC(MESAdrainDrainPtr,MESAdrainNode,MESAdrainNode)  TSTALLOC(MESAdrainPrimeDrainPrimePtr,MESAdrainPrimeNode,MESAdrainPrimeNode)  TSTALLOC(MESAdrainPrmPrmDrainPrmPrmPtr,MESAdrainPrmPrmNode,MESAdrainPrmPrmNode)  TSTALLOC(MESAgateGatePtr,MESAgateNode,MESAgateNode)  TSTALLOC(MESAgatePrimeGatePrimePtr,MESAgatePrimeNode,MESAgatePrimeNode)  TSTALLOC(MESAsourceSourcePtr,MESAsourceNode,MESAsourceNode)  TSTALLOC(MESAsourcePrimeSourcePrimePtr,MESAsourcePrimeNode,MESAsourcePrimeNode)  TSTALLOC(MESAsourcePrmPrmSourcePrmPrmPtr,MESAsourcePrmPrmNode,MESAsourcePrmPrmNode)  TSTALLOC(MESAdrainDrainPrimePtr,MESAdrainNode,MESAdrainPrimeNode)  TSTALLOC(MESAdrainPrimeDrainPtr,MESAdrainPrimeNode,MESAdrainNode)  TSTALLOC(MESAgatePrimeDrainPrimePtr,MESAgatePrimeNode,MESAdrainPrimeNode)  TSTALLOC(MESAdrainPrimeGatePrimePtr,MESAdrainPrimeNode,MESAgatePrimeNode)  TSTALLOC(MESAgatePrimeSourcePrimePtr,MESAgatePrimeNode,MESAsourcePrimeNode)  TSTALLOC(MESAsourcePrimeGatePrimePtr,MESAsourcePrimeNode,MESAgatePrimeNode)    TSTALLOC(MESAsourceSourcePrimePtr,MESAsourceNode,MESAsourcePrimeNode)  TSTALLOC(MESAsourcePrimeSourcePtr,MESAsourcePrimeNode,MESAsourceNode)  TSTALLOC(MESAdrainPrimeSourcePrimePtr,MESAdrainPrimeNode,MESAsourcePrimeNode)  TSTALLOC(MESAsourcePrimeDrainPrimePtr,MESAsourcePrimeNode,MESAdrainPrimeNode)  TSTALLOC(MESAgatePrimeGatePtr,MESAgatePrimeNode,MESAgateNode)  TSTALLOC(MESAgateGatePrimePtr,MESAgateNode,MESAgatePrimeNode)  TSTALLOC(MESAsourcePrmPrmSourcePrimePtr,MESAsourcePrmPrmNode,MESAsourcePrimeNode)  TSTALLOC(MESAsourcePrimeSourcePrmPrmPtr,MESAsourcePrimeNode,MESAsourcePrmPrmNode)  TSTALLOC(MESAsourcePrmPrmGatePrimePtr,MESAsourcePrmPrmNode,MESAgatePrimeNode)  TSTALLOC(MESAgatePrimeSourcePrmPrmPtr,MESAgatePrimeNode,MESAsourcePrmPrmNode)  TSTALLOC(MESAdrainPrmPrmDrainPrimePtr,MESAdrainPrmPrmNode,MESAdrainPrimeNode)  TSTALLOC(MESAdrainPrimeDrainPrmPrmPtr,MESAdrainPrimeNode,MESAdrainPrmPrmNode)  TSTALLOC(MESAdrainPrmPrmGatePrimePtr,MESAdrainPrmPrmNode,MESAgatePrimeNode)  TSTALLOC(MESAgatePrimeDrainPrmPrmPtr,MESAgatePrimeNode,MESAdrainPrmPrmNode)  }  }    return(OK);}intMESAunsetup(GENmodel *inModel, CKTcircuit *ckt){    MESAmodel *model;    MESAinstance *here;     for (model = (MESAmodel *)inModel; model != NULL;            model = model->MESAnextModel)    {        for (here = model->MESAinstances; here != NULL;                here=here->MESAnextInstance)        {            if (here->MESAdrainPrimeNode                    && here->MESAdrainPrimeNode != here->MESAdrainNode)            {                CKTdltNNum(ckt, here->MESAdrainPrimeNode);                here->MESAdrainPrimeNode = 0;            }            if (here->MESAsourcePrimeNode                    && here->MESAsourcePrimeNode != here->MESAsourceNode)            {                CKTdltNNum(ckt, here->MESAsourcePrimeNode);                here->MESAsourcePrimeNode = 0;            }            if (here->MESAgatePrimeNode                    && here->MESAgatePrimeNode != here->MESAgateNode)            {                CKTdltNNum(ckt, here->MESAgatePrimeNode);                here->MESAgatePrimeNode = 0;            }                      if (here->MESAsourcePrmPrmNode                    && here->MESAsourcePrmPrmNode != here->MESAsourcePrimeNode)            {                CKTdltNNum(ckt, here->MESAsourcePrmPrmNode);                here->MESAsourcePrmPrmNode = 0;            }            if (here->MESAdrainPrmPrmNode                    && here->MESAdrainPrmPrmNode != here->MESAdrainPrimeNode)            {                CKTdltNNum(ckt, here->MESAdrainPrmPrmNode);                here->MESAdrainPrmPrmNode = 0;            }                }    }    return OK;}

⌨️ 快捷键说明

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