Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_MOSFET_B4.h
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright 2002 Sandia Corporation. Under the terms
5 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
6 // Government retains certain rights in this software.
7 //
8 // Xyce(TM) Parallel Electrical Simulator
9 // Copyright (C) 2002-2014 Sandia Corporation
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //-----------------------------------------------------------------------------
24 
25 //-----------------------------------------------------------------------------
26 // Filename : $RCSfile: N_DEV_MOSFET_B4.h,v $
27 //
28 // Purpose :
29 //
30 // Special Notes :
31 //
32 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
33 //
34 // Creation Date : 11/25/06
35 //
36 // Revision Information:
37 // ---------------------
38 //
39 // Revision Number: $Revision: 1.57 $
40 //
41 // Revision Date : $Date: 2014/05/22 17:40:29 $
42 //
43 // Current Owner : $Author: erkeite $
44 //-----------------------------------------------------------------------------
45 
46 #ifndef Xyce_N_DEV_MOSFET_B4_h
47 #define Xyce_N_DEV_MOSFET_B4_h
48 
49 // ---------- Standard Includes ----------
50 #include <N_DEV_Configuration.h>
51 #include <map>
52 
53 // ---------- Xyce Includes ----------
54 #include <N_DEV_DeviceMaster.h>
55 #include <N_DEV_DeviceInstance.h>
56 #include <N_DEV_DeviceModel.h>
57 #include <N_DEV_DeviceBlock.h>
58 
59 #include <N_DEV_MOSFET1.h>
60 
61 namespace Xyce {
62 namespace Device {
63 namespace MOSFET_B4 {
64 
65 class Model;
66 class Instance;
67 
68 struct Traits : public DeviceTraits<Model, Instance, MOSFET1::Traits>
69 {
70  static const char *name() {return "BSIM4";}
71  static const char *deviceTypeName() {return "M level 14";}
72  static int numNodes() {return 4;}
73  static bool modelRequired() {return true;}
74  static bool isLinearDevice() {return false;}
75 
76  static Device *factory(const Configuration &configuration, const FactoryBlock &factory_block);
77  static void loadModelParameters(ParametricData<Model> &model_parameters);
78  static void loadInstanceParameters(ParametricData<Instance> &instance_parameters);
79 };
80 
81 //-----------------------------------------------------------------------------
82 // Struct : SizeDependParam
83 // Purpose : copied over from the 3f5 code. Almost no changes.
84 // Special Notes :
85 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
86 // Creation Date : 11/25/06
87 //-----------------------------------------------------------------------------
89 {
90  friend class Model;
91  friend class Instance;
92  friend class Master;
93 
94 private:
95  double Width;
96  double Length;
97  double NFinger;
98 
99  double cdsc;
100  double cdscb;
101  double cdscd;
102  double cit;
103  double nfactor;
104  double xj;
105  double vsat;
106  double at;
107  double a0;
108  double ags;
109  double a1;
110  double a2;
111  double keta;
112  double nsub;
113  double ndep;
114  double nsd;
115  double phin;
116  double ngate;
117  double gamma1;
118  double gamma2;
119  double vbx;
120  double vbi;
121  double vbm;
122  double xt;
123  double phi;
124  double litl;
125  double k1;
126  double kt1;
127  double kt1l;
128  double kt2;
129  double k2;
130  double k3;
131  double k3b;
132  double w0;
133  double dvtp0;
134  double dvtp1;
135  double lpe0;
136  double lpeb;
137  double dvt0;
138  double dvt1;
139  double dvt2;
140  double dvt0w;
141  double dvt1w;
142  double dvt2w;
143  double drout;
144  double dsub;
145  double vth0;
146  double ua;
147  double ua1;
148  double ub;
149  double ub1;
150  double uc;
151  double uc1;
152  double ud;
153  double ud1;
154  double up;
155  double lp;
156  double u0;
157  double eu;
158  double ute;
159  double voff;
160  double tvoff;
161  double minv;
162  double minvcv;
163  double vfb;
164  double delta;
165  double rdsw;
166  double rds0;
167  double rs0;
168  double rd0;
169  double rsw;
170  double rdw;
171  double prwg;
172  double prwb;
173  double prt;
174  double eta0;
175  double etab;
176  double pclm;
177  double pdibl1;
178  double pdibl2;
179  double pdiblb;
180  double fprout;
181  double pdits;
182  double pditsd;
183  double pscbe1;
184  double pscbe2;
185  double pvag;
186  double wr;
187  double dwg;
188  double dwb;
189  double b0;
190  double b1;
191  double alpha0;
192  double alpha1;
193  double beta0;
194  double agidl;
195  double bgidl;
196  double cgidl;
197  double egidl;
198  double agisl;
199  double bgisl;
200  double cgisl;
201  double egisl;
202  double aigc;
203  double bigc;
204  double cigc;
205  double aigs;
206  double bigs;
207  double cigs;
208  double aigd;
209  double bigd;
210  double cigd;
211  double aigbacc;
212  double bigbacc;
213  double cigbacc;
214  double aigbinv;
215  double bigbinv;
216  double cigbinv;
217  double nigc;
218  double nigbacc;
219  double nigbinv;
220  double ntox;
221  double eigbinv;
222  double pigcd;
223  double poxedge;
224  double xrcrg1;
225  double xrcrg2;
226  double lambda; // overshoot
227  double vtl; // thermal velocity limit
228  double xn; // back scattering parameter
229  double lc; // back scattering parameter
230  double tfactor; // ballistic transportation factor
231  double vfbsdoff; // S/D flatband offset voltage
232  double tvfbsdoff;
233 
234  // added for stress effect
235  double ku0;
236  double kvth0;
237  double ku0temp;
238  double rho_ref;
239  double inv_od_ref;
240  // added for well proximity effect
241  double kvth0we;
242  double k2we;
243  double ku0we;
244 
245  // CV model
246  double cgsl;
247  double cgdl;
248  double ckappas;
249  double ckappad;
250  double cf;
251  double clc;
252  double cle;
253  double vfbcv;
254  double noff;
255  double voffcv;
256  double acde;
257  double moin;
258 
259  // Pre-calculated constants
260  double dw;
261  double dl;
262  double leff;
263  double weff;
264 
265  double dwc;
266  double dlc;
267  double dwj;
268  double leffCV;
269  double weffCV;
270  double weffCJ;
272  double cgso;
273  double cgdo;
274  double cgbo;
275 
276  double u0temp;
277  double vsattemp;
278  double sqrtPhi;
279  double phis3;
280  double Xdep0;
281  double sqrtXdep0;
282  double theta0vb0;
283  double thetaRout;
284  double mstar;
285  double mstarcv;
286  double voffcbn;
287  double voffcbncv;
288  double rdswmin;
289  double rdwmin;
290  double rswmin;
291  double vfbsd;
292 
293  double cof1;
294  double cof2;
295  double cof3;
296  double cof4;
297  double cdep0;
298  double ToxRatio;
299  double Aechvb;
300  double Bechvb;
301  double ToxRatioEdge;
302  double AechvbEdgeS;
303  double AechvbEdgeD;
304  double BechvbEdge;
305  double ldeb;
306  double k1ox;
307  double k2ox;
308  double vfbzbfactor;
309 
310  // ERK. I added this to make temperature sweeps work.
312 };
313 
314 
315 //-----------------------------------------------------------------------------
316 // Class : Instance
317 // Purpose :
318 // Special Notes :
319 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
320 // Creation Date : 11/25/06
321 //-----------------------------------------------------------------------------
322 class Instance : public DeviceInstance
323 {
324  friend class SizeDependParam;
325  friend class ParametricData<Instance>;
326  friend class Model;
327  friend class Traits;friend class Master;
328 
329  // functions
330 public:
331 
332  Instance(
333  const Configuration & configuration,
334  const InstanceBlock & IB,
335  Model & Miter,
336  const FactoryBlock & factory_block);
337 
338  ~Instance();
339 
340 private:
341  Instance(const Instance &);
342  Instance &operator=(const Instance &);
343 
344 public:
345  void registerLIDs( const std::vector<int> & intLIDVecRef,
346  const std::vector<int> & extLIDVecRef );
347  void registerStateLIDs( const std::vector<int> & staLIDVecRef);
348  void registerStoreLIDs(const std::vector<int> & stoLIDVecRef);
349 
350  std::map<int,std::string> & getIntNameMap ();
351 
352  const std::vector< std::vector<int> > & jacobianStamp() const;
353  void registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec );
354 
355  void setupPointers ();
356 
357  bool processParams ();
358 
359  void debugJacStampOutput ();
360 
361  bool updateTemperature(const double & temp_tmp);
362  bool updateIntermediateVars ();
363  bool updatePrimaryState ();
364 
365  int polyDepletion(
366  double phi, double ngate, double epsgate,
367  double coxe, double Vgs_arg,
368  double & Vgs_eff, double & dVgs_eff_dVg);
369 
370  int NumFingerDiff(
371  double nf_arg, int minSD,
372  double & nuIntD, double & nuEndD, double & nuIntS, double & nuEndS);
373 
374  int PAeffGeo(
375  double nf_arg, int geo, int minSD,
376  double Weffcj, double DMCG, double DMCI, double DMDG,
377  double & Ps, double & Pd, double & As, double & Ad);
378 
379  int RdseffGeo(
380  double nf_arg,
381  int geo, int rgeo, int minSD,
382  double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
383  int Type, double & Rtot);
384 
385  int RdsEndIso(
386  double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
387  double nuEnd, int rgeo, int Type, double & Rend);
388 
389  int RdsEndSha(
390  double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG,
391  int rgeo, int Type, double nuEnd, double & Rend);
392 
393  int DioIjthVjmEval (
394  double Nvtm, double Ijth,
395  double Isb, double XExpBV, double & Vjm);
396 
397  // load functions, residual:
398  bool loadDAEQVector ();
399  bool loadDAEFVector ();
400 
401  void setupFVectorVars ();
402 
403  bool auxChargeCalculations ();
404  bool setupCapacitors_newDAE ();
405 
406  bool setupCapacitors_oldDAE ();
407 
408  // load functions, Jacobian:
409  bool loadDAEdQdx ();
410  bool loadDAEdFdx ();
411 
412  bool setIC ();
413 
414  inline bool isConverged();
415 
416  // Beginning of 3f5 stuff:
417  // attributes:
418 public:
419  // Getters and setters
421  {
422  return model_;
423  }
424 
425 private:
426 
427  Model & model_; //< Owning model
428 
429  double ueff;
430  double thetavth;
431  double von;
432  double vdsat;
433  double cgdo;
434  double qgdo;
435  double cgso;
436  double qgso;
437  double grbsb;
438  double grbdb;
439  double grbpb;
440  double grbps;
441  double grbpd;
442 
443  double vjsmFwd;
444  double vjsmRev;
445  double vjdmFwd;
446  double vjdmRev;
447  double XExpBVS;
448  double XExpBVD;
449  double SslpFwd;
450  double SslpRev;
451  double DslpFwd;
452  double DslpRev;
453  double IVjsmFwd;
454  double IVjsmRev;
455  double IVjdmFwd;
456  double IVjdmRev;
457 
458  double grgeltd;
459  double Pseff;
460  double Pdeff;
461  double Aseff;
462  double Adeff;
463 
464  double l;
465  double w;
466  double numberParallel; // PSpiceish "parallel copies" kludge
467  double drainArea;
468  double sourceArea;
469  double drainSquares;
470 
476  // stress effect instance param
477  double sa;
478  double sb;
479  double sd;
480  double sca;
481  double scb;
482  double scc;
483  double sc;
484 
485  double rbdb;
486  double rbsb;
487  double rbpb;
488  double rbps;
489  double rbpd;
490 
491  double delvto;
492  double xgw;
493  double ngcon;
494 
495  // added here to account stress effect instance dependence
496  double u0temp;
497  double vsattemp;
498  double vth0;
499  double vfb;
500  double vfbzb;
501  double vtfbphi1;
502  double vtfbphi2;
503  double k2;
504  double vbsc;
505  double k2ox;
506  double eta0;
507 
508  double icVDS;
509  double icVGS;
510  double icVBS;
511  double nf;
512  bool OFF;
513  int mode;
514  int trnqsMod;
515  int acnqsMod;
516  int rbodyMod;
517  int rgateMod;
518  int geoMod;
519  int rgeoMod;
520  int min;
521 
522 
523  // OP point
524  double Vgsteff;
525  double vgs_eff;
526  double vgd_eff;
527  double dvgs_eff_dvg;
528  double dvgd_eff_dvg;
529  double Vdseff;
530  double nstar;
531  double Abulk;
532  double EsatL;
533  double AbovVgst2Vtm;
534  double qinv;
535  double cd;
536  double cbs;
537  double cbd;
538  double csub;
539  double Igidl;
540  double Igisl;
541  double gm;
542  double gds;
543  double gmbs;
544  double gbd;
545  double gbs;
546 
547  double gbbs;
548  double gbgs;
549  double gbds;
550  double ggidld;
551  double ggidlg;
552  double ggidls;
553  double ggidlb;
554  double ggisld;
555  double ggislg;
556  double ggisls;
557  double ggislb;
558 
559  double Igcs;
560  double gIgcsg;
561  double gIgcsd;
562  double gIgcss;
563  double gIgcsb;
564  double Igcd;
565  double gIgcdg;
566  double gIgcdd;
567  double gIgcds;
568  double gIgcdb;
569 
570  double Igs;
571  double gIgsg;
572  double gIgss;
573  double Igd;
574  double gIgdg;
575  double gIgdd;
576 
577  double Igb;
578  double gIgbg;
579  double gIgbd;
580  double gIgbs;
581  double gIgbb;
582 
583  double grdsw;
584  double IdovVds;
585  double gcrg;
586  double gcrgd;
587  double gcrgg;
588  double gcrgs;
589  double gcrgb;
590 
591  double gstot;
592  double gstotd;
593  double gstotg;
594  double gstots;
595  double gstotb;
596 
597  double gdtot;
598  double gdtotd;
599  double gdtotg;
600  double gdtots;
601  double gdtotb;
602 
603  double cggb;
604  double cgdb;
605  double cgsb;
606  double cbgb;
607  double cbdb;
608  double cbsb;
609  double cdgb;
610  double cddb;
611  double cdsb;
612  double csgb;
613  double csdb;
614  double cssb;
615  double cgbb;
616  double cdbb;
617  double csbb;
618  double cbbb;
619  double capbd;
620  double capbs;
621 
622  double cqgb;
623  double cqdb;
624  double cqsb;
625  double cqbb;
626 
627  double qgate;
628  double qbulk;
629  double qdrn;
630  double qsrc;
631 
632  double qchqs;
633  double taunet;
634  double gtau;
635  double gtg;
636  double gtd;
637  double gts;
638  double gtb;
645 
647 
649 
653 
654  bool scaGiven;
655  bool scbGiven;
656  bool sccGiven;
657  bool scGiven;
664 
667 
668  // Variables that were local to the b4ld function, but are
669  // more appropriate as class variables.
671 
672  double temp;
673 
674  // solution variables, and intermediate quantities.
675  double Vd; // drain node voltage
676  double Vs; // source node voltage
677  double Vb; // bulk node voltage
678 
679  double Vdp; // drain prime voltage
680  double Vsp; // source prime voltage
681  double Vgp; // gate prime voltage
682  double Vbp; // bulk prime voltage
683 
684  double Vge;
685  double Vgm;
686  double Vdb;
687  double Vsb;
688  double Vds;
689  double Vgs;
690  double Vbs;
691 
692  double Qtotal; // total charge variable.
693 
694  double Vddp; // voltage drop between drain and drain'
695  double Vssp; // voltage drop between source and source'
696 
697  double Vbsp; // voltage drop, bulk-source prime
698  double Vbdp; // voltage drop, bulk-drain prime
699 
700  double Vgsp; // voltage drop, gate-Source prime
701  double Vgdp; // voltage drop, gate-Drain prime
702  double Vgb; // voltage drop, gate-Bulk
703 
704  double Vdpsp; // voltage drop accross the channel
705 
706  // Voltage drops in the substrate network:
707  double Vdbb; // drain-body/body
708  double Vdbbp; // drain-body/body-prime
709  double Vbpb; // body-prime/body
710  double Vsbb; // source-body/body
711  double Vsbbp; // source-body/body-prime
712 
713  // resistor currents:
714  double Idrain; // current through drain resistor
715  double Isource; // current through source resistor
716  double Idbb; // current through drain-body/body resistor
717  double Idbbp; // current through drain-body/body-prime resistor
718  double Ibpb; // current through body-prime/body resistor
719  double Isbb; // current through source-body/body resistor
720  double Isbbp; // current through source-body/body-prime resistor
721 
722  // channel current stuff:
723  double df1dVdp;
724  double df2dVdp;
725 
726  double df1dVsp;
727  double df2dVsp;
728 
729  double df1dVg;
730  double df2dVg;
731 
732  double df1dVb;
733  double df2dVb;
734 
735  double vgb, vgd;
736  double cqdef;
737  double ceqqd;
738  double ceqqb;
739  double ceqqg;
740 
741  double cqdef_Jdxp;
742  double ceqqd_Jdxp;
743  double ceqqb_Jdxp;
744  double ceqqg_Jdxp;
745 
746  // state variables, voltage drops
747  double vbd;
748  double vbs;
749  double vgs;
750  double vds;
751  double vges;
752  double vgms;
753  double vdes;
754  double vses;
755  double vdbs;
756  double vsbs;
757  double vdbd;
758  double vged;
759  double vgmd;
760 
761  // old versions of state variables, voltage drops
762  // here "old" refers to the previous newton iteration.
763  double vbd_old;
764  double vbs_old;
765  double vgs_old;
766  double vds_old;
767  double vges_old;
768  double vgms_old;
769  double vdes_old;
770  double vses_old;
771  double vdbs_old;
772  double vsbs_old;
773  double vdbd_old;
774  double vged_old;
775  double vgmd_old;
776 
777  // "original" versions of various voltage drop variables:
778  // original refers to the beginning of the newton iterations,
779  // before any limits are imposed on the change in voltage drop.
780  double vbd_orig;
781  double vbs_orig;
782  double vgs_orig;
783  double vds_orig;
784  double vgd_orig;
785  double vges_orig;
786  double vgms_orig;
787  double vdes_orig;
788  double vses_orig;
789  double vdbs_orig;
790  double vsbs_orig;
791  double vdbd_orig;
792  double vbs_jct_orig;
793  double vbd_jct_orig;
794  double vgmb_orig;
795  double vgb_orig;
796  double vged_orig;
797  double vgmd_orig;
798 
800 
801  // b4ld function variables
802  double Gm, Gmbs, FwdSum, RevSum;
804  double cqgate, cqbody, cqdrn;
805 
808 
813 
815  double ceqjs, ceqjd;
816  double vbs_jct, vbd_jct;
817  double ceqqjs, ceqqjd;
818  double ceqqgmid;
819  double gjbd, gjbs, gdpr, gspr, geltd, gcggb;
820  double ggtg, gcgdb, ggtd, gcgsb;
821  double ggts, gcgbb, ggtb;
827 
830  double vgmb;
831 
834 
836  double ceqqjs_Jdxp;
837  double ceqqjd_Jdxp;
838 
839  double qgmb;
840  double qgb;
841  double Cgg, Cgd;
842  double Cgb, Cdg, Cdd, Cds;
843  double Csg, Csd, Css;
844  double Csb, Cbg, Cbd;
845  double Cbb;
846 
847  // Capacitance variables
848  // In general gcggb --> CAPcggb.
849  // gcgdb --> CAPcgdb. etc.
850  double CAPcggb;
851  double CAPcgdb;
852  double CAPcgsb;
853  double CAPcbgb;
854  double CAPcbdb;
855  double CAPcbsb;
856  double CAPcdgb;
857  double CAPcdgmb;
858  double CAPcddb;
859  double CAPcdbdb;
860  double CAPcdsb;
861  double CAPcsgb;
862  double CAPcsdb;
863  double CAPcssb;
864  double CAPcgmdb;
865  double CAPcgmsb;
866  double CAPcgmgmb;
867  double CAPcbgmb;
868  double CAPcsbsb;
869  double CAPcqgb;
870  double CAPcqdb;
871  double CAPcqsb;
872 
873  double CAPcgmbb;
874  double CAPcsgmb;
875  double CAPcgbb;
876  double CAPcdbb;
877  double CAPcsbb;
878  double CAPcbbb;
879  double CAPcqbb;
880 
881  double Qeqqd_Jdxp;
882  double Qeqqb_Jdxp;
883  double Qeqqg_Jdxp;
884 
886  double Qeqqjs_Jdxp;
887  double Qeqqjd_Jdxp;
888  double Qqcheq_Jdxp;
889  // end of new-DAE stuff.
890 
891  // gate resistor model currents (not needed in spice version)
892  //
893  // rgateMod==0 no gate resistor.
894  // rgateMod==1 linear gate resistor
895  // rgateMod==2 nonlinear gate resistor
896  // rgateMod==3 2 gate resistors, in series.
897  //
898  double Igate; // used by rgateMod= 1,2, and 3
899  double Igate_Jdxp;// used by rgateMod= 1,2, and 3
900  double IgateMid; // used by rgateMod= 3 only
901  double IgateMid_Jdxp; // used by rgateMod= 3 only
902 
903  // gate model voltage drops:
904  double Vgegp, Vgegp_orig;
905  double Vgegm, Vgegm_orig;
906  double Vgmgp, Vgmgp_orig;
907 
908  // state variables, intrinsic capacitors
909  double qb;
910  double qg;
911  double qd;
912  double qgmid;
913 
914  // state variables, parasitic capacitors
915  double qbs;
916  double qbd;
917 
918  // state variables, cheq
919  double qcheq;
920  double cqcheq;
921  double cqcheq_Jdxp;
922 
923  // state variables, cdump There is no "qcdump" variable, just cqcdump
924  double cqcdump;
925 
926  // this is a state variable in SPICE, but we use it only as an
927  // instance variable --- it is always type*Qtotal
928  double qdef;
929 
930  // Indices into the state vector:
931 
932  // state variables, voltage drops
947 
948  // state variables, intrinsic capacitors
953 
954  // state variables, parasitic capacitors
957 
958  // state variables, cheq
960 
961  // state variables, cdump
963 
964  // state variable, qdef
966 
967  ////////////////////////////////////////////////////////////////////
968  // Local variable indices
969  int li_Drain; // dNode;
970  int li_GateExt; // gNodeExt;
971  int li_Source; // sNode;
972  int li_Body; // bNode;
973  int li_DrainPrime; // dNodePrime;
974  int li_GatePrime; // gNodePrime;
975  int li_GateMid; // gNodeMid;
976  int li_SourcePrime;// sNodePrime;
977  int li_BodyPrime; // bNodePrime;
978  int li_DrainBody; // dbNode;
979  int li_SourceBody; // sbNode;
980  int li_Charge; // qNode;
981 
982  // local indies
983  int li_Ibs;
984  int li_Ids;
985  int li_Igs;
986 
987  ////////////////////////////////////////////////////////////////////
988  // Jacobian matrix offsets:
993  int Dd, Dgp, Ddp, Dsp, Dbp, Dids;
995  int Ss, Sdp, Sgp, Ssp, Sbp, Sibs, Sids, Sigs;
997  int DBdp, DBdb, DBbp, DBb;
998  int SBsp, SBbp, SBb, SBsb;
999  int Bdb, Bbp, Bsb, Bb, Bibs;
1000  int Qq, Qgp, Qdp, Qsp, Qbp;
1001 
1002  // icVBS
1003  int IBSb;
1004  int IBSs;
1005  int IBSibs;
1006 
1007  // icVDS
1008  int IDSd;
1009  int IDSs;
1010  int IDSids;
1011 
1012  // icVGS
1013  int IGSg;
1014  int IGSs;
1015  int IGSigs;
1016 
1017 
1018 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1019  // Jacobian Matrix Pointers
1020 
1021  double * f_DdPtr ; double * q_DdPtr ;
1022  double * f_DdpPtr ; double * q_DdpPtr ;
1023  double * f_DspPtr ; double * q_DspPtr ;
1024  double * f_DgpPtr ; double * q_DgpPtr ;
1025  double * f_DbpPtr ; double * q_DbpPtr ;
1026  double * f_DidsPtr;
1027 
1028  double * f_GEgePtr ; double * q_GEgePtr ;
1029  double * f_GEdpPtr ; double * q_GEdpPtr ;
1030  double * f_GEspPtr ; double * q_GEspPtr ;
1031  double * f_GEgpPtr ; double * q_GEgpPtr ;
1032  double * f_GEgmPtr ; double * q_GEgmPtr ;
1033  double * f_GEbpPtr ; double * q_GEbpPtr ;
1034  double * f_GEigsPtr;
1035 
1036  double * f_SsPtr ; double * q_SsPtr ;
1037  double * f_SdpPtr ; double * q_SdpPtr ;
1038  double * f_SspPtr ; double * q_SspPtr ;
1039  double * f_SgpPtr ; double * q_SgpPtr ;
1040  double * f_SbpPtr ; double * q_SbpPtr ;
1041  double * f_SibsPtr;
1042  double * f_SidsPtr;
1043  double * f_SigsPtr;
1044 
1045  double * f_BbPtr ; double * q_BbPtr ;
1046  double * f_BbpPtr ; double * q_BbpPtr ;
1047  double * f_BsbPtr ; double * q_BsbPtr ;
1048  double * f_BdbPtr ; double * q_BdbPtr ;
1049  double * f_BibsPtr;
1050 
1051  double * f_DPdPtr ; double * q_DPdPtr ;
1052  double * f_DPdpPtr ; double * q_DPdpPtr ;
1053  double * f_DPspPtr ; double * q_DPspPtr ;
1054  double * f_DPgpPtr ; double * q_DPgpPtr ;
1055  double * f_DPgmPtr ; double * q_DPgmPtr ;
1056  double * f_DPbpPtr ; double * q_DPbpPtr ;
1057  double * f_DPdbPtr ; double * q_DPdbPtr ;
1058 
1059 
1060  double * f_DPqPtr ; double * q_DPqPtr ;
1061 
1062 
1063  double * f_SPsPtr ; double * q_SPsPtr ;
1064  double * f_SPdpPtr ; double * q_SPdpPtr ;
1065  double * f_SPspPtr ; double * q_SPspPtr ;
1066  double * f_SPgpPtr ; double * q_SPgpPtr ;
1067  double * f_SPgmPtr ; double * q_SPgmPtr ;
1068  double * f_SPbpPtr ; double * q_SPbpPtr ;
1069  double * f_SPsbPtr ; double * q_SPsbPtr ;
1070 
1071  double * f_SPqPtr ; double * q_SPqPtr ;
1072 
1073  double * f_GPgePtr; double * q_GPgePtr;
1074  double * f_GPdpPtr; double * q_GPdpPtr;
1075  double * f_GPspPtr; double * q_GPspPtr;
1076  double * f_GPgpPtr; double * q_GPgpPtr;
1077  double * f_GPgmPtr; double * q_GPgmPtr;
1078  double * f_GPbpPtr; double * q_GPbpPtr;
1079 
1080  double * f_GPqPtr; double * q_GPqPtr;
1081 
1082  double * f_GMgePtr; double * q_GMgePtr;
1083  double * f_GMdpPtr; double * q_GMdpPtr;
1084  double * f_GMspPtr; double * q_GMspPtr;
1085  double * f_GMgpPtr; double * q_GMgpPtr;
1086  double * f_GMgmPtr; double * q_GMgmPtr;
1087  double * f_GMbpPtr; double * q_GMbpPtr;
1088 
1089  double * f_BPbPtr ; double * q_BPbPtr ;
1090  double * f_BPdpPtr; double * q_BPdpPtr;
1091  double * f_BPspPtr; double * q_BPspPtr;
1092  double * f_BPgpPtr; double * q_BPgpPtr;
1093  double * f_BPgmPtr; double * q_BPgmPtr;
1094  double * f_BPbpPtr; double * q_BPbpPtr;
1095  double * f_BPsbPtr; double * q_BPsbPtr;
1096  double * f_BPdbPtr; double * q_BPdbPtr;
1097 
1098  double * f_SBbPtr ; double * q_SBbPtr ;
1099  double * f_SBspPtr; double * q_SBspPtr;
1100  double * f_SBbpPtr; double * q_SBbpPtr;
1101  double * f_SBsbPtr; double * q_SBsbPtr;
1102 
1103  double * f_DBbPtr ; double * q_DBbPtr ;
1104  double * f_DBdpPtr; double * q_DBdpPtr;
1105  double * f_DBbpPtr; double * q_DBbpPtr;
1106  double * f_DBdbPtr; double * q_DBdbPtr;
1107 
1108  double * f_QdpPtr; double * q_QdpPtr;
1109  double * f_QspPtr; double * q_QspPtr;
1110  double * f_QgpPtr; double * q_QgpPtr;
1111  double * f_QbpPtr; double * q_QbpPtr;
1112  double * f_QqPtr ; double * q_QqPtr ;
1113 
1114  double * f_IBSbPtr;
1115  double * f_IBSsPtr;
1116  double * f_IBSibsPtr;
1117  double * f_IDSdPtr;
1118  double * f_IDSsPtr;
1119  double * f_IDSidsPtr;
1120  double * f_IGSgPtr;
1121  double * f_IGSsPtr;
1122  double * f_IGSigsPtr;
1123 #endif
1124 
1125  // flag for updateTemperature call. Needed for .STEP temperature sweeps.
1127 
1128  // Jacobian stamp related structures:
1129  std::vector< std::vector<int> > jacStamp;
1130  std::vector<int> jacMap;
1131  std::vector< std::vector<int> > jacMap2;
1132 
1133  int blockHomotopyID; // For homotopy
1134  double randomPerturb; // For homotopy
1135 
1141  double T0;
1142 };
1143 
1144 //-----------------------------------------------------------------------------
1145 // Class : Model
1146 // Purpose :
1147 // Special Notes :
1148 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
1149 // Creation Date : 11/25/06
1150 //-----------------------------------------------------------------------------
1151 class Model : public DeviceModel
1152 {
1153  typedef std::vector<Instance *> InstanceVector;
1154 
1155  friend class SizeDependParam;
1156  friend class ParametricData<Model>;
1157  friend class Instance;
1158  friend class Traits;friend class Master;
1159 
1160 public:
1161  Model(
1162  const Configuration & configuration,
1163  const ModelBlock & MB,
1164  const FactoryBlock & factory_block);
1165  ~Model();
1166 
1167 private:
1168  Model();
1169  Model(const Model &);
1170  Model &operator=(const Model &);
1171 
1172 public:
1173  virtual void forEachInstance(DeviceInstanceOp &op) const /* override */;
1174 
1175  virtual std::ostream &printOutInstances(std::ostream &os) const;
1176 
1177  bool processParams ();
1178  bool processInstanceParams ();
1179 
1180  bool clearTemperatureData ();
1181 
1182 
1183 public:
1184  void addInstance(Instance *instance)
1185  {
1186  instanceContainer.push_back(instance);
1187  }
1188 
1189 private:
1190  std::vector<Instance*> instanceContainer;
1191 
1192 private:
1193 
1194 
1195  // 3f5 stuff:
1196  int modType;
1197  int dtype;
1198 
1199  int mobMod;
1201  int capMod;
1202  int dioMod;
1205  int fnoiMod;
1206  int tnoiMod;
1207  int rdsMod;
1210  int perMod;
1211  int geoMod;
1212  int mtrlMod;
1213  int igcMod;
1214  int igbMod;
1215  int tempMod;
1216  int binUnit;
1218  std::string version;
1219  double eot;
1220  double vddeot;
1221  double ados;
1222  double bdos;
1223  double toxe;
1224  double toxp;
1225  double toxm;
1226  double dtox;
1227  double epsrox;
1228  double cdsc;
1229  double cdscb;
1230  double cdscd;
1231  double cit;
1232  double nfactor;
1233  double xj;
1234  double vsat;
1235  double at;
1236  double a0;
1237  double ags;
1238  double a1;
1239  double a2;
1240  double keta;
1241  double nsub;
1242  double phig;
1243  double epsrgate;
1244  double easub;
1245  double epsrsub;
1246  double ni0sub;
1247  double bg0sub;
1248  double tbgasub;
1249  double tbgbsub;
1250  double ndep;
1251  double nsd;
1252  double phin;
1253  double ngate;
1254  double gamma1;
1255  double gamma2;
1256  double vbx;
1257  double vbm;
1258  double xt;
1259  double k1;
1260  double kt1;
1261  double kt1l;
1262  double kt2;
1263  double k2;
1264  double k3;
1265  double k3b;
1266  double w0;
1267  double dvtp0;
1268  double dvtp1;
1269  double lpe0;
1270  double lpeb;
1271  double dvt0;
1272  double dvt1;
1273  double dvt2;
1274  double dvt0w;
1275  double dvt1w;
1276  double dvt2w;
1277  double drout;
1278  double dsub;
1279  double vth0;
1280  double eu;
1281  double ua;
1282  double ua1;
1283  double ub;
1284  double ub1;
1285  double uc;
1286  double uc1;
1287  double ud;
1288  double ud1;
1289  double up;
1290  double lp;
1291  double u0;
1292  double ute;
1293  double voff;
1294  double tvoff;
1295  double minv;
1296  double minvcv;
1297  double voffl;
1298  double voffcvl;
1299  double delta;
1300  double rdsw;
1301  double rdswmin;
1302  double rdwmin;
1303  double rswmin;
1304  double rsw;
1305  double rdw;
1306  double prwg;
1307  double prwb;
1308  double prt;
1309  double eta0;
1310  double etab;
1311  double pclm;
1312  double pdibl1;
1313  double pdibl2;
1314  double pdiblb;
1315  double fprout;
1316  double pdits;
1317  double pditsd;
1318  double pditsl;
1319  double pscbe1;
1320  double pscbe2;
1321  double pvag;
1322  double wr;
1323  double dwg;
1324  double dwb;
1325  double b0;
1326  double b1;
1327  double alpha0;
1328  double alpha1;
1329  double beta0;
1330  double agidl;
1331  double bgidl;
1332  double cgidl;
1333  double egidl;
1334  double agisl;
1335  double bgisl;
1336  double cgisl;
1337  double egisl;
1338  double aigc;
1339  double bigc;
1340  double cigc;
1341  double aigsd;
1342  double bigsd;
1343  double cigsd;
1344  double aigs;
1345  double bigs;
1346  double cigs;
1347  double aigd;
1348  double bigd;
1349  double cigd;
1350  double aigbacc;
1351  double bigbacc;
1352  double cigbacc;
1353  double aigbinv;
1354  double bigbinv;
1355  double cigbinv;
1356  double nigc;
1357  double nigbacc;
1358  double nigbinv;
1359  double ntox;
1360  double eigbinv;
1361  double pigcd;
1362  double poxedge;
1363  double toxref;
1364  double ijthdfwd;
1365  double ijthsfwd;
1366  double ijthdrev;
1367  double ijthsrev;
1368  double xjbvd;
1369  double xjbvs;
1370  double bvd;
1371  double bvs;
1372 
1373  double jtss;
1374  double jtsd;
1375  double jtssws;
1376  double jtsswd;
1377  double jtsswgs;
1378  double jtsswgd;
1379  double njts;
1380  double njtssw;
1381  double njtsswg;
1382  double njtsd;
1383  double njtsswd;
1384  double njtsswgd;
1385  double xtss;
1386  double xtsd;
1387  double xtssws;
1388  double xtsswd;
1389  double xtsswgs;
1390  double xtsswgd;
1391  double tnjts;
1392  double tnjtssw;
1393  double tnjtsswg;
1394  double tnjtsd;
1395  double tnjtsswd;
1396  double tnjtsswgd;
1397  double vtss;
1398  double vtsd;
1399  double vtssws;
1400  double vtsswd;
1401  double vtsswgs;
1402  double vtsswgd;
1403 
1404  double xrcrg1;
1405  double xrcrg2;
1406  double lambda;
1407  double vtl;
1408  double lc;
1409  double xn;
1410  double vfbsdoff; // S/D flatband offset voltage
1411  double lintnoi; // lint offset for noise calculation
1412  double tvfbsdoff;
1413 
1414  double vfb;
1415  double gbmin;
1416  double rbdb;
1417  double rbsb;
1418  double rbpb;
1419  double rbps;
1420  double rbpd;
1421 
1422  double rbps0;
1423  double rbpsl;
1424  double rbpsw;
1425  double rbpsnf;
1426 
1427  double rbpd0;
1428  double rbpdl;
1429  double rbpdw;
1430  double rbpdnf;
1431 
1432  double rbpbx0;
1433  double rbpbxl;
1434  double rbpbxw;
1435  double rbpbxnf;
1436  double rbpby0;
1437  double rbpbyl;
1438  double rbpbyw;
1439  double rbpbynf;
1440 
1441  double rbsbx0;
1442  double rbsby0;
1443  double rbdbx0;
1444  double rbdby0;
1445 
1446  double rbsdbxl;
1447  double rbsdbxw;
1448  double rbsdbxnf;
1449  double rbsdbyl;
1450  double rbsdbyw;
1451  double rbsdbynf;
1452 
1453  double tnoia;
1454  double tnoib;
1455  double rnoia;
1456  double rnoib;
1457  double ntnoi;
1458 
1459  // CV model and Parasitics
1460  double cgsl;
1461  double cgdl;
1462  double ckappas;
1463  double ckappad;
1464  double cf;
1465  double vfbcv;
1466  double clc;
1467  double cle;
1468  double dwc;
1469  double dlc;
1470  double xw;
1471  double xl;
1472  double dlcig;
1473  double dlcigd;
1474  double dwj;
1475  double noff;
1476  double voffcv;
1477  double acde;
1478  double moin;
1479  double tcj;
1480  double tcjsw;
1481  double tcjswg;
1482  double tpb;
1483  double tpbsw;
1484  double tpbswg;
1485  double dmcg;
1486  double dmci;
1487  double dmdg;
1488  double dmcgt;
1489  double xgw;
1490  double xgl;
1491  double rshg;
1492  double ngcon;
1493 
1494  // Length Dependence
1495  double lcdsc;
1496  double lcdscb;
1497  double lcdscd;
1498  double lcit;
1499  double lnfactor;
1500  double lxj;
1501  double lvsat;
1502  double lat;
1503  double la0;
1504  double lags;
1505  double la1;
1506  double la2;
1507  double lketa;
1508  double lnsub;
1509  double lndep;
1510  double lnsd;
1511  double lphin;
1512  double lngate;
1513  double lgamma1;
1514  double lgamma2;
1515  double lvbx;
1516  double lvbm;
1517  double lxt;
1518  double lk1;
1519  double lkt1;
1520  double lkt1l;
1521  double lkt2;
1522  double lk2;
1523  double lk3;
1524  double lk3b;
1525  double lw0;
1526  double ldvtp0;
1527  double ldvtp1;
1528  double llpe0;
1529  double llpeb;
1530  double ldvt0;
1531  double ldvt1;
1532  double ldvt2;
1533  double ldvt0w;
1534  double ldvt1w;
1535  double ldvt2w;
1536  double ldrout;
1537  double ldsub;
1538  double lvth0;
1539  double lua;
1540  double lua1;
1541  double lub;
1542  double lub1;
1543  double luc;
1544  double luc1;
1545  double lud;
1546  double lud1;
1547  double lup;
1548  double llp;
1549  double lu0;
1550  double leu;
1551  double lute;
1552  double lvoff;
1553  double ltvoff;
1554  double lminv;
1555  double lminvcv;
1556  double ldelta;
1557  double lrdsw;
1558  double lrsw;
1559  double lrdw;
1560  double lprwg;
1561  double lprwb;
1562  double lprt;
1563  double leta0;
1564  double letab;
1565  double lpclm;
1566  double lpdibl1;
1567  double lpdibl2;
1568  double lpdiblb;
1569  double lfprout;
1570  double lpdits;
1571  double lpditsd;
1572  double lpscbe1;
1573  double lpscbe2;
1574  double lpvag;
1575  double lwr;
1576  double ldwg;
1577  double ldwb;
1578  double lb0;
1579  double lb1;
1580  double lalpha0;
1581  double lalpha1;
1582  double lbeta0;
1583  double lvfb;
1584  double lagidl;
1585  double lbgidl;
1586  double lcgidl;
1587  double legidl;
1588  double lagisl;
1589  double lbgisl;
1590  double lcgisl;
1591  double legisl;
1592  double laigc;
1593  double lbigc;
1594  double lcigc;
1595  double laigsd;
1596  double lbigsd;
1597  double lcigsd;
1598  double laigs;
1599  double lbigs;
1600  double lcigs;
1601  double laigd;
1602  double lbigd;
1603  double lcigd;
1604  double laigbacc;
1605  double lbigbacc;
1606  double lcigbacc;
1607  double laigbinv;
1608  double lbigbinv;
1609  double lcigbinv;
1610  double lnigc;
1611  double lnigbacc;
1612  double lnigbinv;
1613  double lntox;
1614  double leigbinv;
1615  double lpigcd;
1616  double lpoxedge;
1617  double lxrcrg1;
1618  double lxrcrg2;
1619  double llambda;
1620  double lvtl;
1621  double lxn;
1622  double lvfbsdoff;
1623  double ltvfbsdoff;
1624 
1625  // CV model
1626  double lcgsl;
1627  double lcgdl;
1628  double lckappas;
1629  double lckappad;
1630  double lcf;
1631  double lclc;
1632  double lcle;
1633  double lvfbcv;
1634  double lnoff;
1635  double lvoffcv;
1636  double lacde;
1637  double lmoin;
1638 
1639  // Width Dependence
1640  double wcdsc;
1641  double wcdscb;
1642  double wcdscd;
1643  double wcit;
1644  double wnfactor;
1645  double wxj;
1646  double wvsat;
1647  double wat;
1648  double wa0;
1649  double wags;
1650  double wa1;
1651  double wa2;
1652  double wketa;
1653  double wnsub;
1654  double wndep;
1655  double wnsd;
1656  double wphin;
1657  double wngate;
1658  double wgamma1;
1659  double wgamma2;
1660  double wvbx;
1661  double wvbm;
1662  double wxt;
1663  double wk1;
1664  double wkt1;
1665  double wkt1l;
1666  double wkt2;
1667  double wk2;
1668  double wk3;
1669  double wk3b;
1670  double ww0;
1671  double wdvtp0;
1672  double wdvtp1;
1673  double wlpe0;
1674  double wlpeb;
1675  double wdvt0;
1676  double wdvt1;
1677  double wdvt2;
1678  double wdvt0w;
1679  double wdvt1w;
1680  double wdvt2w;
1681  double wdrout;
1682  double wdsub;
1683  double wvth0;
1684  double wua;
1685  double wua1;
1686  double wub;
1687  double wub1;
1688  double wuc;
1689  double wuc1;
1690  double wud;
1691  double wud1;
1692  double wup;
1693  double wlp;
1694  double wu0;
1695  double weu;
1696  double wute;
1697  double wvoff;
1698  double wtvoff;
1699  double wminv;
1700  double wminvcv;
1701  double wdelta;
1702  double wrdsw;
1703  double wrsw;
1704  double wrdw;
1705  double wprwg;
1706  double wprwb;
1707  double wprt;
1708  double weta0;
1709  double wetab;
1710  double wpclm;
1711  double wpdibl1;
1712  double wpdibl2;
1713  double wpdiblb;
1714  double wfprout;
1715  double wpdits;
1716  double wpditsd;
1717  double wpscbe1;
1718  double wpscbe2;
1719  double wpvag;
1720  double wwr;
1721  double wdwg;
1722  double wdwb;
1723  double wb0;
1724  double wb1;
1725  double walpha0;
1726  double walpha1;
1727  double wbeta0;
1728  double wvfb;
1729  double wagidl;
1730  double wbgidl;
1731  double wcgidl;
1732  double wegidl;
1733  double wagisl;
1734  double wbgisl;
1735  double wcgisl;
1736  double wegisl;
1737  double waigc;
1738  double wbigc;
1739  double wcigc;
1740  double waigsd;
1741  double wbigsd;
1742  double wcigsd;
1743  double waigs;
1744  double wbigs;
1745  double wcigs;
1746  double waigd;
1747  double wbigd;
1748  double wcigd;
1749  double waigbacc;
1750  double wbigbacc;
1751  double wcigbacc;
1752  double waigbinv;
1753  double wbigbinv;
1754  double wcigbinv;
1755  double wnigc;
1756  double wnigbacc;
1757  double wnigbinv;
1758  double wntox;
1759  double weigbinv;
1760  double wpigcd;
1761  double wpoxedge;
1762  double wxrcrg1;
1763  double wxrcrg2;
1764  double wlambda;
1765  double wvtl;
1766  double wxn;
1767  double wvfbsdoff;
1768  double wtvfbsdoff;
1769 
1770  // CV model
1771  double wcgsl;
1772  double wcgdl;
1773  double wckappas;
1774  double wckappad;
1775  double wcf;
1776  double wclc;
1777  double wcle;
1778  double wvfbcv;
1779  double wnoff;
1780  double wvoffcv;
1781  double wacde;
1782  double wmoin;
1783 
1784  // Cross-term Dependence
1785  double pcdsc;
1786  double pcdscb;
1787  double pcdscd;
1788  double pcit;
1789  double pnfactor;
1790  double pxj;
1791  double pvsat;
1792  double pat;
1793  double pa0;
1794  double pags;
1795  double pa1;
1796  double pa2;
1797  double pketa;
1798  double pnsub;
1799  double pndep;
1800  double pnsd;
1801  double pphin;
1802  double pngate;
1803  double pgamma1;
1804  double pgamma2;
1805  double pvbx;
1806  double pvbm;
1807  double pxt;
1808  double pk1;
1809  double pkt1;
1810  double pkt1l;
1811  double pkt2;
1812  double pk2;
1813  double pk3;
1814  double pk3b;
1815  double pw0;
1816  double pdvtp0;
1817  double pdvtp1;
1818  double plpe0;
1819  double plpeb;
1820  double pdvt0;
1821  double pdvt1;
1822  double pdvt2;
1823  double pdvt0w;
1824  double pdvt1w;
1825  double pdvt2w;
1826  double pdrout;
1827  double pdsub;
1828  double pvth0;
1829  double pua;
1830  double pua1;
1831  double pub;
1832  double pub1;
1833  double puc;
1834  double puc1;
1835  double pud;
1836  double pud1;
1837  double pup;
1838  double plp;
1839  double pu0;
1840  double peu;
1841  double pute;
1842  double pvoff;
1843  double ptvoff;
1844  double pminv;
1845  double pminvcv;
1846  double pdelta;
1847  double prdsw;
1848  double prsw;
1849  double prdw;
1850  double pprwg;
1851  double pprwb;
1852  double pprt;
1853  double peta0;
1854  double petab;
1855  double ppclm;
1856  double ppdibl1;
1857  double ppdibl2;
1858  double ppdiblb;
1859  double pfprout;
1860  double ppdits;
1861  double ppditsd;
1862  double ppscbe1;
1863  double ppscbe2;
1864  double ppvag;
1865  double pwr;
1866  double pdwg;
1867  double pdwb;
1868  double pb0;
1869  double pb1;
1870  double palpha0;
1871  double palpha1;
1872  double pbeta0;
1873  double pvfb;
1874  double pagidl;
1875  double pbgidl;
1876  double pcgidl;
1877  double pegidl;
1878  double pagisl;
1879  double pbgisl;
1880  double pcgisl;
1881  double pegisl;
1882  double paigc;
1883  double pbigc;
1884  double pcigc;
1885  double paigsd;
1886  double pbigsd;
1887  double pcigsd;
1888  double paigs;
1889  double pbigs;
1890  double pcigs;
1891  double paigd;
1892  double pbigd;
1893  double pcigd;
1894  double paigbacc;
1895  double pbigbacc;
1896  double pcigbacc;
1897  double paigbinv;
1898  double pbigbinv;
1899  double pcigbinv;
1900  double pnigc;
1901  double pnigbacc;
1902  double pnigbinv;
1903  double pntox;
1904  double peigbinv;
1905  double ppigcd;
1906  double ppoxedge;
1907  double pxrcrg1;
1908  double pxrcrg2;
1909  double plambda;
1910  double pvtl;
1911  double pxn;
1912  double pvfbsdoff;
1913  double ptvfbsdoff;
1914 
1915  // CV model
1916  double pcgsl;
1917  double pcgdl;
1918  double pckappas;
1919  double pckappad;
1920  double pcf;
1921  double pclc;
1922  double pcle;
1923  double pvfbcv;
1924  double pnoff;
1925  double pvoffcv;
1926  double pacde;
1927  double pmoin;
1928 
1929  double tnom;
1930  double cgso;
1931  double cgdo;
1932  double cgbo;
1933  double xpart;
1934  double cFringOut;
1935  double cFringMax;
1936 
1966  double njtsstemp;
1967  double njtsswstemp;
1969  double njtsdtemp;
1970  double njtsswdtemp;
1972 
1973  double Lint;
1974  double Ll;
1975  double Llc;
1976  double Lln;
1977  double Lw;
1978  double Lwc;
1979  double Lwn;
1980  double Lwl;
1981  double Lwlc;
1982  double Lmin;
1983  double Lmax;
1984 
1985  double Wint;
1986  double Wl;
1987  double Wlc;
1988  double Wln;
1989  double Ww;
1990  double Wwc;
1991  double Wwn;
1992  double Wwl;
1993  double Wwlc;
1994  double Wmin;
1995  double Wmax;
1996 
1997  // added for stress effect
1998  double saref;
1999  double sbref;
2000  double wlod;
2001  double ku0;
2002  double kvsat;
2003  double kvth0;
2004  double tku0;
2005  double llodku0;
2006  double wlodku0;
2007  double llodvth;
2008  double wlodvth;
2009  double lku0;
2010  double wku0;
2011  double pku0;
2012  double lkvth0;
2013  double wkvth0;
2014  double pkvth0;
2015  double stk2;
2016  double lodk2;
2017  double steta0;
2018  double lodeta0;
2019 
2020  double web;
2021  double wec;
2022  double kvth0we;
2023  double k2we;
2024  double ku0we;
2025  double scref;
2026  double wpemod;
2027  double lkvth0we;
2028  double lk2we;
2029  double lku0we;
2030  double wkvth0we;
2031  double wk2we;
2032  double wku0we;
2033  double pkvth0we;
2034  double pk2we;
2035  double pku0we;
2036 
2037  // Pre-calculated constants
2038  // move to size-dependent param
2039  double Eg0;
2040  double vtm;
2041  double vtm0;
2042  double coxe;
2043  double coxp;
2044  double cof1;
2045  double cof2;
2046  double cof3;
2047  double cof4;
2048  double vcrit;
2049  double factor1;
2050  double PhiBS;
2051  double PhiBSWS;
2052  double PhiBSWGS;
2056  double PhiBD;
2057  double PhiBSWD;
2058  double PhiBSWGD;
2068 
2072  double em;
2073  double ef;
2074  double af;
2075  double kf;
2076 
2077  double ni;
2078  double Vtm0;
2079 
2080  // given variables:
2081  bool vtlGiven;
2084  bool k1Given;
2085  bool k2Given;
2088  bool xtGiven;
2089  bool vbxGiven;
2091  bool vfbGiven;
2101 
2106  bool dlcGiven;
2109 
2110  std::list<SizeDependParam*> sizeDependParamList;
2111 };
2112 
2113 //-----------------------------------------------------------------------------
2114 // Function : Instance:isConverged ()
2115 // Purpose : Return whether a BSIM3 device has done something that should
2116 // be interpreted as invalidating other convergence tests
2117 // In case of bsim3, just do it if the limiter function
2118 // pnjlim. This actually agrees with how the Check flag
2119 // is used in Spice3F5 b3ld.c
2120 // Special Notes :
2121 // Scope : public
2122 // Creator : Tom Russo, SNL, Component Information and Models
2123 // Creation Date : 03/22/05
2124 //-----------------------------------------------------------------------------
2126 {
2127  return (!limitedFlag);
2128 }
2129 
2130 //-----------------------------------------------------------------------------
2131 // Class : Master
2132 // Purpose :
2133 // Special Notes :
2134 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
2135 // Creation Date : 11/26/08
2136 //-----------------------------------------------------------------------------
2137 class Master : public DeviceMaster<Traits>
2138 {
2139  friend class SizeDependParam;
2140  friend class Instance;
2141  friend class Model;
2142 
2143 public:
2145  const Configuration & configuration,
2146  const FactoryBlock & factory_block,
2147  const SolverState & ss1,
2148  const DeviceOptions & do1)
2149  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
2150  {}
2151 
2152  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
2153 
2154  // load functions, residual:
2155  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * bVec, double * storeLeadF, double * storeLeadQ);
2156 
2157  // load functions, Jacobian:
2158  virtual bool loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx);
2159 };
2160 
2161 void registerDevice();
2162 
2163 } // namespace MOSFET_B4
2164 } // namespace Device
2165 } // namespace Xyce
2166 
2170 
2171 #endif
2172