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.53.2.1 $
40 //
41 // Revision Date : $Date: 2014/02/26 20:16:30 $
42 //
43 // Current Owner : $Author: tvrusso $
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 const int numNodes() {return 4;}
73  static const bool modelRequired() {return true;}
74  static const 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 
1190  {
1191  return instanceContainer;
1192  }
1193 
1195  {
1196  return instanceContainer;
1197  }
1198 
1199 private:
1200  std::vector<Instance*> instanceContainer;
1201 
1202 private:
1203 
1204 
1205  // 3f5 stuff:
1206  int modType;
1207  int dtype;
1208 
1209  int mobMod;
1211  int capMod;
1212  int dioMod;
1215  int fnoiMod;
1216  int tnoiMod;
1217  int rdsMod;
1220  int perMod;
1221  int geoMod;
1222  int mtrlMod;
1223  int igcMod;
1224  int igbMod;
1225  int tempMod;
1226  int binUnit;
1228  std::string version;
1229  double eot;
1230  double vddeot;
1231  double ados;
1232  double bdos;
1233  double toxe;
1234  double toxp;
1235  double toxm;
1236  double dtox;
1237  double epsrox;
1238  double cdsc;
1239  double cdscb;
1240  double cdscd;
1241  double cit;
1242  double nfactor;
1243  double xj;
1244  double vsat;
1245  double at;
1246  double a0;
1247  double ags;
1248  double a1;
1249  double a2;
1250  double keta;
1251  double nsub;
1252  double phig;
1253  double epsrgate;
1254  double easub;
1255  double epsrsub;
1256  double ni0sub;
1257  double bg0sub;
1258  double tbgasub;
1259  double tbgbsub;
1260  double ndep;
1261  double nsd;
1262  double phin;
1263  double ngate;
1264  double gamma1;
1265  double gamma2;
1266  double vbx;
1267  double vbm;
1268  double xt;
1269  double k1;
1270  double kt1;
1271  double kt1l;
1272  double kt2;
1273  double k2;
1274  double k3;
1275  double k3b;
1276  double w0;
1277  double dvtp0;
1278  double dvtp1;
1279  double lpe0;
1280  double lpeb;
1281  double dvt0;
1282  double dvt1;
1283  double dvt2;
1284  double dvt0w;
1285  double dvt1w;
1286  double dvt2w;
1287  double drout;
1288  double dsub;
1289  double vth0;
1290  double eu;
1291  double ua;
1292  double ua1;
1293  double ub;
1294  double ub1;
1295  double uc;
1296  double uc1;
1297  double ud;
1298  double ud1;
1299  double up;
1300  double lp;
1301  double u0;
1302  double ute;
1303  double voff;
1304  double tvoff;
1305  double minv;
1306  double minvcv;
1307  double voffl;
1308  double voffcvl;
1309  double delta;
1310  double rdsw;
1311  double rdswmin;
1312  double rdwmin;
1313  double rswmin;
1314  double rsw;
1315  double rdw;
1316  double prwg;
1317  double prwb;
1318  double prt;
1319  double eta0;
1320  double etab;
1321  double pclm;
1322  double pdibl1;
1323  double pdibl2;
1324  double pdiblb;
1325  double fprout;
1326  double pdits;
1327  double pditsd;
1328  double pditsl;
1329  double pscbe1;
1330  double pscbe2;
1331  double pvag;
1332  double wr;
1333  double dwg;
1334  double dwb;
1335  double b0;
1336  double b1;
1337  double alpha0;
1338  double alpha1;
1339  double beta0;
1340  double agidl;
1341  double bgidl;
1342  double cgidl;
1343  double egidl;
1344  double agisl;
1345  double bgisl;
1346  double cgisl;
1347  double egisl;
1348  double aigc;
1349  double bigc;
1350  double cigc;
1351  double aigsd;
1352  double bigsd;
1353  double cigsd;
1354  double aigs;
1355  double bigs;
1356  double cigs;
1357  double aigd;
1358  double bigd;
1359  double cigd;
1360  double aigbacc;
1361  double bigbacc;
1362  double cigbacc;
1363  double aigbinv;
1364  double bigbinv;
1365  double cigbinv;
1366  double nigc;
1367  double nigbacc;
1368  double nigbinv;
1369  double ntox;
1370  double eigbinv;
1371  double pigcd;
1372  double poxedge;
1373  double toxref;
1374  double ijthdfwd;
1375  double ijthsfwd;
1376  double ijthdrev;
1377  double ijthsrev;
1378  double xjbvd;
1379  double xjbvs;
1380  double bvd;
1381  double bvs;
1382 
1383  double jtss;
1384  double jtsd;
1385  double jtssws;
1386  double jtsswd;
1387  double jtsswgs;
1388  double jtsswgd;
1389  double njts;
1390  double njtssw;
1391  double njtsswg;
1392  double njtsd;
1393  double njtsswd;
1394  double njtsswgd;
1395  double xtss;
1396  double xtsd;
1397  double xtssws;
1398  double xtsswd;
1399  double xtsswgs;
1400  double xtsswgd;
1401  double tnjts;
1402  double tnjtssw;
1403  double tnjtsswg;
1404  double tnjtsd;
1405  double tnjtsswd;
1406  double tnjtsswgd;
1407  double vtss;
1408  double vtsd;
1409  double vtssws;
1410  double vtsswd;
1411  double vtsswgs;
1412  double vtsswgd;
1413 
1414  double xrcrg1;
1415  double xrcrg2;
1416  double lambda;
1417  double vtl;
1418  double lc;
1419  double xn;
1420  double vfbsdoff; // S/D flatband offset voltage
1421  double lintnoi; // lint offset for noise calculation
1422  double tvfbsdoff;
1423 
1424  double vfb;
1425  double gbmin;
1426  double rbdb;
1427  double rbsb;
1428  double rbpb;
1429  double rbps;
1430  double rbpd;
1431 
1432  double rbps0;
1433  double rbpsl;
1434  double rbpsw;
1435  double rbpsnf;
1436 
1437  double rbpd0;
1438  double rbpdl;
1439  double rbpdw;
1440  double rbpdnf;
1441 
1442  double rbpbx0;
1443  double rbpbxl;
1444  double rbpbxw;
1445  double rbpbxnf;
1446  double rbpby0;
1447  double rbpbyl;
1448  double rbpbyw;
1449  double rbpbynf;
1450 
1451  double rbsbx0;
1452  double rbsby0;
1453  double rbdbx0;
1454  double rbdby0;
1455 
1456  double rbsdbxl;
1457  double rbsdbxw;
1458  double rbsdbxnf;
1459  double rbsdbyl;
1460  double rbsdbyw;
1461  double rbsdbynf;
1462 
1463  double tnoia;
1464  double tnoib;
1465  double rnoia;
1466  double rnoib;
1467  double ntnoi;
1468 
1469  // CV model and Parasitics
1470  double cgsl;
1471  double cgdl;
1472  double ckappas;
1473  double ckappad;
1474  double cf;
1475  double vfbcv;
1476  double clc;
1477  double cle;
1478  double dwc;
1479  double dlc;
1480  double xw;
1481  double xl;
1482  double dlcig;
1483  double dlcigd;
1484  double dwj;
1485  double noff;
1486  double voffcv;
1487  double acde;
1488  double moin;
1489  double tcj;
1490  double tcjsw;
1491  double tcjswg;
1492  double tpb;
1493  double tpbsw;
1494  double tpbswg;
1495  double dmcg;
1496  double dmci;
1497  double dmdg;
1498  double dmcgt;
1499  double xgw;
1500  double xgl;
1501  double rshg;
1502  double ngcon;
1503 
1504  // Length Dependence
1505  double lcdsc;
1506  double lcdscb;
1507  double lcdscd;
1508  double lcit;
1509  double lnfactor;
1510  double lxj;
1511  double lvsat;
1512  double lat;
1513  double la0;
1514  double lags;
1515  double la1;
1516  double la2;
1517  double lketa;
1518  double lnsub;
1519  double lndep;
1520  double lnsd;
1521  double lphin;
1522  double lngate;
1523  double lgamma1;
1524  double lgamma2;
1525  double lvbx;
1526  double lvbm;
1527  double lxt;
1528  double lk1;
1529  double lkt1;
1530  double lkt1l;
1531  double lkt2;
1532  double lk2;
1533  double lk3;
1534  double lk3b;
1535  double lw0;
1536  double ldvtp0;
1537  double ldvtp1;
1538  double llpe0;
1539  double llpeb;
1540  double ldvt0;
1541  double ldvt1;
1542  double ldvt2;
1543  double ldvt0w;
1544  double ldvt1w;
1545  double ldvt2w;
1546  double ldrout;
1547  double ldsub;
1548  double lvth0;
1549  double lua;
1550  double lua1;
1551  double lub;
1552  double lub1;
1553  double luc;
1554  double luc1;
1555  double lud;
1556  double lud1;
1557  double lup;
1558  double llp;
1559  double lu0;
1560  double leu;
1561  double lute;
1562  double lvoff;
1563  double ltvoff;
1564  double lminv;
1565  double lminvcv;
1566  double ldelta;
1567  double lrdsw;
1568  double lrsw;
1569  double lrdw;
1570  double lprwg;
1571  double lprwb;
1572  double lprt;
1573  double leta0;
1574  double letab;
1575  double lpclm;
1576  double lpdibl1;
1577  double lpdibl2;
1578  double lpdiblb;
1579  double lfprout;
1580  double lpdits;
1581  double lpditsd;
1582  double lpscbe1;
1583  double lpscbe2;
1584  double lpvag;
1585  double lwr;
1586  double ldwg;
1587  double ldwb;
1588  double lb0;
1589  double lb1;
1590  double lalpha0;
1591  double lalpha1;
1592  double lbeta0;
1593  double lvfb;
1594  double lagidl;
1595  double lbgidl;
1596  double lcgidl;
1597  double legidl;
1598  double lagisl;
1599  double lbgisl;
1600  double lcgisl;
1601  double legisl;
1602  double laigc;
1603  double lbigc;
1604  double lcigc;
1605  double laigsd;
1606  double lbigsd;
1607  double lcigsd;
1608  double laigs;
1609  double lbigs;
1610  double lcigs;
1611  double laigd;
1612  double lbigd;
1613  double lcigd;
1614  double laigbacc;
1615  double lbigbacc;
1616  double lcigbacc;
1617  double laigbinv;
1618  double lbigbinv;
1619  double lcigbinv;
1620  double lnigc;
1621  double lnigbacc;
1622  double lnigbinv;
1623  double lntox;
1624  double leigbinv;
1625  double lpigcd;
1626  double lpoxedge;
1627  double lxrcrg1;
1628  double lxrcrg2;
1629  double llambda;
1630  double lvtl;
1631  double lxn;
1632  double lvfbsdoff;
1633  double ltvfbsdoff;
1634 
1635  // CV model
1636  double lcgsl;
1637  double lcgdl;
1638  double lckappas;
1639  double lckappad;
1640  double lcf;
1641  double lclc;
1642  double lcle;
1643  double lvfbcv;
1644  double lnoff;
1645  double lvoffcv;
1646  double lacde;
1647  double lmoin;
1648 
1649  // Width Dependence
1650  double wcdsc;
1651  double wcdscb;
1652  double wcdscd;
1653  double wcit;
1654  double wnfactor;
1655  double wxj;
1656  double wvsat;
1657  double wat;
1658  double wa0;
1659  double wags;
1660  double wa1;
1661  double wa2;
1662  double wketa;
1663  double wnsub;
1664  double wndep;
1665  double wnsd;
1666  double wphin;
1667  double wngate;
1668  double wgamma1;
1669  double wgamma2;
1670  double wvbx;
1671  double wvbm;
1672  double wxt;
1673  double wk1;
1674  double wkt1;
1675  double wkt1l;
1676  double wkt2;
1677  double wk2;
1678  double wk3;
1679  double wk3b;
1680  double ww0;
1681  double wdvtp0;
1682  double wdvtp1;
1683  double wlpe0;
1684  double wlpeb;
1685  double wdvt0;
1686  double wdvt1;
1687  double wdvt2;
1688  double wdvt0w;
1689  double wdvt1w;
1690  double wdvt2w;
1691  double wdrout;
1692  double wdsub;
1693  double wvth0;
1694  double wua;
1695  double wua1;
1696  double wub;
1697  double wub1;
1698  double wuc;
1699  double wuc1;
1700  double wud;
1701  double wud1;
1702  double wup;
1703  double wlp;
1704  double wu0;
1705  double weu;
1706  double wute;
1707  double wvoff;
1708  double wtvoff;
1709  double wminv;
1710  double wminvcv;
1711  double wdelta;
1712  double wrdsw;
1713  double wrsw;
1714  double wrdw;
1715  double wprwg;
1716  double wprwb;
1717  double wprt;
1718  double weta0;
1719  double wetab;
1720  double wpclm;
1721  double wpdibl1;
1722  double wpdibl2;
1723  double wpdiblb;
1724  double wfprout;
1725  double wpdits;
1726  double wpditsd;
1727  double wpscbe1;
1728  double wpscbe2;
1729  double wpvag;
1730  double wwr;
1731  double wdwg;
1732  double wdwb;
1733  double wb0;
1734  double wb1;
1735  double walpha0;
1736  double walpha1;
1737  double wbeta0;
1738  double wvfb;
1739  double wagidl;
1740  double wbgidl;
1741  double wcgidl;
1742  double wegidl;
1743  double wagisl;
1744  double wbgisl;
1745  double wcgisl;
1746  double wegisl;
1747  double waigc;
1748  double wbigc;
1749  double wcigc;
1750  double waigsd;
1751  double wbigsd;
1752  double wcigsd;
1753  double waigs;
1754  double wbigs;
1755  double wcigs;
1756  double waigd;
1757  double wbigd;
1758  double wcigd;
1759  double waigbacc;
1760  double wbigbacc;
1761  double wcigbacc;
1762  double waigbinv;
1763  double wbigbinv;
1764  double wcigbinv;
1765  double wnigc;
1766  double wnigbacc;
1767  double wnigbinv;
1768  double wntox;
1769  double weigbinv;
1770  double wpigcd;
1771  double wpoxedge;
1772  double wxrcrg1;
1773  double wxrcrg2;
1774  double wlambda;
1775  double wvtl;
1776  double wxn;
1777  double wvfbsdoff;
1778  double wtvfbsdoff;
1779 
1780  // CV model
1781  double wcgsl;
1782  double wcgdl;
1783  double wckappas;
1784  double wckappad;
1785  double wcf;
1786  double wclc;
1787  double wcle;
1788  double wvfbcv;
1789  double wnoff;
1790  double wvoffcv;
1791  double wacde;
1792  double wmoin;
1793 
1794  // Cross-term Dependence
1795  double pcdsc;
1796  double pcdscb;
1797  double pcdscd;
1798  double pcit;
1799  double pnfactor;
1800  double pxj;
1801  double pvsat;
1802  double pat;
1803  double pa0;
1804  double pags;
1805  double pa1;
1806  double pa2;
1807  double pketa;
1808  double pnsub;
1809  double pndep;
1810  double pnsd;
1811  double pphin;
1812  double pngate;
1813  double pgamma1;
1814  double pgamma2;
1815  double pvbx;
1816  double pvbm;
1817  double pxt;
1818  double pk1;
1819  double pkt1;
1820  double pkt1l;
1821  double pkt2;
1822  double pk2;
1823  double pk3;
1824  double pk3b;
1825  double pw0;
1826  double pdvtp0;
1827  double pdvtp1;
1828  double plpe0;
1829  double plpeb;
1830  double pdvt0;
1831  double pdvt1;
1832  double pdvt2;
1833  double pdvt0w;
1834  double pdvt1w;
1835  double pdvt2w;
1836  double pdrout;
1837  double pdsub;
1838  double pvth0;
1839  double pua;
1840  double pua1;
1841  double pub;
1842  double pub1;
1843  double puc;
1844  double puc1;
1845  double pud;
1846  double pud1;
1847  double pup;
1848  double plp;
1849  double pu0;
1850  double peu;
1851  double pute;
1852  double pvoff;
1853  double ptvoff;
1854  double pminv;
1855  double pminvcv;
1856  double pdelta;
1857  double prdsw;
1858  double prsw;
1859  double prdw;
1860  double pprwg;
1861  double pprwb;
1862  double pprt;
1863  double peta0;
1864  double petab;
1865  double ppclm;
1866  double ppdibl1;
1867  double ppdibl2;
1868  double ppdiblb;
1869  double pfprout;
1870  double ppdits;
1871  double ppditsd;
1872  double ppscbe1;
1873  double ppscbe2;
1874  double ppvag;
1875  double pwr;
1876  double pdwg;
1877  double pdwb;
1878  double pb0;
1879  double pb1;
1880  double palpha0;
1881  double palpha1;
1882  double pbeta0;
1883  double pvfb;
1884  double pagidl;
1885  double pbgidl;
1886  double pcgidl;
1887  double pegidl;
1888  double pagisl;
1889  double pbgisl;
1890  double pcgisl;
1891  double pegisl;
1892  double paigc;
1893  double pbigc;
1894  double pcigc;
1895  double paigsd;
1896  double pbigsd;
1897  double pcigsd;
1898  double paigs;
1899  double pbigs;
1900  double pcigs;
1901  double paigd;
1902  double pbigd;
1903  double pcigd;
1904  double paigbacc;
1905  double pbigbacc;
1906  double pcigbacc;
1907  double paigbinv;
1908  double pbigbinv;
1909  double pcigbinv;
1910  double pnigc;
1911  double pnigbacc;
1912  double pnigbinv;
1913  double pntox;
1914  double peigbinv;
1915  double ppigcd;
1916  double ppoxedge;
1917  double pxrcrg1;
1918  double pxrcrg2;
1919  double plambda;
1920  double pvtl;
1921  double pxn;
1922  double pvfbsdoff;
1923  double ptvfbsdoff;
1924 
1925  // CV model
1926  double pcgsl;
1927  double pcgdl;
1928  double pckappas;
1929  double pckappad;
1930  double pcf;
1931  double pclc;
1932  double pcle;
1933  double pvfbcv;
1934  double pnoff;
1935  double pvoffcv;
1936  double pacde;
1937  double pmoin;
1938 
1939  double tnom;
1940  double cgso;
1941  double cgdo;
1942  double cgbo;
1943  double xpart;
1944  double cFringOut;
1945  double cFringMax;
1946 
1976  double njtsstemp;
1977  double njtsswstemp;
1979  double njtsdtemp;
1980  double njtsswdtemp;
1982 
1983  double Lint;
1984  double Ll;
1985  double Llc;
1986  double Lln;
1987  double Lw;
1988  double Lwc;
1989  double Lwn;
1990  double Lwl;
1991  double Lwlc;
1992  double Lmin;
1993  double Lmax;
1994 
1995  double Wint;
1996  double Wl;
1997  double Wlc;
1998  double Wln;
1999  double Ww;
2000  double Wwc;
2001  double Wwn;
2002  double Wwl;
2003  double Wwlc;
2004  double Wmin;
2005  double Wmax;
2006 
2007  // added for stress effect
2008  double saref;
2009  double sbref;
2010  double wlod;
2011  double ku0;
2012  double kvsat;
2013  double kvth0;
2014  double tku0;
2015  double llodku0;
2016  double wlodku0;
2017  double llodvth;
2018  double wlodvth;
2019  double lku0;
2020  double wku0;
2021  double pku0;
2022  double lkvth0;
2023  double wkvth0;
2024  double pkvth0;
2025  double stk2;
2026  double lodk2;
2027  double steta0;
2028  double lodeta0;
2029 
2030  double web;
2031  double wec;
2032  double kvth0we;
2033  double k2we;
2034  double ku0we;
2035  double scref;
2036  double wpemod;
2037  double lkvth0we;
2038  double lk2we;
2039  double lku0we;
2040  double wkvth0we;
2041  double wk2we;
2042  double wku0we;
2043  double pkvth0we;
2044  double pk2we;
2045  double pku0we;
2046 
2047  // Pre-calculated constants
2048  // move to size-dependent param
2049  double Eg0;
2050  double vtm;
2051  double vtm0;
2052  double coxe;
2053  double coxp;
2054  double cof1;
2055  double cof2;
2056  double cof3;
2057  double cof4;
2058  double vcrit;
2059  double factor1;
2060  double PhiBS;
2061  double PhiBSWS;
2062  double PhiBSWGS;
2066  double PhiBD;
2067  double PhiBSWD;
2068  double PhiBSWGD;
2078 
2082  double em;
2083  double ef;
2084  double af;
2085  double kf;
2086 
2087  double ni;
2088  double Vtm0;
2089 
2090  // given variables:
2091  bool vtlGiven;
2094  bool k1Given;
2095  bool k2Given;
2098  bool xtGiven;
2099  bool vbxGiven;
2101  bool vfbGiven;
2111 
2116  bool dlcGiven;
2119 
2120  std::list<SizeDependParam*> sizeDependParamList;
2121 };
2122 
2123 //-----------------------------------------------------------------------------
2124 // Function : Instance:isConverged ()
2125 // Purpose : Return whether a BSIM3 device has done something that should
2126 // be interpreted as invalidating other convergence tests
2127 // In case of bsim3, just do it if the limiter function
2128 // pnjlim. This actually agrees with how the Check flag
2129 // is used in Spice3F5 b3ld.c
2130 // Special Notes :
2131 // Scope : public
2132 // Creator : Tom Russo, SNL, Component Information and Models
2133 // Creation Date : 03/22/05
2134 //-----------------------------------------------------------------------------
2136 {
2137  return (!limitedFlag);
2138 }
2139 
2140 //-----------------------------------------------------------------------------
2141 // Class : Master
2142 // Purpose :
2143 // Special Notes :
2144 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
2145 // Creation Date : 11/26/08
2146 //-----------------------------------------------------------------------------
2147 class Master : public DeviceMaster<Traits>
2148 {
2149  friend class SizeDependParam;
2150  friend class Instance;
2151  friend class Model;
2152 
2153 public:
2155  const Configuration & configuration,
2156  const FactoryBlock & factory_block,
2157  const SolverState & ss1,
2158  const DeviceOptions & do1)
2159  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
2160  {}
2161 
2162  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
2163 
2164  // load functions, residual:
2165  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * storeLeadF, double * storeLeadQ);
2166 
2167  // load functions, Jacobian:
2168  virtual bool loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx);
2169 };
2170 
2171 void registerDevice();
2172 
2173 } // namespace MOSFET_B4
2174 } // namespace Device
2175 } // namespace Xyce
2176 
2180 
2181 #endif
2182