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

📄 b4acld.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
/**** BSIM4.4.0  Released by Xuemei (Jane) Xi 03/04/2004 ****//********** * Copyright 2004 Regents of the University of California. All rights reserved. * File: b4acld.c of BSIM4.4.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 10/05/2001. **********/#include "ngspice.h"#include "cktdefs.h"#include "bsim4def.h"#include "sperror.h"#include "suffix.h"intBSIM4acLoad(inModel,ckt)GENmodel *inModel;CKTcircuit *ckt;{BSIM4model *model = (BSIM4model*)inModel;BSIM4instance *here;double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb;double xcbgb, xcbdb, xcbsb, xcbbb;double xcggbr, xcgdbr, xcgsbr, xcgbbr, xcggbi, xcgdbi, xcgsbi, xcgbbi;double Cggr, Cgdr, Cgsr, Cgbr, Cggi, Cgdi, Cgsi, Cgbi;double xcddbr, xcdgbr, xcdsbr, xcdbbr, xcsdbr, xcsgbr, xcssbr, xcsbbr;double xcddbi, xcdgbi, xcdsbi, xcdbbi, xcsdbi, xcsgbi, xcssbi, xcsbbi;double xcdbdb, xcsbsb=0.0, xcgmgmb=0.0, xcgmdb=0.0, xcgmsb=0.0, xcdgmb, xcsgmb;double xcgmbb=0.0, xcbgmb;double capbd, capbs, omega;double gstot, gstotd, gstotg, gstots, gstotb, gspr;double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr;double gIstotg, gIstotd, gIstots, gIstotb;double gIdtotg, gIdtotd, gIdtots, gIdtotb;double gIbtotg, gIbtotd, gIbtots, gIbtotb;double gIgtotg, gIgtotd, gIgtots, gIgtotb;double cgso, cgdo, cgbo;double gbspsp, gbbdp, gbbsp, gbspg, gbspb;double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp;double T0=0.0, T1, T2, T3;double Csg, Csd, Css;double Cdgr, Cddr, Cdsr, Cdbr, Csgr, Csdr, Cssr, Csbr;double Cdgi, Cddi, Cdsi, Cdbi, Csgi, Csdi, Cssi, Csbi;double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi;double FwdSumr, RevSumr, Gmr, Gmbsr;double FwdSumi, RevSumi, Gmi, Gmbsi;struct bsim4SizeDependParam *pParam;double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls;double m;    omega = ckt->CKTomega;    for (; model != NULL; model = model->BSIM4nextModel)     {    for (here = model->BSIM4instances; here!= NULL;              here = here->BSIM4nextInstance)          {    if (here->BSIM4owner != ARCHme) continue;	            pParam = here->pParam;              capbd = here->BSIM4capbd;              capbs = here->BSIM4capbs;              cgso = here->BSIM4cgso;              cgdo = here->BSIM4cgdo;              cgbo = pParam->BSIM4cgbo;              Csd = -(here->BSIM4cddb + here->BSIM4cgdb + here->BSIM4cbdb);              Csg = -(here->BSIM4cdgb + here->BSIM4cggb + here->BSIM4cbgb);              Css = -(here->BSIM4cdsb + here->BSIM4cgsb + here->BSIM4cbsb);              if (here->BSIM4acnqsMod)              {   T0 = omega * here->BSIM4taunet;                  T1 = T0 * T0;                  T2 = 1.0 / (1.0 + T1);                  T3 = T0 * T2;                  gmr = here->BSIM4gm * T2;                  gmbsr = here->BSIM4gmbs * T2;                  gdsr = here->BSIM4gds * T2;                  gmi = -here->BSIM4gm * T3;                  gmbsi = -here->BSIM4gmbs * T3;                  gdsi = -here->BSIM4gds * T3;                  Cddr = here->BSIM4cddb * T2;                  Cdgr = here->BSIM4cdgb * T2;                  Cdsr = here->BSIM4cdsb * T2;                  Cdbr = -(Cddr + Cdgr + Cdsr);		  /* WDLiu: Cxyi mulitplied by jomega below, and actually to be of conductance */                  Cddi = here->BSIM4cddb * T3 * omega;                  Cdgi = here->BSIM4cdgb * T3 * omega;                  Cdsi = here->BSIM4cdsb * T3 * omega;                  Cdbi = -(Cddi + Cdgi + Cdsi);                  Csdr = Csd * T2;                  Csgr = Csg * T2;                  Cssr = Css * T2;                  Csbr = -(Csdr + Csgr + Cssr);                  Csdi = Csd * T3 * omega;                  Csgi = Csg * T3 * omega;                  Cssi = Css * T3 * omega;                  Csbi = -(Csdi + Csgi + Cssi);		  Cgdr = -(Cddr + Csdr + here->BSIM4cbdb);		  Cggr = -(Cdgr + Csgr + here->BSIM4cbgb);		  Cgsr = -(Cdsr + Cssr + here->BSIM4cbsb);		  Cgbr = -(Cgdr + Cggr + Cgsr);		  Cgdi = -(Cddi + Csdi);		  Cggi = -(Cdgi + Csgi);		  Cgsi = -(Cdsi + Cssi);		  Cgbi = -(Cgdi + Cggi + Cgsi);              }              else /* QS */              {   gmr = here->BSIM4gm;                  gmbsr = here->BSIM4gmbs;                  gdsr = here->BSIM4gds;                  gmi = gmbsi = gdsi = 0.0;                  Cddr = here->BSIM4cddb;                  Cdgr = here->BSIM4cdgb;                  Cdsr = here->BSIM4cdsb;                  Cdbr = -(Cddr + Cdgr + Cdsr);                  Cddi = Cdgi = Cdsi = Cdbi = 0.0;                  Csdr = Csd;                  Csgr = Csg;                  Cssr = Css;                  Csbr = -(Csdr + Csgr + Cssr);                  Csdi = Csgi = Cssi = Csbi = 0.0;                  Cgdr = here->BSIM4cgdb;                  Cggr = here->BSIM4cggb;                  Cgsr = here->BSIM4cgsb;                  Cgbr = -(Cgdr + Cggr + Cgsr);                  Cgdi = Cggi = Cgsi = Cgbi = 0.0;              }              if (here->BSIM4mode >= 0) 	      {   Gmr = gmr;                  Gmbsr = gmbsr;                  FwdSumr = Gmr + Gmbsr;                  RevSumr = 0.0;		  Gmi = gmi;                  Gmbsi = gmbsi;                  FwdSumi = Gmi + Gmbsi;                  RevSumi = 0.0;                  gbbdp = -(here->BSIM4gbds);                  gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;                  gbdpg = here->BSIM4gbgs;                  gbdpdp = here->BSIM4gbds;                  gbdpb = here->BSIM4gbbs;                  gbdpsp = -(gbdpg + gbdpdp + gbdpb);                  gbspdp = 0.0;                  gbspg = 0.0;                  gbspb = 0.0;                  gbspsp = 0.0;                  if (model->BSIM4igcMod)                  {   gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcsg;                      gIstotd = here->BSIM4gIgcsd;                      gIstots = here->BSIM4gIgss + here->BSIM4gIgcss;                      gIstotb = here->BSIM4gIgcsb;                      gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcdg;                      gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcdd;                      gIdtots = here->BSIM4gIgcds;                      gIdtotb = here->BSIM4gIgcdb;                  }                  else                  {   gIstotg = gIstotd = gIstots = gIstotb = 0.0;                      gIdtotg = gIdtotd = gIdtots = gIdtotb = 0.0;                  }                  if (model->BSIM4igbMod)                  {   gIbtotg = here->BSIM4gIgbg;                      gIbtotd = here->BSIM4gIgbd;                      gIbtots = here->BSIM4gIgbs;                      gIbtotb = here->BSIM4gIgbb;                  }                  else                      gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;                  if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0))                  {   gIgtotg = gIstotg + gIdtotg + gIbtotg;                      gIgtotd = gIstotd + gIdtotd + gIbtotd ;                      gIgtots = gIstots + gIdtots + gIbtots;                      gIgtotb = gIstotb + gIdtotb + gIbtotb;                  }                  else                      gIgtotg = gIgtotd = gIgtots = gIgtotb = 0.0;                  if (here->BSIM4rgateMod == 2)                      T0 = *(ckt->CKTstates[0] + here->BSIM4vges)                         - *(ckt->CKTstates[0] + here->BSIM4vgs);                  else if (here->BSIM4rgateMod == 3)                      T0 = *(ckt->CKTstates[0] + here->BSIM4vgms)                         - *(ckt->CKTstates[0] + here->BSIM4vgs);                  if (here->BSIM4rgateMod > 1)                  {   gcrgd = here->BSIM4gcrgd * T0;                      gcrgg = here->BSIM4gcrgg * T0;                      gcrgs = here->BSIM4gcrgs * T0;                      gcrgb = here->BSIM4gcrgb * T0;                      gcrgg -= here->BSIM4gcrg;                      gcrg = here->BSIM4gcrg;                  }                  else                      gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0;                  if (here->BSIM4rgateMod == 3)                  {   xcgmgmb = (cgdo + cgso + pParam->BSIM4cgbo) * omega;                      xcgmdb = -cgdo * omega;                      xcgmsb = -cgso * omega;                      xcgmbb = -pParam->BSIM4cgbo * omega;                          xcdgmb = xcgmdb;                      xcsgmb = xcgmsb;                      xcbgmb = xcgmbb;                          xcggbr = Cggr * omega;                      xcgdbr = Cgdr * omega;                      xcgsbr = Cgsr * omega;                      xcgbbr = -(xcggbr + xcgdbr + xcgsbr);                          xcdgbr = Cdgr * omega;                      xcsgbr = Csgr * omega;                      xcbgb = here->BSIM4cbgb * omega;                  }                  else                  {   xcggbr = (Cggr + cgdo + cgso + pParam->BSIM4cgbo ) * omega;                      xcgdbr = (Cgdr - cgdo) * omega;                      xcgsbr = (Cgsr - cgso) * omega;                      xcgbbr = -(xcggbr + xcgdbr + xcgsbr);                          xcdgbr = (Cdgr - cgdo) * omega;                      xcsgbr = (Csgr - cgso) * omega;                      xcbgb = (here->BSIM4cbgb - pParam->BSIM4cgbo) * omega;                          xcdgmb = xcsgmb = xcbgmb = 0.0;                  }                  xcddbr = (Cddr + here->BSIM4capbd + cgdo) * omega;                  xcdsbr = Cdsr * omega;                  xcsdbr = Csdr * omega;                  xcssbr = (here->BSIM4capbs + cgso + Cssr) * omega;                      if (!here->BSIM4rbodyMod)                  {   xcdbbr = -(xcdgbr + xcddbr + xcdsbr + xcdgmb);                      xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb);                      xcbdb = (here->BSIM4cbdb - here->BSIM4capbd) * omega;                      xcbsb = (here->BSIM4cbsb - here->BSIM4capbs) * omega;                      xcdbdb = 0.0;                  }                  else                  {   xcdbbr = Cdbr * omega;                      xcsbbr = -(xcsgbr + xcsdbr + xcssbr + xcsgmb)			     + here->BSIM4capbs * omega;                      xcbdb = here->BSIM4cbdb * omega;                      xcbsb = here->BSIM4cbsb * omega;                          xcdbdb = -here->BSIM4capbd * omega;                      xcsbsb = -here->BSIM4capbs * omega;                  }                  xcbbb = -(xcbdb + xcbgb + xcbsb + xcbgmb);                  xcdgbi = Cdgi;                  xcsgbi = Csgi;                  xcddbi = Cddi;                  xcdsbi = Cdsi;                  xcsdbi = Csdi;                  xcssbi = Cssi;                  xcdbbi = Cdbi;                  xcsbbi = Csbi;                  xcggbi = Cggi;                  xcgdbi = Cgdi;                  xcgsbi = Cgsi;                  xcgbbi = Cgbi;              }               else /* Reverse mode */              {   Gmr = -gmr;                  Gmbsr = -gmbsr;                  FwdSumr = 0.0;                  RevSumr = -(Gmr + Gmbsr);                  Gmi = -gmi;                  Gmbsi = -gmbsi;                  FwdSumi = 0.0;                  RevSumi = -(Gmi + Gmbsi);                  gbbsp = -(here->BSIM4gbds);                  gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;                  gbdpg = 0.0;                  gbdpsp = 0.0;                  gbdpb = 0.0;                  gbdpdp = 0.0;                  gbspg = here->BSIM4gbgs;                  gbspsp = here->BSIM4gbds;                  gbspb = here->BSIM4gbbs;                  gbspdp = -(gbspg + gbspsp + gbspb);                  if (model->BSIM4igcMod)                  {   gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg;                      gIstotd = here->BSIM4gIgcds;                      gIstots = here->BSIM4gIgss + here->BSIM4gIgcdd;                      gIstotb = here->BSIM4gIgcdb;                      gIdtotg = here->BSIM4gIgdg + here->BSIM4gIgcsg;                      gIdtotd = here->BSIM4gIgdd + here->BSIM4gIgcss;                      gIdtots = here->BSIM4gIgcsd;                      gIdtotb = here->BSIM4gIgcsb;                  }                  else                  {   gIstotg = gIstotd = gIstots = gIstotb = 0.0;                      gIdtotg = gIdtotd = gIdtots = gIdtotb  = 0.0;                  }                  if (model->BSIM4igbMod)                  {   gIbtotg = here->BSIM4gIgbg;                      gIbtotd = here->BSIM4gIgbs;                      gIbtots = here->BSIM4gIgbd;                      gIbtotb = here->BSIM4gIgbb;                  }                  else                      gIbtotg = gIbtotd = gIbtots = gIbtotb = 0.0;                  if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0))                  {   gIgtotg = gIstotg + gIdtotg + gIbtotg;                      gIgtotd = gIstotd + gIdtotd + gIbtotd ;

⌨️ 快捷键说明

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