/* File automatically created by ../scripts/text2Ccode.pl*/ const char * VBICSELFT_va = "" "\n" "//\n" "// Verilog-A definition of VBIC\n" "//\n" "// Version: 1.2\n" "// Revision: 1.1\n" "//\n" "// 1. Functions redefined to work properly in Verilog-A, previously\n" "// they were substituted by special code to generate .va files\n" "// without function calls.\n" "// 2. Noise declarations added, consistent with 1.1.5 version.\n" "// 3. qb and qbp calculations protected from having argument of the\n" "// square-root go less than zero (this required very unusual\n" "// conditions and parameters to occur, and needless to say\n" "// this happened some times).\n" "// 4. Parameter names changed to lower case, this is what they are\n" "// in simulator implementations.\n" "// 5. log mapped to ln, this was done in generated code, but in\n" "// Verilog-A log is log_10, not log_e.\n" "// 6. The avalanche function was modified to protect against\n" "// numerical problems for forward and low reverse bias.\n" "// 7. Hard limits on the local temperature were added. This is\n" "// required to avoid numerical problems.\n" "// 8. The excess phase network has been defined in a simpler\n" "// manner, but is exactly equivalent to the previous version.\n" "// It is now done without an inductor. This is the transformation:\n" "// Itzf-V(xf2)-j*w*C*V(xf1)=0\n" "// j*w*L*V(xf2)+V(xf2)-V(xf1)=0\n" "// where C=TD and L=TD/3 is what was done.\n" "// Itzf=V(xf2)+j*w*TD*V(xf1)\n" "// V(xf1)=j*w*(TD/3)*V(xf2)+V(xf2)\n" "// node xf1: two VCCS (Itzf, V(xf2)) plus TD capacitor\n" "// node xf2: one VCCS (V(xf1)), TD/3 capacitor, 1Ohm resistor\n" "// 9. gmin added explicitly\n" "// 10. pnjmaxi added explicitly, diode type currents linearized\n" "// for values greater than pnjmaxi\n" "// 11. Fixed implementation of shrink factors\n" "//\n" "\n" "`include \"discipline.h\"\n" "\n" "`ifdef insideADMS\n" " `define P(prop) (* prop *)\n" " `define PGIVEN(p) $given(p)\n" " `define GMIN $options(\"OPTgmin\")\n" " `define PNJMAXI $options(\"OPTpnjmaxi\")\n" " `define SHRINKL $shrinkl(\"q\")\n" " `define SHRINKA $shrinka(\"q\")\n" " `define SCALE $scale\n" " `define DERIVATE(x,y) $derivate(x,y)\n" " `define INITIAL_MODEL @(initial_model)\n" " `define INITIAL_INSTANCE @(initial_instance)\n" " `define FINAL_STEP\n" "`else\n" " `define P(prop)\n" " `define PGIVEN(p) p\n" " `define GMIN gmin\n" " `define PNJMAXI pnjmaxi\n" " `define SHRINKL 1.0\n" " `define SHRINKA 1.0\n" " `define SCALE 1.0\n" " `define DERIVATE(x,y) 1.0\n" " `define INITIAL_MODEL @(initial_step(\"op\",\"dc\",\"ac\",\"noise\"))\n" " `define INITIAL_INSTANCE @(initial_step(\"op\",\"dc\",\"ac\",\"noise\"))\n" " `define FINAL_STEP @(final_step)\n" "`endif\n" "\n" "`define KB 1.380662e-23 // Boltzmann constant (J/K)\n" "`define QQ 1.602189e-19 // mag. of electronic charge (C)\n" "`define TABS 2.731500e+02 // 0C in K\n" "\n" "`define NPN +1\n" "`define PNP -1\n" "\n" "`define expLinA(expv,V,Vmax,a) \\\n" " if (V0.0) begin \\\n" " pwq = pow((1.0-FC),(-1.0-M)); \\\n" " qlo = P*(1.0-pwq*(1.0-FC)*(1.0-FC))/(1.0-M); \\\n" " qhi = dvh*(1.0-FC+0.5*M*dvh/P)*pwq; \\\n" " end else begin \\\n" " qlo = P*(1.0-pow((1.0-V/P),(1.0-M)))/(1.0-M); \\\n" " qhi = 0.0; \\\n" " end \\\n" " qj = qlo+qhi; \\\n" " end else begin \\\n" " mv0 = sqrt(dv0*dv0+4*A*A); \\\n" " vl0 = -0.5*(dv0+mv0); \\\n" " q0 = -P*pow((1.0-vl0/P),(1.0-M))/(1.0-M); \\\n" " dv = V+dv0; \\\n" " mv = sqrt(dv*dv+4*A*A); \\\n" " vl = 0.5*(dv-mv)-dv0; \\\n" " qlo = -P*pow((1.0-vl/P),(1.0-M))/(1.0-M); \\\n" " qj = qlo+pow((1.0-FC),(-M))*(V-vl+vl0)-q0; \\\n" " end\n" "`define qjrt(qj,V,P,M,FC,A,VRT,ART) \\\n" " dv0 = -P*FC; \\\n" " if (A<=0.0) begin \\\n" " dvh = V+dv0; \\\n" " if (dvh>0.0) begin \\\n" " pwq = pow((1.0-FC),(-1.0-M)); \\\n" " qlo = P*(1.0-pwq*(1.0-FC)*(1.0-FC))/(1.0-M); \\\n" " qhi = dvh*(1.0-FC+0.5*M*dvh/P)*pwq; \\\n" " end else begin \\\n" " if ((VRT>0.0)&&(V<-VRT)) begin \\\n" " qlo = P*(1.0-pow((1.0+VRT/P),(1.0-M))*(1.0-((1.0-M)*(V+VRT))/(P+VRT)))/(1.0-M); \\\n" " end else begin \\\n" " qlo = P*(1.0-pow((1.0-V/P),(1.0-M)))/(1.0-M); \\\n" " end \\\n" " qhi = 0.0; \\\n" " end \\\n" " qj = qlo+qhi; \\\n" " end else begin \\\n" " if ((VRT>0.0)&&(ART>0.0)) begin \\\n" " vn0 = (VRT+dv0)/(VRT-dv0); \\\n" " vnl0 = 2.0*vn0/(sqrt((vn0-1.0)*(vn0-1)+4*A*A)+sqrt((vn0+1.0)*(vn0+1)+4*ART*ART)); \\\n" " vl0 = 0.5*(vnl0*(VRT-dv0)-VRT-dv0); \\\n" " qlo0 = P*(1.0-pow((1.0-vl0/P),(1.0-M)))/(1.0-M); \\\n" " vn = (2*V+VRT+dv0)/(VRT-dv0); \\\n" " vnl = 2.0*vn/(sqrt((vn-1.0)*(vn-1)+4*A*A)+sqrt((vn+1.0)*(vn+1)+4*ART*ART)); \\\n" " vl = 0.5*(vnl*(VRT-dv0)-VRT-dv0); \\\n" " qlo = P*(1.0-pow((1.0-vl/P),(1.0-M)))/(1.0-M); \\\n" " sel = 0.5*(vnl+1.0); \\\n" " crt = pow((1.0+VRT/P),(-M)); \\\n" " cmx = pow((1.0+dv0/P),(-M)); \\\n" " cl = (1.0-sel)*crt+sel*cmx; \\\n" " ql = (V-vl+vl0)*cl; \\\n" " qj = ql+qlo-qlo0; \\\n" " end else begin \\\n" " mv0 = sqrt(dv0*dv0+4*A*A); \\\n" " vl0 = -0.5*(dv0+mv0); \\\n" " q0 = -P*pow((1.0-vl0/P),(1.0-M))/(1.0-M); \\\n" " dv = V+dv0; \\\n" " mv = sqrt(dv*dv+4*A*A); \\\n" " vl = 0.5*(dv-mv)-dv0; \\\n" " qlo = -P*pow((1.0-vl/P),(1.0-M))/(1.0-M); \\\n" " qj = qlo+pow((1.0-FC),(-M))*(V-vl+vl0)-q0; \\\n" " end \\\n" " end\n" "`define avalm(avalm,V,P,M,AV1,AV2,VmaxExp) \\\n" " vminm = pow((0.02*(AV2+1.0)),(1.0/(1.01-M))); \\\n" " vl = 0.5*(sqrt((P-V-vminm)*(P-V-vminm)+0.01)+(P-V-vminm))+vminm; \\\n" " mac1 = -AV2*pow(vl,(M-1.0)); \\\n" " if (mac1rValue, ASK_IN_NOISE, instance->VBICSELFTtotNoiseIndex));\"\n" " );\n" " real inoise_itzf `P(ask=\"yes\" spice:name=\"inoise.itzf\" info=\"itzf shot thermal noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTshotSrcIndex, ITZF_NOISE));\"\n" " );\n" " real inoise_ibe `P(ask=\"yes\" spice:name=\"inoise.ibe\" info=\"ibe shot thermal noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTshotSrcIndex, IBE_NOISE));\"\n" " );\n" " real inoise_ibefn `P(ask=\"yes\" spice:name=\"inoise.ibefn\" info=\"ibe flicker thermal noise\"\n" " mica:ask=\"return(FLICKERnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTflickerSrcIndex, IBE_FLICKER));\"\n" " );\n" " real inoise_rcx `P(ask=\"yes\" spice:name=\"inoise.rcx\" info=\"rcx collector thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RCX_NOISE));\"\n" " );\n" " real inoise_rci `P(ask=\"yes\" spice:name=\"inoise.rci\" info=\"rci collector thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RCI_NOISE));\"\n" " );\n" " real inoise_rbx `P(ask=\"yes\" spice:name=\"inoise.rbx\" info=\"rbx base thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RBX_NOISE));\"\n" " );\n" " real inoise_rbi `P(ask=\"yes\" spice:name=\"inoise.rbi\" info=\"rbi base thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RBI_NOISE));\"\n" " );\n" " real inoise_re `P(ask=\"yes\" spice:name=\"inoise.re\" info=\"re emitter thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RE_NOISE));\"\n" " );\n" " real inoise_rs `P(ask=\"yes\" spice:name=\"inoise.rs\" info=\"rs thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RS_NOISE));\"\n" " );\n" " real inoise_iccp `P(ask=\"yes\" spice:name=\"inoise.iccp\" info=\"iccp shot noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTshotSrcIndex, ICCP_NOISE));\"\n" " );\n" " real inoise_ibep `P(ask=\"yes\" spice:name=\"inoise.ibep\" info=\"ibep shot noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTshotSrcIndex, IBEP_NOISE)); \"\n" " );\n" " real inoise_ibepfn `P(ask=\"yes\" spice:name=\"inoise.ibepfn\" info=\"ibep flicker thermal noise\"\n" " mica:ask=\"return(FLICKERnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTflickerSrcIndex, IBEP_FLICKER));\"\n" " );\n" " real inoise_rbp `P(ask=\"yes\" spice:name=\"inoise.rbp\" info=\"rbp thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_IN_NOISE, instance->VBICSELFTthermalSrcIndex, RBP_NOISE));\"\n" " );\n" " real onoise `P(ask=\"yes\" spice:name=\"onoise\" info=\"Total noise\"\n" " mica:ask=\"return(TOTnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTtotNoiseIndex));\"\n" " );\n" " real onoise_itzf `P(ask=\"yes\" spice:name=\"onoise.itzf\" info=\"itzf shot thermal noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTshotSrcIndex, ITZF_NOISE));\"\n" " );\n" " real onoise_ibe `P(ask=\"yes\" spice:name=\"onoise.ibe\" info=\"ibe shot thermal noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTshotSrcIndex, IBE_NOISE)); \"\n" " );\n" " real onoise_ibefn `P(ask=\"yes\" spice:name=\"onoise.ibefn\" info=\"ibe flicker thermal noise\"\n" " mica:ask=\"return(FLICKERnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTflickerSrcIndex, IBE_FLICKER));\"\n" " );\n" " real onoise_rcx `P(ask=\"yes\" spice:name=\"onoise.rcx\" info=\"rcx collector thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RCX_NOISE));\"\n" " );\n" " real onoise_rci `P(ask=\"yes\" spice:name=\"onoise.rci\" info=\"rci collector thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RCI_NOISE));\"\n" " );\n" " real onoise_rbx `P(ask=\"yes\" spice:name=\"onoise.rbx\" info=\"rbx base thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RBX_NOISE));\"\n" " );\n" " real onoise_rbi `P(ask=\"yes\" spice:name=\"onoise.rbi\" info=\"rbi base thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RBI_NOISE));\"\n" " );\n" " real onoise_re `P(ask=\"yes\" spice:name=\"onoise.re\" info=\"re emitter thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RE_NOISE));\"\n" " );\n" " real onoise_rs `P(ask=\"yes\" spice:name=\"onoise.rs\" info=\"rs thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RS_NOISE));\"\n" " );\n" " real onoise_iccp `P(ask=\"yes\" spice:name=\"onoise.iccp\" info=\"iccp shot noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTshotSrcIndex, ICCP_NOISE));\"\n" " );\n" " real onoise_ibep `P(ask=\"yes\" spice:name=\"onoise.ibep\" info=\"ibep shot noise\"\n" " mica:ask=\"return(SHOTnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTshotSrcIndex, IBEP_NOISE)); \"\n" " );\n" " real onoise_ibepfn `P(ask=\"yes\" spice:name=\"onoise.ibepfn\" info=\"ibep flicker thermal noise\"\n" " mica:ask=\"return(FLICKERnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTflickerSrcIndex, IBEP_FLICKER));\"\n" " );\n" " real onoise_rbp `P(ask=\"yes\" spice:name=\"onoise.rbp\" info=\"rbp thermal noise\"\n" " mica:ask=\"return(THERMALnoiseAsk(&value->rValue, ASK_OUT_NOISE, instance->VBICSELFTthermalSrcIndex, RBP_NOISE));\"\n" " );\n" "\n" " analog begin\n" "\n" " `INITIAL_MODEL\n" " begin // begin loadmodel block: code independent of instance parameters or bias\n" " if (`PGIVEN(shrink)) begin\n" " shrinklFactor=1.0-shrink/100.0;\n" " if (`PGIVEN(shrink2))\n" " shrinkaFactor=1.0-shrink2/100.0;\n" " else\n" " shrinkaFactor=shrinklFactor*shrinklFactor;\n" " end else begin\n" " shrinklFactor=`SHRINKL;\n" " if (`PGIVEN(shrink2))\n" " shrinkaFactor=1.0-shrink2/100.0;\n" " else\n" " shrinkaFactor=`SHRINKA;\n" " end\n" "\n" " if (`PGIVEN(npn))\n" " VBICtype = `NPN;\n" " else if (`PGIVEN(pnp))\n" " VBICtype = `PNP;\n" " else\n" " VBICtype = `NPN;\n" "`ifdef insideADMS\n" " VBICtypeName = (VBICtype==`NPN)?\"Vertical npn\":\"Vertical pnp\";\n" "`endif\n" " end // end loadmodel block\n" "\n" "//\n" "// Temperature mappings\n" "//\n" "\n" " `INITIAL_INSTANCE\n" " begin // begin loadinstance block: code independent of bias\n" "`ifdef insideADMS\n" " INSTANCEmodel = $model;\n" " INSTANCElevel = level;\n" " INSTANCEtype=VBICtypeName;\n" "`endif\n" " instanceShrinklFactor=shrinklFactor;\n" " instanceShrinkaFactor=shrinkaFactor;\n" " if (`PGIVEN(shrink2))\n" " meff = m*mag*area*(1.0-shrink2/100.0);\n" " else if (`PGIVEN(shrink))\n" " meff = m*mag*area*(1.0-shrink/100.0)*(1.0-shrink/100.0);\n" " else\n" " meff = m*mag*area*`SHRINKA;\n" " end // end loadinstance block\n" " Tini = `TABS+tnom;\n" " Vrth = V(b_rth);\n" " Tdev = $temperature+dtemp+Vrth;\n" " Tdev = Tdev-`TABS;\n" " if (Tdevtmax)\n" " Tdev = tmax;\n" " Tdev = Tdev+`TABS;\n" " Vtv = `KB*Tdev/`QQ;\n" " rT = Tdev/Tini;\n" " dT = Tdev-Tini;\n" " ikf_t = ikf*pow(rT,xikf);\n" " if (`PGIVEN(xrcx))\n" " rcx_t = rcx*pow(rT,xrcx);\n" " else\n" " rcx_t = rcx*pow(rT,xrc);\n" " if (`PGIVEN(xrci))\n" " rci_t = rci*pow(rT,xrci);\n" " else\n" " rci_t = rci*pow(rT,xrc);\n" " if (`PGIVEN(xrbx))\n" " rbx_t = rbx*pow(rT,xrbx);\n" " else\n" " rbx_t = rbx*pow(rT,xrb);\n" " if (`PGIVEN(xrbi))\n" " rbi_t = rbi*pow(rT,xrbi);\n" " else\n" " rbi_t = rbi*pow(rT,xrb);\n" " re_t = re*pow(rT,xre);\n" " rs_t = rs*pow(rT,xrs);\n" " if (`PGIVEN(xrbp))\n" " rbp_t = rbp*pow(rT,xrbp);\n" " else\n" " rbp_t = rbp*pow(rT,xrc);\n" " is_t = is*pow((pow(rT,xis)*exp(-ea*(1.0-rT)/Vtv)),(1.0/nf));\n" " isrr_t = isrr*pow((pow(rT,xisr)*exp(-dear*(1.0-rT)/Vtv)),(1.0/nr));\n" " isp_t = isp*pow((pow(rT,xis)*exp(-eap*(1.0-rT)/Vtv)),(1.0/nfp));\n" " ibei_t = ibei*pow((pow(rT,xii)*exp(-eaie*(1.0-rT)/Vtv)),(1.0/nei));\n" " iben_t = iben*pow((pow(rT,xin)*exp(-eane*(1.0-rT)/Vtv)),(1.0/nen));\n" " ibci_t = ibci*pow((pow(rT,xii)*exp(-eaic*(1.0-rT)/Vtv)),(1.0/nci));\n" " ibcn_t = ibcn*pow((pow(rT,xin)*exp(-eanc*(1.0-rT)/Vtv)),(1.0/ncn));\n" " ibeip_t = ibeip*pow((pow(rT,xii)*exp(-eaic*(1.0-rT)/Vtv)),(1.0/nci));\n" " ibenp_t = ibenp*pow((pow(rT,xin)*exp(-eanc*(1.0-rT)/Vtv)),(1.0/ncn));\n" " ibcip_t = ibcip*pow((pow(rT,xii)*exp(-eais*(1.0-rT)/Vtv)),(1.0/ncip));\n" " ibcnp_t = ibcnp*pow((pow(rT,xin)*exp(-eans*(1.0-rT)/Vtv)),(1.0/ncnp));\n" " nf_t = nf*(1.0+dT*tnf);\n" " nr_t = nr*(1.0+dT*tnf);\n" " avc2_t = avc2*(1.0+dT*tavc);\n" " vbbe_t = vbbe*(1.0+dT*(tvbbe1+dT*tvbbe2));\n" " nbbe_t = nbbe*(1.0+dT*tnbbe);\n" " `psibi(pe_t,pe,eaie,Vtv,rT);\n" " `psibi(pc_t,pc,eaic,Vtv,rT);\n" " `psibi(ps_t,ps,eais,Vtv,rT);\n" " cje_t = cje*pow(pe/pe_t,me);\n" " cjc_t = cjc*pow(pc/pc_t,mc);\n" " cjep_t = cjep*pow(pc/pc_t,mc);\n" " cjcp_t = cjcp*pow(ps/ps_t,ms);\n" " gamm_t = gamm*pow(rT,xis)*exp(-ea*(1.0-rT)/Vtv);\n" " vo_t = vo*pow(rT,xvo);\n" " ebbe_t = exp(-vbbe_t/(nbbe_t*Vtv));\n" " if (ibbe>0.0)\n" " maxvIbbe= nbbe_t*Vtv*ln(ebbe_t+`PNJMAXI/ibbe);\n" " else\n" " maxvIbbe= 0.0;\n" " if (is_t>0.0)\n" " maxvIfi = nf_t*Vtv*ln(1.0+`PNJMAXI/is_t);\n" " else\n" " maxvIfi = 0.0;\n" " if (is_t>0.0&&isrr_t>0.0)\n" " maxvIri = nr_t*Vtv*ln(1.0+`PNJMAXI/(is_t*isrr_t));\n" " else\n" " maxvIri = 0.0;\n" " if (isp_t>0.0)\n" " maxvIp = nfp*Vtv*ln(1.0+`PNJMAXI/isp_t);\n" " else\n" " maxvIp = 0.0;\n" " if (ibei_t>0.0)\n" " maxvIbei= nei*Vtv*ln(1.0+`PNJMAXI/ibei_t);\n" " else\n" " maxvIbei= 0.0;\n" " if (iben_t>0.0)\n" " maxvIben= nen*Vtv*ln(1.0+`PNJMAXI/iben_t);\n" " else\n" " maxvIben= 0.0;\n" " if (ibci_t>0.0)\n" " maxvIbci= nci*Vtv*ln(1.0+`PNJMAXI/ibci_t);\n" " else\n" " maxvIbci= 0.0;\n" " if (ibcn_t>0.0)\n" " maxvIbcn= ncn*Vtv*ln(1.0+`PNJMAXI/ibcn_t);\n" " else\n" " maxvIbcn= 0.0;\n" " if (ibeip_t>0.0)\n" " maxvIbeip= nci*Vtv*ln(1.0+`PNJMAXI/ibeip_t);\n" " else\n" " maxvIbeip= 0.0;\n" " if (ibenp_t>0.0)\n" " maxvIbenp= ncn*Vtv*ln(1.0+`PNJMAXI/ibenp_t);\n" " else\n" " maxvIbenp= 0.0;\n" " if (ibcip_t>0.0)\n" " maxvIbcip= ncip*Vtv*ln(1.0+`PNJMAXI/ibcip_t);\n" " else\n" " maxvIbcip= 0.0;\n" " if (ibcnp_t>0.0)\n" " maxvIbcnp= ncnp*Vtv*ln(1.0+`PNJMAXI/ibcnp_t);\n" " else\n" " maxvIbcnp= 0.0;\n" " VmaxExp = ln(maxexp);\n" "\n" "//\n" "// Parameter mappings\n" "//\n" "\n" " Gcx = rcx_t>1.0e-3 ? 1.0/rcx_t : 1.0e3;\n" " Gci = rci_t>1.0e-3 ? 1.0/rci_t : 1.0e3;\n" " Gbx = rbx_t>1.0e-3 ? 1.0/rbx_t : 1.0e3;\n" " Gbi = rbi_t>1.0e-3 ? 1.0/rbi_t : 1.0e3;\n" " Ge = re_t >1.0e-3 ? 1.0/re_t : 1.0e3;\n" " Gbp = rbp_t>1.0e-3 ? 1.0/rbp_t : 1.0e3;\n" " Gs = rs_t >1.0e-3 ? 1.0/rs_t : 1.0e3;\n" " Gth = rth >1.0e-3 ? 1.0/rth : 1.0e3;\n" " Ivef = vef >0.0 ? 1.0/vef : 0.0;\n" " Iver = ver >0.0 ? 1.0/ver : 0.0;\n" " Iikf = ikf >0.0 ? 1.0/ikf_t : 0.0;\n" " Iikr = ikr >0.0 ? 1.0/ikr : 0.0;\n" " Iikp = ikp >0.0 ? 1.0/ikp : 0.0;\n" " Ivo = vo >0.0 ? 1.0/vo_t : 0.0;\n" " Ihrcf = hrcf >0.0 ? 1.0/hrcf : 0.0;\n" " Ivtf = vtf >0.0 ? 1.0/vtf : 0.0;\n" " Iitf = itf >0.0 ? 1.0/itf : 0.0;\n" " sltf = itf >0.0 ? 0.0 : 1.0;\n" "\n" "//\n" "// Branch voltages\n" "//\n" "\n" " Vbei = VBICtype*V(b_bei);\n" " Vbex = VBICtype*V(b_bex);\n" " Vbci = VBICtype*V(b_bci);\n" " Vbcx = VBICtype*V(b_bcx);\n" " Vcei = VBICtype*V(b_cei);\n" " Vbep = VBICtype*V(b_bep);\n" " Vbcp = VBICtype*V(b_bcp);\n" " Vcep = VBICtype*V(b_cep);\n" " Vxf1 = V(b_xf1);\n" " Vxf2 = V(b_xf2);\n" " Vbe = V(b_be);\n" " Vbc = V(b_bc);\n" " Vrcx = V(b_rcx);\n" " Vrci = VBICtype*V(b_rci);\n" " Vrbx = V(b_rbx);\n" " Vrbi = V(b_rbi);\n" " Vre = V(b_re);\n" " Vrbp = V(b_rbp);\n" " Vrs = V(b_rs);\n" "\n" "//\n" "// Electrical branch constituent relations\n" "//\n" "\n" "//\n" "// Depletion charges\n" "//\n" "\n" " `qj(qdbe,Vbei,pe_t,me,fc,aje);\n" " `qj(qdbex,Vbex,pe_t,me,fc,aje);\n" " `qjrt(qdbc,Vbci,pc_t,mc,fc,ajc,vrt,art);\n" " `qjrt(qdbep,Vbep,pc_t,mc,fc,ajc,vrt,art);\n" " if (cjcp>0.0) begin\n" " `qj(qdbcp,Vbcp,ps_t,ms,fc,ajs);\n" " end else\n" " qdbcp = 0.0;\n" "\n" "//\n" "// Transport current of main transistor\n" "//\n" "\n" " afac = 1.0/(nf_t*Vtv);\n" " `expLinA(expi,Vbei,maxvIfi,afac);\n" " Ifi = is_t*(expi-1.0);\n" " afac = 1.0/(nr_t*Vtv);\n" " `expLinA(expi,Vbci,maxvIri,afac);\n" " Iri = is_t*isrr_t*(expi-1.0);\n" " q1z = 1.0+qdbe*Iver+qdbc*Ivef;\n" " q1 = 0.5*(sqrt((q1z-1.0e-4)*(q1z-1.0e-4)+1.0e-8)+q1z-1.0e-4)+1.0e-4;\n" " q2 = Ifi*Iikf+Iri*Iikr;\n" " if (qbm<0.5) begin\n" " arg = pow(q1,1.0/nkf)+4.0*q2;\n" " if (arg>1.0e-8)\n" " qb = 0.5*(q1+pow(arg,nkf));\n" " else\n" " qb = 0.5*(q1+pow(1.0e-8,nkf));\n" " end else begin\n" " arg = 1.0+4.0*q2;\n" " if (arg>1.0e-8)\n" " qb = 0.5*q1*(1.0+pow(arg,nkf));\n" " else\n" " qb = 0.5*q1*(1.0+pow(1.0e-8,nkf));\n" " end\n" " Itzr = Iri/qb;\n" " Itzf = Ifi/qb;\n" " Itxf = Vxf2;\n" "\n" "//\n" "// Transport current of parasitic transistor\n" "//\n" "\n" " if (isp>0.0) begin\n" " afac = 1.0/(nfp*Vtv);\n" " `expLinA(expi,Vbep,maxvIp,afac);\n" " `expLinA(expx,Vbci,maxvIp,afac);\n" " Ifp = isp_t*(wsp*expi+(1.0-wsp)*expx-1.0);\n" " q2p = Ifp*Iikp;\n" " arg = 1.0+4.0*q2p;\n" " if (arg>1.0e-8)\n" " qbp = 0.5*(1.0+sqrt(arg));\n" " else\n" " qbp = 0.5*(1.0+sqrt(1.0e-8));\n" " `expLinA(expi,Vbcp,maxvIp,afac);\n" " Irp = isp_t*(expi-1.0);\n" " Iccp = (Ifp-Irp)/qbp;\n" " end else begin\n" " Ifp = 0.0;\n" " qbp = 1.0;\n" " Iccp = 0.0;\n" " end\n" "\n" "//\n" "// Diode-like currents for main transistor (includes\n" "// exponential-like breakdown for base-emitter)\n" "// and base-emitter of parasitic transistor\n" "//\n" "\n" " if (wbe==1.0) begin\n" " afac = 1.0/(nei*Vtv);\n" " `expLinA(expi,Vbei,maxvIbei,afac);\n" " afac = 1.0/(nen*Vtv);\n" " `expLinA(expn,Vbei,maxvIben,afac);\n" " if (vbbe>0.0) begin\n" " Bvbe = -vbbe_t-Vbei;\n" " afac = 1.0/(nbbe_t*Vtv);\n" " `expLinA(expx,Bvbe,maxvIbbe,afac);\n" " Ibe = ibei_t*(expi-1.0)+iben_t*(expn-1.0)-ibbe*(expx-ebbe_t);\n" " end else\n" " Ibe = ibei_t*(expi-1.0)+iben_t*(expn-1.0);\n" " Ibex = 0.0;\n" " end else if (wbe==0.0) begin\n" " Ibe = 0.0;\n" " afac = 1.0/(nei*Vtv);\n" " `expLinA(expi,Vbex,maxvIbei,afac);\n" " afac = 1.0/(nen*Vtv);\n" " `expLinA(expn,Vbex,maxvIben,afac);\n" " if (vbbe>0.0) begin\n" " Bvbe = -vbbe_t-Vbei;\n" " afac = 1.0/(nbbe_t*Vtv);\n" " `expLinA(expx,Bvbe,maxvIbbe,afac);\n" " Ibex = ibei_t*(expi-1.0)+iben_t*(expn-1.0)-ibbe*(expx-ebbe_t);\n" " end else\n" " Ibex = ibei_t*(expi-1.0)+iben_t*(expn-1.0);\n" " end else begin\n" " afac = 1.0/(nei*Vtv);\n" " `expLinA(expi,Vbei,maxvIbei,afac);\n" " afac = 1.0/(nen*Vtv);\n" " `expLinA(expn,Vbei,maxvIben,afac);\n" " if (vbbe>0.0) begin\n" " Bvbe = -vbbe_t-Vbei;\n" " afac = 1.0/(nbbe_t*Vtv);\n" " `expLinA(expx,Bvbe,maxvIbbe,afac);\n" " Ibe = wbe*(ibei_t*(expi-1.0)+iben_t*(expn-1.0)-ibbe*(expx-ebbe_t));\n" " end else\n" " Ibe = wbe*(ibei_t*(expi-1.0)+iben_t*(expn-1.0));\n" " afac = 1.0/(nei*Vtv);\n" " `expLinA(expi,Vbex,maxvIbei,afac);\n" " afac = 1.0/(nen*Vtv);\n" " `expLinA(expn,Vbex,maxvIben,afac);\n" " if (vbbe>0.0) begin\n" " Bvbe = -vbbe_t-Vbei;\n" " afac = 1.0/(nbbe_t*Vtv);\n" " `expLinA(expx,Bvbe,maxvIbbe,afac);\n" " Ibex = (1.0-wbe)*(ibei_t*(expi-1.0)+iben_t*(expn-1.0)-ibbe*(expx-ebbe_t));\n" " end else\n" " Ibex = (1.0-wbe)*(ibei_t*(expi-1.0)+iben_t*(expn-1.0));\n" " end\n" " afac = 1.0/(nci*Vtv);\n" " `expLinA(expi,Vbci,maxvIbci,afac);\n" " afac = 1.0/(ncn*Vtv);\n" " `expLinA(expn,Vbci,maxvIbcn,afac);\n" " Ibcj = ibci_t*(expi-1.0)+ibcn_t*(expn-1.0);\n" " if ((ibeip>0.0)||(ibenp>0.0)) begin\n" " afac = 1.0/(nci*Vtv);\n" " `expLinA(expi,Vbep,maxvIbeip,afac);\n" " afac = 1.0/(ncn*Vtv);\n" " `expLinA(expn,Vbep,maxvIbenp,afac);\n" " Ibep = ibeip_t*(expi-1.0)+ibenp_t*(expn-1.0);\n" " end else\n" " Ibep = 0.0;\n" "\n" "//\n" "// Avalanche current\n" "//\n" "\n" " if (avc1>0.0) begin\n" " `avalm(avalf,Vbci,pc_t,mc,avc1,avc2_t,VmaxExp);\n" " Igc = (Itxf-Itzr-Ibcj)*avalf;\n" " end else\n" " Igc = 0.0;\n" " Ibc = Ibcj-Igc;\n" "\n" "//\n" "// Base pushout charge factors\n" "//\n" "\n" " arg = Vbci/Vtv;\n" " `expLin(expi,arg,VmaxExp);\n" " arg = Vbcx/Vtv;\n" " `expLin(expx,arg,VmaxExp);\n" " Kbci = sqrt(1.0+gamm_t*expi);\n" " Kbcx = sqrt(1.0+gamm_t*expx);\n" "\n" "//\n" "// Diode-like current for base-collector of parasitic transistor\n" "//\n" "\n" " if ((ibcip>0.0)||(ibcnp>0.0)) begin\n" " afac = 1.0/(ncip*Vtv);\n" " `expLinA(expi,Vbcp,maxvIbcip,afac);\n" " afac = 1.0/(ncnp*Vtv);\n" " `expLinA(expn,Vbcp,maxvIbcnp,afac);\n" " Ibcp = ibcip_t*(expi-1.0)+ibcnp_t*(expn-1.0);\n" " end else\n" " Ibcp = 0.0;\n" "\n" "//\n" "// Transit time\n" "//\n" "\n" " sgIf = Ifi>0.0?1.0:0.0;\n" " rIf = Ifi*sgIf*Iitf;\n" " mIf = rIf/(rIf+1.0);\n" " arg = Vbci*Ivtf/1.44;\n" " `expLin(expi,arg,VmaxExp);\n" " tff = tf*(1.0+qtf*q1)*(1.0+xtf*expi*(sltf+mIf*mIf)*sgIf);\n" "\n" "//\n" "// Charge elements\n" "//\n" "\n" " Qbe = cje_t*qdbe*wbe+tff*Ifi/qb;\n" " Qbex = cje_t*qdbex*(1.0-wbe);\n" " Qbc = cjc_t*qdbc+tr*Iri+qco*Kbci;\n" " Qbcx = qco*Kbcx;\n" " Qbep = cjep_t*qdbep+tr*Ifp;\n" " Qbcp = cjcp_t*qdbcp+ccso*Vbcp;\n" " Qbeo = Vbe*cbeo;\n" " Qbco = Vbc*cbco;\n" "\n" "//\n" "// Resistance branch currents\n" "//\n" "\n" " Ircx = Vrcx*Gcx;\n" " rKp1 = (Kbci+1.0)/(Kbcx+1.0);\n" " Iohm = (Vrci+Vtv*(Kbci-Kbcx-ln(rKp1)))*Gci;\n" " derf = Ivo*Iohm/(Gci*(1.0+0.5*Ivo*Ihrcf*sqrt(Vrci*Vrci+0.01)));\n" " Irci = Iohm/sqrt(1+derf*derf);\n" " Irbx = Vrbx*Gbx;\n" " Irbi = Vrbi*qb*Gbi;\n" " Ire = Vre*Ge;\n" " Irbp = Vrbp*qbp*Gbp;\n" " Irs = Vrs*Gs;\n" "\n" "//\n" "// Thermal network elements\n" "//\n" "\n" " Ith = -(Ibe*Vbei+Ibc*Vbci+(Itxf-Itzr)*Vcei+Ibex*Vbex+Ibep*Vbep+Irs*Vrs+Ibcp*Vbcp+Iccp*Vcep+Ircx*Vrcx+Irci*Vrci+Irbx*Vrbx+Irbi*Vrbi+Ire*Vre+Irbp*Vrbp);\n" " Irth = Vrth*Gth;\n" " Qcth = Vrth*cth;\n" "\n" "//\n" "// Excess phase elements\n" "//\n" "\n" " Ixf1 = Vxf2-Itzf;\n" " Ixf2 = Vxf2-Vxf1;\n" " Qxf1 = td*Vxf1;\n" " Qxf2 = td*Vxf2/3;\n" "\n" "//\n" "// Add gmin current to diode-like branches\n" "//\n" "\n" " Ibe = Ibe + `GMIN * Vbei;\n" " Ibex = Ibex + `GMIN * Vbex;\n" " Ibep = Ibep + `GMIN * Vbep;\n" " Ibc = Ibc + `GMIN * Vbci;\n" " Ibcp = Ibcp + `GMIN * Vbcp;\n" "\n" "//\n" "// Apply multiplicity factor and device type (+1 or -1, polarity)\n" "// (resistors apart from Irci do not depend on polarity)\n" "//\n" "\n" " Ibe = VBICtype * meff * Ibe;\n" " Ibex = VBICtype * meff * Ibex;\n" " Itzf = VBICtype * meff * Itzf;\n" " Itxf = VBICtype * meff * Itxf;\n" " Itzr = VBICtype * meff * Itzr;\n" " Ibc = VBICtype * meff * Ibc;\n" " Ibep = VBICtype * meff * Ibep;\n" " Ircx = meff * Ircx;\n" " Irci = VBICtype * meff * Irci;\n" " Irbx = meff * Irbx;\n" " Irbi = meff * Irbi;\n" " Ire = meff * Ire;\n" " Irbp = meff * Irbp;\n" " Qbe = VBICtype * meff * Qbe;\n" " Qbex = VBICtype * meff * Qbex;\n" " Qbc = VBICtype * meff * Qbc;\n" " Qbcx = VBICtype * meff * Qbcx;\n" " Qbep = VBICtype * meff * Qbep;\n" " Qbeo = meff * Qbeo;\n" " Qbco = meff * Qbco;\n" " Ibcp = VBICtype * meff * Ibcp;\n" " Iccp = VBICtype * meff * Iccp;\n" " Irs = meff * Irs;\n" " Qbcp = VBICtype * meff * Qbcp;\n" " Ith = meff * Ith;\n" " Irth = meff * Irth;\n" " Qcth = meff * Qcth;\n" "\n" "//\n" "// Branch contributions to VBIC model\n" "//\n" "\n" " I(b_bei) <+ Ibe;\n" " I(b_bex) <+ Ibex;\n" " I(b_cei) <+ Itxf;\n" " I(b_eci) <+ Itzr;\n" " I(b_bci) <+ Ibc;\n" " I(b_bep) <+ Ibep;\n" " I(b_rcx) <+ Ircx;\n" " I(b_rci) <+ Irci;\n" " I(b_rbx) <+ Irbx;\n" " I(b_rbi) <+ Irbi;\n" " I(b_re) <+ Ire;\n" " I(b_rbp) <+ Irbp;\n" " I(b_bei) <+ ddt(Qbe);\n" " I(b_bex) <+ ddt(Qbex);\n" " I(b_bci) <+ ddt(Qbc);\n" " I(b_bcx) <+ ddt(Qbcx);\n" " I(b_bep) <+ ddt(Qbep);\n" " I(b_be) <+ ddt(Qbeo);\n" " I(b_bc) <+ ddt(Qbco);\n" " I(b_bcp) <+ Ibcp;\n" " I(b_cep) <+ Iccp;\n" " I(b_rs) <+ Irs;\n" " I(b_bcp) <+ ddt(Qbcp);\n" " I(b_xf1) <+ Ixf1;\n" " I(c_xf1) <+ ddt(Qxf1);\n" " I(b_xf2) <+ Ixf2;\n" " I(c_xf2) <+ ddt(Qxf2);\n" " I(b_rth) <+ Irth;\n" " I(b_rth) <+ ddt(Qcth);\n" " I(b_ith) <+ Ith;\n" "\n" "`ifdef insideADMS\n" "`else\n" " // \n" " begin // begin noise block\n" " I(b_bei) <+ white_noise(2*`QQ*abs(Ibe))+flicker_noise(meff*kfn*pow(abs(Ibe/meff),afn),bfn);\n" " I(b_bex) <+ white_noise(2*`QQ*abs(Ibex))+flicker_noise(meff*kfn*pow(abs(Ibex/meff),afn),bfn);\n" " I(b_cei) <+ white_noise(2*`QQ*abs(Itzf));\n" " I(b_bep) <+ white_noise(2*`QQ*abs(Ibep))+flicker_noise(meff*kfn*pow(abs(Ibep/meff),afn),bfn);\n" " I(b_rcx) <+ white_noise(4*`KB*Tdev*Gcx*meff);\n" " I(b_rci) <+ white_noise(4*`KB*Tdev*((abs(Irci)+1.0e-10*Gci)/(abs(Vrci)+1.0e-10))*meff);\n" " I(b_rbx) <+ white_noise(4*`KB*Tdev*Gbx*meff);\n" " I(b_rbi) <+ white_noise(4*`KB*Tdev*qb*Gbi*meff);\n" " I(b_re) <+ white_noise(4*`KB*Tdev*Ge*meff);\n" " I(b_rbp) <+ white_noise(4*`KB*Tdev*qbp*Gbp*meff);\n" " I(b_cep) <+ white_noise(2*`QQ*abs(Iccp));\n" " I(b_rs) <+ white_noise(4*`KB*Tdev*Gs*meff);\n" " end // end noise block\n" " // \n" "`endif\n" "\n" " `FINAL_STEP\n" " begin\n" "\n" " // conductances of resistance elements\n" " Ircx_Vrcx = `DERIVATE(Ircx,V(b_rcx));\n" " Irci_Vrci = `DERIVATE(Irci,V(b_rci));\n" " Irbx_Vrbx = `DERIVATE(Irbx,V(b_rbx));\n" " Irbi_Vrbi = `DERIVATE(Irbi,V(b_rbi));\n" " Irbp_Vrbp = `DERIVATE(Irbp,V(b_rbp));\n" " Ire_Vre = `DERIVATE(Ire,V(b_re));\n" " Irs_Vrs = `DERIVATE(Irs,V(b_rs));\n" "\n" " // conductances\n" " gm = `DERIVATE(Itzf,V(b_bei))+`DERIVATE(Itzf,V(b_bci))-`DERIVATE(Itzr,V(b_bei))-`DERIVATE(Itzr,V(b_bci));\n" " go = `DERIVATE(Itzr,V(b_bci))-`DERIVATE(Itzf,V(b_bci));\n" " gpi = `DERIVATE(Ibe,V(b_bei));\n" " gpix = `DERIVATE(Ibex,V(b_bex));\n" " gmu = `DERIVATE(Ibc,V(b_bci));\n" " gmux = `DERIVATE(Ibep,V(b_bep));\n" "\n" " // conductances (for backward compatibility with level 2)\n" " ibc_vbci = gmu;\n" " ibcp_vbcp = `DERIVATE(Ibcp,V(b_bcp));\n" " ibe_vbei = gpi;\n" " ibep_vbep = gmux;\n" " ibex_vbex = gpix;\n" " iccp_vbci = `DERIVATE(Iccp,V(b_bci));\n" " iccp_vbcp = `DERIVATE(Iccp,V(b_bcp));\n" " iccp_vbep = `DERIVATE(Iccp,V(b_bep));\n" " irbi_vbci = `DERIVATE(Irbi,V(b_bci));\n" " irbi_vbei = `DERIVATE(Irbi,V(b_bei));\n" " irbp_vbci = `DERIVATE(Irbp,V(b_bci));\n" " irci_vbci = `DERIVATE(Irci,V(b_bci));\n" " itzf_vbci = `DERIVATE(Itzf,V(b_bci));\n" " itzf_vbei = `DERIVATE(Itzf,V(b_bei));\n" " itzr_vbci = `DERIVATE(Itzr,V(b_bci));\n" " itzr_vbei = `DERIVATE(Itzr,V(b_bei));\n" "\n" " // capacitances\n" " cpi = `DERIVATE(Qbe,V(b_bei));\n" " cpix = `DERIVATE(Qbex,V(b_bex));\n" " cmu = `DERIVATE(Qbc,V(b_bci));\n" " cmux = `DERIVATE(Qbcx,V(b_bcx));\n" " cpip = `DERIVATE(Qbep,V(b_bep));\n" " ccs = `DERIVATE(Qbcp,V(b_bcp));\n" " cbeoXX = `DERIVATE(Qbeo,V(b_be));\n" " cbcoXX = `DERIVATE(Qbco,V(b_bc));\n" "\n" " // crude estimate of ft, intrinsic component just has\n" " // overlap capacitances added, and the extrinsic ft\n" " // will be affected by extrinsic elements like Rc*Cc,\n" " // proper terminal simulations are needed to get the\n" " // actual ft, this is just an estimate: gm/(2*pi*Cbase)\n" " ft_int = 0.1591549*abs(gm)/(1.0e-20+abs(cpi+cpix+cmu+cmux+cpip+cbeoXX+cbcoXX));\n" "\n" " // capacitances (for backward compatibility with level 2)\n" " qbc_vbci = cmu;\n" " qbco_vbc = cbcoXX;\n" " qbcp_vbcp = ccs;\n" " qbcx_vbcx = `DERIVATE(Qbcx,V(b_bcx)); // not equivalent to level 2, Vbcx=Vbci-Vrcx\n" " qbe_vbci = `DERIVATE(Qbe,V(b_bci));\n" " qbe_vbei = cpi;\n" " qbeo_vbe = cbeoXX;\n" " qbep_vbci = `DERIVATE(Qbep,V(b_bci));\n" " qbep_vbep = cpip;\n" " qbex_vbex = cpix;\n" "\n" "\n" " // resistances\n" " rci_mod = Gci/((abs(Irci)+1.0e-10*Gci)/(abs(Vrci)+1.0e-10));\n" " rci_eff = `DERIVATE(Irci,V(b_rci));\n" " rci_eff = (rci_eff==0)?rci_eff:(1/rci_eff);\n" " rbi_eff = (qb*Gbi);\n" " rbi_eff = (rbi_eff==0)?rbi_eff:((1/rbi_eff)/meff);\n" " rbp_eff = (qbp*Gbp);\n" " rbp_eff = (rbp_eff==0)?rbp_eff:((1/rbp_eff)/meff);\n" "\n" " // terminal currents\n" " ic = Itzf - Itzr - Ibc - Ibcp - Ibep;\n" " ib = Ibe + Ibex + Ibc + Ibep + Iccp;\n" " ie = -Itzf + Itzr - Ibe - Ibex;\n" " isub = -ic - ib - ie;\n" " ic = VBICtype * ic;\n" " ib = VBICtype * ib;\n" " ie = VBICtype * ie;\n" " isub = VBICtype * isub;\n" "\n" " // power currents\n" " powerT =-Ith;\n" " powerD = Irth;\n" " tauTh = cth/Gth;\n" "\n" " // power currents (for backward compatibility with level 2)\n" " p = powerT;\n" "\n" " // power currents (for backward compatibility with level 2)\n" " trise = dtemp;\n" "\n" " // terminal voltages\n" " Vce = V(b_be)-V(b_bc);\n" "\n" " end\n" "\n" " end\n" "endmodule\n" ;