Xyce  6.1
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-2015 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.62.2.1 $
40 //
41 // Revision Date : $Date: 2015/04/02 18:20:11 $
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 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  void loadNodeSymbols(Util::SymbolTable &symbol_table) const; // override
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 
799  // b4ld function variables
800  double Gm, Gmbs, FwdSum, RevSum;
802  double cqgate, cqbody, cqdrn;
803 
806 
811 
813  double ceqjs, ceqjd;
814  double vbs_jct, vbd_jct;
815  double ceqqjs, ceqqjd;
816  double ceqqgmid;
817  double gjbd, gjbs, gdpr, gspr, geltd, gcggb;
818  double ggtg, gcgdb, ggtd, gcgsb;
819  double ggts, gcgbb, ggtb;
825 
828  double vgmb;
829 
832 
834  double ceqqjs_Jdxp;
835  double ceqqjd_Jdxp;
836 
837  double qgmb;
838  double qgb;
839  double Cgg, Cgd;
840  double Cgb, Cdg, Cdd, Cds;
841  double Csg, Csd, Css;
842  double Csb, Cbg, Cbd;
843  double Cbb;
844 
845  // Capacitance variables
846  // In general gcggb --> CAPcggb.
847  // gcgdb --> CAPcgdb. etc.
848  double CAPcggb;
849  double CAPcgdb;
850  double CAPcgsb;
851  double CAPcbgb;
852  double CAPcbdb;
853  double CAPcbsb;
854  double CAPcdgb;
855  double CAPcdgmb;
856  double CAPcddb;
857  double CAPcdbdb;
858  double CAPcdsb;
859  double CAPcsgb;
860  double CAPcsdb;
861  double CAPcssb;
862  double CAPcgmdb;
863  double CAPcgmsb;
864  double CAPcgmgmb;
865  double CAPcbgmb;
866  double CAPcsbsb;
867  double CAPcqgb;
868  double CAPcqdb;
869  double CAPcqsb;
870 
871  double CAPcgmbb;
872  double CAPcsgmb;
873  double CAPcgbb;
874  double CAPcdbb;
875  double CAPcsbb;
876  double CAPcbbb;
877  double CAPcqbb;
878 
879  double Qeqqd_Jdxp;
880  double Qeqqb_Jdxp;
881  double Qeqqg_Jdxp;
882 
884  double Qeqqjs_Jdxp;
885  double Qeqqjd_Jdxp;
886  double Qqcheq_Jdxp;
887  // end of new-DAE stuff.
888 
889  // gate resistor model currents (not needed in spice version)
890  //
891  // rgateMod==0 no gate resistor.
892  // rgateMod==1 linear gate resistor
893  // rgateMod==2 nonlinear gate resistor
894  // rgateMod==3 2 gate resistors, in series.
895  //
896  double Igate; // used by rgateMod= 1,2, and 3
897  double Igate_Jdxp;// used by rgateMod= 1,2, and 3
898  double IgateMid; // used by rgateMod= 3 only
899  double IgateMid_Jdxp; // used by rgateMod= 3 only
900 
901  // gate model voltage drops:
902  double Vgegp, Vgegp_orig;
903  double Vgegm, Vgegm_orig;
904  double Vgmgp, Vgmgp_orig;
905 
906  // state variables, intrinsic capacitors
907  double qb;
908  double qg;
909  double qd;
910  double qgmid;
911 
912  // state variables, parasitic capacitors
913  double qbs;
914  double qbd;
915 
916  // state variables, cheq
917  double qcheq;
918  double cqcheq;
919  double cqcheq_Jdxp;
920 
921  // state variables, cdump There is no "qcdump" variable, just cqcdump
922  double cqcdump;
923 
924  // this is a state variable in SPICE, but we use it only as an
925  // instance variable --- it is always type*Qtotal
926  double qdef;
927 
928  // Indices into the state vector:
929 
930  // state variables, voltage drops
945 
946  // state variables, intrinsic capacitors
951 
952  // state variables, parasitic capacitors
955 
956  // state variables, cheq
958 
959  // state variables, cdump
961 
962  // state variable, qdef
964 
965  ////////////////////////////////////////////////////////////////////
966  // Local variable indices
967  int li_Drain; // dNode;
968  int li_GateExt; // gNodeExt;
969  int li_Source; // sNode;
970  int li_Body; // bNode;
971  int li_DrainPrime; // dNodePrime;
972  int li_GatePrime; // gNodePrime;
973  int li_GateMid; // gNodeMid;
974  int li_SourcePrime;// sNodePrime;
975  int li_BodyPrime; // bNodePrime;
976  int li_DrainBody; // dbNode;
977  int li_SourceBody; // sbNode;
978  int li_Charge; // qNode;
979 
980  // local indies
981  int li_Ibs;
982  int li_Ids;
983  int li_Igs;
984 
985  ////////////////////////////////////////////////////////////////////
986  // Jacobian matrix offsets:
991  int Dd, Dgp, Ddp, Dsp, Dbp, Dids;
993  int Ss, Sdp, Sgp, Ssp, Sbp, Sibs, Sids, Sigs;
995  int DBdp, DBdb, DBbp, DBb;
996  int SBsp, SBbp, SBb, SBsb;
997  int Bdb, Bbp, Bsb, Bb, Bibs;
998  int Qq, Qgp, Qdp, Qsp, Qbp;
999 
1000  // icVBS
1001  int IBSb;
1002  int IBSs;
1003  int IBSibs;
1004 
1005  // icVDS
1006  int IDSd;
1007  int IDSs;
1008  int IDSids;
1009 
1010  // icVGS
1011  int IGSg;
1012  int IGSs;
1013  int IGSigs;
1014 
1015 
1016 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1017  // Jacobian Matrix Pointers
1018 
1019  double * f_DdPtr ; double * q_DdPtr ;
1020  double * f_DdpPtr ; double * q_DdpPtr ;
1021  double * f_DspPtr ; double * q_DspPtr ;
1022  double * f_DgpPtr ; double * q_DgpPtr ;
1023  double * f_DbpPtr ; double * q_DbpPtr ;
1024  double * f_DidsPtr;
1025 
1026  double * f_GEgePtr ; double * q_GEgePtr ;
1027  double * f_GEdpPtr ; double * q_GEdpPtr ;
1028  double * f_GEspPtr ; double * q_GEspPtr ;
1029  double * f_GEgpPtr ; double * q_GEgpPtr ;
1030  double * f_GEgmPtr ; double * q_GEgmPtr ;
1031  double * f_GEbpPtr ; double * q_GEbpPtr ;
1032  double * f_GEigsPtr;
1033 
1034  double * f_SsPtr ; double * q_SsPtr ;
1035  double * f_SdpPtr ; double * q_SdpPtr ;
1036  double * f_SspPtr ; double * q_SspPtr ;
1037  double * f_SgpPtr ; double * q_SgpPtr ;
1038  double * f_SbpPtr ; double * q_SbpPtr ;
1039  double * f_SibsPtr;
1040  double * f_SidsPtr;
1041  double * f_SigsPtr;
1042 
1043  double * f_BbPtr ; double * q_BbPtr ;
1044  double * f_BbpPtr ; double * q_BbpPtr ;
1045  double * f_BsbPtr ; double * q_BsbPtr ;
1046  double * f_BdbPtr ; double * q_BdbPtr ;
1047  double * f_BibsPtr;
1048 
1049  double * f_DPdPtr ; double * q_DPdPtr ;
1050  double * f_DPdpPtr ; double * q_DPdpPtr ;
1051  double * f_DPspPtr ; double * q_DPspPtr ;
1052  double * f_DPgpPtr ; double * q_DPgpPtr ;
1053  double * f_DPgmPtr ; double * q_DPgmPtr ;
1054  double * f_DPbpPtr ; double * q_DPbpPtr ;
1055  double * f_DPdbPtr ; double * q_DPdbPtr ;
1056 
1057 
1058  double * f_DPqPtr ; double * q_DPqPtr ;
1059 
1060 
1061  double * f_SPsPtr ; double * q_SPsPtr ;
1062  double * f_SPdpPtr ; double * q_SPdpPtr ;
1063  double * f_SPspPtr ; double * q_SPspPtr ;
1064  double * f_SPgpPtr ; double * q_SPgpPtr ;
1065  double * f_SPgmPtr ; double * q_SPgmPtr ;
1066  double * f_SPbpPtr ; double * q_SPbpPtr ;
1067  double * f_SPsbPtr ; double * q_SPsbPtr ;
1068 
1069  double * f_SPqPtr ; double * q_SPqPtr ;
1070 
1071  double * f_GPgePtr; double * q_GPgePtr;
1072  double * f_GPdpPtr; double * q_GPdpPtr;
1073  double * f_GPspPtr; double * q_GPspPtr;
1074  double * f_GPgpPtr; double * q_GPgpPtr;
1075  double * f_GPgmPtr; double * q_GPgmPtr;
1076  double * f_GPbpPtr; double * q_GPbpPtr;
1077 
1078  double * f_GPqPtr; double * q_GPqPtr;
1079 
1080  double * f_GMgePtr; double * q_GMgePtr;
1081  double * f_GMdpPtr; double * q_GMdpPtr;
1082  double * f_GMspPtr; double * q_GMspPtr;
1083  double * f_GMgpPtr; double * q_GMgpPtr;
1084  double * f_GMgmPtr; double * q_GMgmPtr;
1085  double * f_GMbpPtr; double * q_GMbpPtr;
1086 
1087  double * f_BPbPtr ; double * q_BPbPtr ;
1088  double * f_BPdpPtr; double * q_BPdpPtr;
1089  double * f_BPspPtr; double * q_BPspPtr;
1090  double * f_BPgpPtr; double * q_BPgpPtr;
1091  double * f_BPgmPtr; double * q_BPgmPtr;
1092  double * f_BPbpPtr; double * q_BPbpPtr;
1093  double * f_BPsbPtr; double * q_BPsbPtr;
1094  double * f_BPdbPtr; double * q_BPdbPtr;
1095 
1096  double * f_SBbPtr ; double * q_SBbPtr ;
1097  double * f_SBspPtr; double * q_SBspPtr;
1098  double * f_SBbpPtr; double * q_SBbpPtr;
1099  double * f_SBsbPtr; double * q_SBsbPtr;
1100 
1101  double * f_DBbPtr ; double * q_DBbPtr ;
1102  double * f_DBdpPtr; double * q_DBdpPtr;
1103  double * f_DBbpPtr; double * q_DBbpPtr;
1104  double * f_DBdbPtr; double * q_DBdbPtr;
1105 
1106  double * f_QdpPtr; double * q_QdpPtr;
1107  double * f_QspPtr; double * q_QspPtr;
1108  double * f_QgpPtr; double * q_QgpPtr;
1109  double * f_QbpPtr; double * q_QbpPtr;
1110  double * f_QqPtr ; double * q_QqPtr ;
1111 
1112  double * f_IBSbPtr;
1113  double * f_IBSsPtr;
1114  double * f_IBSibsPtr;
1115  double * f_IDSdPtr;
1116  double * f_IDSsPtr;
1117  double * f_IDSidsPtr;
1118  double * f_IGSgPtr;
1119  double * f_IGSsPtr;
1120  double * f_IGSigsPtr;
1121 #endif
1122 
1123  // flag for updateTemperature call. Needed for .STEP temperature sweeps.
1125 
1126  // Jacobian stamp related structures:
1127  std::vector< std::vector<int> > jacStamp;
1128  std::vector<int> jacMap;
1129  std::vector< std::vector<int> > jacMap2;
1130 
1131  int blockHomotopyID; // For homotopy
1132  double randomPerturb; // For homotopy
1133 
1139  double T0;
1140 };
1141 
1142 //-----------------------------------------------------------------------------
1143 // Class : Model
1144 // Purpose :
1145 // Special Notes :
1146 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
1147 // Creation Date : 11/25/06
1148 //-----------------------------------------------------------------------------
1149 class Model : public DeviceModel
1150 {
1151  typedef std::vector<Instance *> InstanceVector;
1152 
1153  friend class SizeDependParam;
1154  friend class ParametricData<Model>;
1155  friend class Instance;
1156  friend class Traits;friend class Master;
1157 
1158 public:
1159  Model(
1160  const Configuration & configuration,
1161  const ModelBlock & MB,
1162  const FactoryBlock & factory_block);
1163  ~Model();
1164 
1165 private:
1166  Model();
1167  Model(const Model &);
1168  Model &operator=(const Model &);
1169 
1170 public:
1171  virtual void forEachInstance(DeviceInstanceOp &op) const /* override */;
1172 
1173  virtual std::ostream &printOutInstances(std::ostream &os) const;
1174 
1175  bool processParams ();
1176  bool processInstanceParams ();
1177 
1178  bool clearTemperatureData ();
1179 
1180 
1181 public:
1182  void addInstance(Instance *instance)
1183  {
1184  instanceContainer.push_back(instance);
1185  }
1186 
1187 private:
1188  std::vector<Instance*> instanceContainer;
1189 
1190 private:
1191 
1192 
1193  // 3f5 stuff:
1194  int modType;
1195  int dtype;
1196 
1197  int mobMod;
1199  int capMod;
1200  int dioMod;
1203  int fnoiMod;
1204  int tnoiMod;
1205  int rdsMod;
1208  int perMod;
1209  int geoMod;
1210  int mtrlMod;
1211  int igcMod;
1212  int igbMod;
1213  int tempMod;
1214  int binUnit;
1216  std::string version;
1217  double eot;
1218  double vddeot;
1219  double ados;
1220  double bdos;
1221  double toxe;
1222  double toxp;
1223  double toxm;
1224  double dtox;
1225  double epsrox;
1226  double cdsc;
1227  double cdscb;
1228  double cdscd;
1229  double cit;
1230  double nfactor;
1231  double xj;
1232  double vsat;
1233  double at;
1234  double a0;
1235  double ags;
1236  double a1;
1237  double a2;
1238  double keta;
1239  double nsub;
1240  double phig;
1241  double epsrgate;
1242  double easub;
1243  double epsrsub;
1244  double ni0sub;
1245  double bg0sub;
1246  double tbgasub;
1247  double tbgbsub;
1248  double ndep;
1249  double nsd;
1250  double phin;
1251  double ngate;
1252  double gamma1;
1253  double gamma2;
1254  double vbx;
1255  double vbm;
1256  double xt;
1257  double k1;
1258  double kt1;
1259  double kt1l;
1260  double kt2;
1261  double k2;
1262  double k3;
1263  double k3b;
1264  double w0;
1265  double dvtp0;
1266  double dvtp1;
1267  double lpe0;
1268  double lpeb;
1269  double dvt0;
1270  double dvt1;
1271  double dvt2;
1272  double dvt0w;
1273  double dvt1w;
1274  double dvt2w;
1275  double drout;
1276  double dsub;
1277  double vth0;
1278  double eu;
1279  double ua;
1280  double ua1;
1281  double ub;
1282  double ub1;
1283  double uc;
1284  double uc1;
1285  double ud;
1286  double ud1;
1287  double up;
1288  double lp;
1289  double u0;
1290  double ute;
1291  double voff;
1292  double tvoff;
1293  double minv;
1294  double minvcv;
1295  double voffl;
1296  double voffcvl;
1297  double delta;
1298  double rdsw;
1299  double rdswmin;
1300  double rdwmin;
1301  double rswmin;
1302  double rsw;
1303  double rdw;
1304  double prwg;
1305  double prwb;
1306  double prt;
1307  double eta0;
1308  double etab;
1309  double pclm;
1310  double pdibl1;
1311  double pdibl2;
1312  double pdiblb;
1313  double fprout;
1314  double pdits;
1315  double pditsd;
1316  double pditsl;
1317  double pscbe1;
1318  double pscbe2;
1319  double pvag;
1320  double wr;
1321  double dwg;
1322  double dwb;
1323  double b0;
1324  double b1;
1325  double alpha0;
1326  double alpha1;
1327  double beta0;
1328  double agidl;
1329  double bgidl;
1330  double cgidl;
1331  double egidl;
1332  double agisl;
1333  double bgisl;
1334  double cgisl;
1335  double egisl;
1336  double aigc;
1337  double bigc;
1338  double cigc;
1339  double aigsd;
1340  double bigsd;
1341  double cigsd;
1342  double aigs;
1343  double bigs;
1344  double cigs;
1345  double aigd;
1346  double bigd;
1347  double cigd;
1348  double aigbacc;
1349  double bigbacc;
1350  double cigbacc;
1351  double aigbinv;
1352  double bigbinv;
1353  double cigbinv;
1354  double nigc;
1355  double nigbacc;
1356  double nigbinv;
1357  double ntox;
1358  double eigbinv;
1359  double pigcd;
1360  double poxedge;
1361  double toxref;
1362  double ijthdfwd;
1363  double ijthsfwd;
1364  double ijthdrev;
1365  double ijthsrev;
1366  double xjbvd;
1367  double xjbvs;
1368  double bvd;
1369  double bvs;
1370 
1371  double jtss;
1372  double jtsd;
1373  double jtssws;
1374  double jtsswd;
1375  double jtsswgs;
1376  double jtsswgd;
1377  double njts;
1378  double njtssw;
1379  double njtsswg;
1380  double njtsd;
1381  double njtsswd;
1382  double njtsswgd;
1383  double xtss;
1384  double xtsd;
1385  double xtssws;
1386  double xtsswd;
1387  double xtsswgs;
1388  double xtsswgd;
1389  double tnjts;
1390  double tnjtssw;
1391  double tnjtsswg;
1392  double tnjtsd;
1393  double tnjtsswd;
1394  double tnjtsswgd;
1395  double vtss;
1396  double vtsd;
1397  double vtssws;
1398  double vtsswd;
1399  double vtsswgs;
1400  double vtsswgd;
1401 
1402  double xrcrg1;
1403  double xrcrg2;
1404  double lambda;
1405  double vtl;
1406  double lc;
1407  double xn;
1408  double vfbsdoff; // S/D flatband offset voltage
1409  double lintnoi; // lint offset for noise calculation
1410  double tvfbsdoff;
1411 
1412  double vfb;
1413  double gbmin;
1414  double rbdb;
1415  double rbsb;
1416  double rbpb;
1417  double rbps;
1418  double rbpd;
1419 
1420  double rbps0;
1421  double rbpsl;
1422  double rbpsw;
1423  double rbpsnf;
1424 
1425  double rbpd0;
1426  double rbpdl;
1427  double rbpdw;
1428  double rbpdnf;
1429 
1430  double rbpbx0;
1431  double rbpbxl;
1432  double rbpbxw;
1433  double rbpbxnf;
1434  double rbpby0;
1435  double rbpbyl;
1436  double rbpbyw;
1437  double rbpbynf;
1438 
1439  double rbsbx0;
1440  double rbsby0;
1441  double rbdbx0;
1442  double rbdby0;
1443 
1444  double rbsdbxl;
1445  double rbsdbxw;
1446  double rbsdbxnf;
1447  double rbsdbyl;
1448  double rbsdbyw;
1449  double rbsdbynf;
1450 
1451  double tnoia;
1452  double tnoib;
1453  double rnoia;
1454  double rnoib;
1455  double ntnoi;
1456 
1457  // CV model and Parasitics
1458  double cgsl;
1459  double cgdl;
1460  double ckappas;
1461  double ckappad;
1462  double cf;
1463  double vfbcv;
1464  double clc;
1465  double cle;
1466  double dwc;
1467  double dlc;
1468  double xw;
1469  double xl;
1470  double dlcig;
1471  double dlcigd;
1472  double dwj;
1473  double noff;
1474  double voffcv;
1475  double acde;
1476  double moin;
1477  double tcj;
1478  double tcjsw;
1479  double tcjswg;
1480  double tpb;
1481  double tpbsw;
1482  double tpbswg;
1483  double dmcg;
1484  double dmci;
1485  double dmdg;
1486  double dmcgt;
1487  double xgw;
1488  double xgl;
1489  double rshg;
1490  double ngcon;
1491 
1492  // Length Dependence
1493  double lcdsc;
1494  double lcdscb;
1495  double lcdscd;
1496  double lcit;
1497  double lnfactor;
1498  double lxj;
1499  double lvsat;
1500  double lat;
1501  double la0;
1502  double lags;
1503  double la1;
1504  double la2;
1505  double lketa;
1506  double lnsub;
1507  double lndep;
1508  double lnsd;
1509  double lphin;
1510  double lngate;
1511  double lgamma1;
1512  double lgamma2;
1513  double lvbx;
1514  double lvbm;
1515  double lxt;
1516  double lk1;
1517  double lkt1;
1518  double lkt1l;
1519  double lkt2;
1520  double lk2;
1521  double lk3;
1522  double lk3b;
1523  double lw0;
1524  double ldvtp0;
1525  double ldvtp1;
1526  double llpe0;
1527  double llpeb;
1528  double ldvt0;
1529  double ldvt1;
1530  double ldvt2;
1531  double ldvt0w;
1532  double ldvt1w;
1533  double ldvt2w;
1534  double ldrout;
1535  double ldsub;
1536  double lvth0;
1537  double lua;
1538  double lua1;
1539  double lub;
1540  double lub1;
1541  double luc;
1542  double luc1;
1543  double lud;
1544  double lud1;
1545  double lup;
1546  double llp;
1547  double lu0;
1548  double leu;
1549  double lute;
1550  double lvoff;
1551  double ltvoff;
1552  double lminv;
1553  double lminvcv;
1554  double ldelta;
1555  double lrdsw;
1556  double lrsw;
1557  double lrdw;
1558  double lprwg;
1559  double lprwb;
1560  double lprt;
1561  double leta0;
1562  double letab;
1563  double lpclm;
1564  double lpdibl1;
1565  double lpdibl2;
1566  double lpdiblb;
1567  double lfprout;
1568  double lpdits;
1569  double lpditsd;
1570  double lpscbe1;
1571  double lpscbe2;
1572  double lpvag;
1573  double lwr;
1574  double ldwg;
1575  double ldwb;
1576  double lb0;
1577  double lb1;
1578  double lalpha0;
1579  double lalpha1;
1580  double lbeta0;
1581  double lvfb;
1582  double lagidl;
1583  double lbgidl;
1584  double lcgidl;
1585  double legidl;
1586  double lagisl;
1587  double lbgisl;
1588  double lcgisl;
1589  double legisl;
1590  double laigc;
1591  double lbigc;
1592  double lcigc;
1593  double laigsd;
1594  double lbigsd;
1595  double lcigsd;
1596  double laigs;
1597  double lbigs;
1598  double lcigs;
1599  double laigd;
1600  double lbigd;
1601  double lcigd;
1602  double laigbacc;
1603  double lbigbacc;
1604  double lcigbacc;
1605  double laigbinv;
1606  double lbigbinv;
1607  double lcigbinv;
1608  double lnigc;
1609  double lnigbacc;
1610  double lnigbinv;
1611  double lntox;
1612  double leigbinv;
1613  double lpigcd;
1614  double lpoxedge;
1615  double lxrcrg1;
1616  double lxrcrg2;
1617  double llambda;
1618  double lvtl;
1619  double lxn;
1620  double lvfbsdoff;
1621  double ltvfbsdoff;
1622 
1623  // CV model
1624  double lcgsl;
1625  double lcgdl;
1626  double lckappas;
1627  double lckappad;
1628  double lcf;
1629  double lclc;
1630  double lcle;
1631  double lvfbcv;
1632  double lnoff;
1633  double lvoffcv;
1634  double lacde;
1635  double lmoin;
1636 
1637  // Width Dependence
1638  double wcdsc;
1639  double wcdscb;
1640  double wcdscd;
1641  double wcit;
1642  double wnfactor;
1643  double wxj;
1644  double wvsat;
1645  double wat;
1646  double wa0;
1647  double wags;
1648  double wa1;
1649  double wa2;
1650  double wketa;
1651  double wnsub;
1652  double wndep;
1653  double wnsd;
1654  double wphin;
1655  double wngate;
1656  double wgamma1;
1657  double wgamma2;
1658  double wvbx;
1659  double wvbm;
1660  double wxt;
1661  double wk1;
1662  double wkt1;
1663  double wkt1l;
1664  double wkt2;
1665  double wk2;
1666  double wk3;
1667  double wk3b;
1668  double ww0;
1669  double wdvtp0;
1670  double wdvtp1;
1671  double wlpe0;
1672  double wlpeb;
1673  double wdvt0;
1674  double wdvt1;
1675  double wdvt2;
1676  double wdvt0w;
1677  double wdvt1w;
1678  double wdvt2w;
1679  double wdrout;
1680  double wdsub;
1681  double wvth0;
1682  double wua;
1683  double wua1;
1684  double wub;
1685  double wub1;
1686  double wuc;
1687  double wuc1;
1688  double wud;
1689  double wud1;
1690  double wup;
1691  double wlp;
1692  double wu0;
1693  double weu;
1694  double wute;
1695  double wvoff;
1696  double wtvoff;
1697  double wminv;
1698  double wminvcv;
1699  double wdelta;
1700  double wrdsw;
1701  double wrsw;
1702  double wrdw;
1703  double wprwg;
1704  double wprwb;
1705  double wprt;
1706  double weta0;
1707  double wetab;
1708  double wpclm;
1709  double wpdibl1;
1710  double wpdibl2;
1711  double wpdiblb;
1712  double wfprout;
1713  double wpdits;
1714  double wpditsd;
1715  double wpscbe1;
1716  double wpscbe2;
1717  double wpvag;
1718  double wwr;
1719  double wdwg;
1720  double wdwb;
1721  double wb0;
1722  double wb1;
1723  double walpha0;
1724  double walpha1;
1725  double wbeta0;
1726  double wvfb;
1727  double wagidl;
1728  double wbgidl;
1729  double wcgidl;
1730  double wegidl;
1731  double wagisl;
1732  double wbgisl;
1733  double wcgisl;
1734  double wegisl;
1735  double waigc;
1736  double wbigc;
1737  double wcigc;
1738  double waigsd;
1739  double wbigsd;
1740  double wcigsd;
1741  double waigs;
1742  double wbigs;
1743  double wcigs;
1744  double waigd;
1745  double wbigd;
1746  double wcigd;
1747  double waigbacc;
1748  double wbigbacc;
1749  double wcigbacc;
1750  double waigbinv;
1751  double wbigbinv;
1752  double wcigbinv;
1753  double wnigc;
1754  double wnigbacc;
1755  double wnigbinv;
1756  double wntox;
1757  double weigbinv;
1758  double wpigcd;
1759  double wpoxedge;
1760  double wxrcrg1;
1761  double wxrcrg2;
1762  double wlambda;
1763  double wvtl;
1764  double wxn;
1765  double wvfbsdoff;
1766  double wtvfbsdoff;
1767 
1768  // CV model
1769  double wcgsl;
1770  double wcgdl;
1771  double wckappas;
1772  double wckappad;
1773  double wcf;
1774  double wclc;
1775  double wcle;
1776  double wvfbcv;
1777  double wnoff;
1778  double wvoffcv;
1779  double wacde;
1780  double wmoin;
1781 
1782  // Cross-term Dependence
1783  double pcdsc;
1784  double pcdscb;
1785  double pcdscd;
1786  double pcit;
1787  double pnfactor;
1788  double pxj;
1789  double pvsat;
1790  double pat;
1791  double pa0;
1792  double pags;
1793  double pa1;
1794  double pa2;
1795  double pketa;
1796  double pnsub;
1797  double pndep;
1798  double pnsd;
1799  double pphin;
1800  double pngate;
1801  double pgamma1;
1802  double pgamma2;
1803  double pvbx;
1804  double pvbm;
1805  double pxt;
1806  double pk1;
1807  double pkt1;
1808  double pkt1l;
1809  double pkt2;
1810  double pk2;
1811  double pk3;
1812  double pk3b;
1813  double pw0;
1814  double pdvtp0;
1815  double pdvtp1;
1816  double plpe0;
1817  double plpeb;
1818  double pdvt0;
1819  double pdvt1;
1820  double pdvt2;
1821  double pdvt0w;
1822  double pdvt1w;
1823  double pdvt2w;
1824  double pdrout;
1825  double pdsub;
1826  double pvth0;
1827  double pua;
1828  double pua1;
1829  double pub;
1830  double pub1;
1831  double puc;
1832  double puc1;
1833  double pud;
1834  double pud1;
1835  double pup;
1836  double plp;
1837  double pu0;
1838  double peu;
1839  double pute;
1840  double pvoff;
1841  double ptvoff;
1842  double pminv;
1843  double pminvcv;
1844  double pdelta;
1845  double prdsw;
1846  double prsw;
1847  double prdw;
1848  double pprwg;
1849  double pprwb;
1850  double pprt;
1851  double peta0;
1852  double petab;
1853  double ppclm;
1854  double ppdibl1;
1855  double ppdibl2;
1856  double ppdiblb;
1857  double pfprout;
1858  double ppdits;
1859  double ppditsd;
1860  double ppscbe1;
1861  double ppscbe2;
1862  double ppvag;
1863  double pwr;
1864  double pdwg;
1865  double pdwb;
1866  double pb0;
1867  double pb1;
1868  double palpha0;
1869  double palpha1;
1870  double pbeta0;
1871  double pvfb;
1872  double pagidl;
1873  double pbgidl;
1874  double pcgidl;
1875  double pegidl;
1876  double pagisl;
1877  double pbgisl;
1878  double pcgisl;
1879  double pegisl;
1880  double paigc;
1881  double pbigc;
1882  double pcigc;
1883  double paigsd;
1884  double pbigsd;
1885  double pcigsd;
1886  double paigs;
1887  double pbigs;
1888  double pcigs;
1889  double paigd;
1890  double pbigd;
1891  double pcigd;
1892  double paigbacc;
1893  double pbigbacc;
1894  double pcigbacc;
1895  double paigbinv;
1896  double pbigbinv;
1897  double pcigbinv;
1898  double pnigc;
1899  double pnigbacc;
1900  double pnigbinv;
1901  double pntox;
1902  double peigbinv;
1903  double ppigcd;
1904  double ppoxedge;
1905  double pxrcrg1;
1906  double pxrcrg2;
1907  double plambda;
1908  double pvtl;
1909  double pxn;
1910  double pvfbsdoff;
1911  double ptvfbsdoff;
1912 
1913  // CV model
1914  double pcgsl;
1915  double pcgdl;
1916  double pckappas;
1917  double pckappad;
1918  double pcf;
1919  double pclc;
1920  double pcle;
1921  double pvfbcv;
1922  double pnoff;
1923  double pvoffcv;
1924  double pacde;
1925  double pmoin;
1926 
1927  double tnom;
1928  double cgso;
1929  double cgdo;
1930  double cgbo;
1931  double xpart;
1932  double cFringOut;
1933  double cFringMax;
1934 
1964  double njtsstemp;
1965  double njtsswstemp;
1967  double njtsdtemp;
1968  double njtsswdtemp;
1970 
1971  double Lint;
1972  double Ll;
1973  double Llc;
1974  double Lln;
1975  double Lw;
1976  double Lwc;
1977  double Lwn;
1978  double Lwl;
1979  double Lwlc;
1980  double Lmin;
1981  double Lmax;
1982 
1983  double Wint;
1984  double Wl;
1985  double Wlc;
1986  double Wln;
1987  double Ww;
1988  double Wwc;
1989  double Wwn;
1990  double Wwl;
1991  double Wwlc;
1992  double Wmin;
1993  double Wmax;
1994 
1995  // added for stress effect
1996  double saref;
1997  double sbref;
1998  double wlod;
1999  double ku0;
2000  double kvsat;
2001  double kvth0;
2002  double tku0;
2003  double llodku0;
2004  double wlodku0;
2005  double llodvth;
2006  double wlodvth;
2007  double lku0;
2008  double wku0;
2009  double pku0;
2010  double lkvth0;
2011  double wkvth0;
2012  double pkvth0;
2013  double stk2;
2014  double lodk2;
2015  double steta0;
2016  double lodeta0;
2017 
2018  double web;
2019  double wec;
2020  double kvth0we;
2021  double k2we;
2022  double ku0we;
2023  double scref;
2024  double wpemod;
2025  double lkvth0we;
2026  double lk2we;
2027  double lku0we;
2028  double wkvth0we;
2029  double wk2we;
2030  double wku0we;
2031  double pkvth0we;
2032  double pk2we;
2033  double pku0we;
2034 
2035  // Pre-calculated constants
2036  // move to size-dependent param
2037  double Eg0;
2038  double vtm;
2039  double vtm0;
2040  double coxe;
2041  double coxp;
2042  double cof1;
2043  double cof2;
2044  double cof3;
2045  double cof4;
2046  double vcrit;
2047  double factor1;
2048  double PhiBS;
2049  double PhiBSWS;
2050  double PhiBSWGS;
2054  double PhiBD;
2055  double PhiBSWD;
2056  double PhiBSWGD;
2066 
2070  double em;
2071  double ef;
2072  double af;
2073  double kf;
2074 
2075  double ni;
2076  double Vtm0;
2077 
2078  // given variables:
2079  bool vtlGiven;
2082  bool k1Given;
2083  bool k2Given;
2086  bool xtGiven;
2087  bool vbxGiven;
2089  bool vfbGiven;
2099 
2104  bool dlcGiven;
2107 
2108  std::list<SizeDependParam*> sizeDependParamList;
2109 };
2110 
2111 //-----------------------------------------------------------------------------
2112 // Function : Instance:isConverged ()
2113 // Purpose : Return whether a BSIM3 device has done something that should
2114 // be interpreted as invalidating other convergence tests
2115 // In case of bsim3, just do it if the limiter function
2116 // pnjlim. This actually agrees with how the Check flag
2117 // is used in Spice3F5 b3ld.c
2118 // Special Notes :
2119 // Scope : public
2120 // Creator : Tom Russo, SNL, Component Information and Models
2121 // Creation Date : 03/22/05
2122 //-----------------------------------------------------------------------------
2124 {
2125  return (!limitedFlag);
2126 }
2127 
2128 //-----------------------------------------------------------------------------
2129 // Class : Master
2130 // Purpose :
2131 // Special Notes :
2132 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
2133 // Creation Date : 11/26/08
2134 //-----------------------------------------------------------------------------
2135 class Master : public DeviceMaster<Traits>
2136 {
2137  friend class SizeDependParam;
2138  friend class Instance;
2139  friend class Model;
2140 
2141 public:
2143  const Configuration & configuration,
2144  const FactoryBlock & factory_block,
2145  const SolverState & ss1,
2146  const DeviceOptions & do1)
2147  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
2148  {}
2149 
2150  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
2151 
2152  // load functions, residual:
2153  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * bVec, double * storeLeadF, double * storeLeadQ, double * leadF, double * leadQ, double * junctionV);
2154 
2155  // load functions, Jacobian:
2156  virtual bool loadDAEMatrices (Linear::Matrix & dFdx, Linear::Matrix & dQdx);
2157 };
2158 
2159 void registerDevice();
2160 
2161 } // namespace MOSFET_B4
2162 } // namespace Device
2163 } // namespace Xyce
2164 
2165 #endif
2166 
Pure virtual class to augment a linear system.
const std::vector< std::vector< int > > & jacobianStamp() const
int RdseffGeo(double nf_arg, int geo, int rgeo, int minSD, double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int Type, double &Rtot)
std::vector< std::vector< int > > jacStamp
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
std::vector< Instance * > instanceContainer
int RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, int rgeo, int Type, double nuEnd, double &Rend)
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
Master(const Configuration &configuration, const FactoryBlock &factory_block, const SolverState &ss1, const DeviceOptions &do1)
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
DeviceMaster instantiates a device as described by the device traits T.
bool processParams()
processParams
virtual std::ostream & printOutInstances(std::ostream &os) const
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
std::list< SizeDependParam * > sizeDependParamList
std::vector< std::vector< int > > jacMap2
int RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, double DMDG, double nuEnd, int rgeo, int Type, double &Rend)
void addInstance(Instance *instance)
virtual bool loadDAEVectors(double *solVec, double *fVec, double *qVec, double *bVec, double *storeLeadF, double *storeLeadQ, double *leadF, double *leadQ, double *junctionV)
Populates the device's ExternData object with these pointers.
Model & operator=(const Model &)
static const char * deviceTypeName()
bool updateTemperature(const double &temp_tmp)
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
The Device class is an interface for device implementations.
Definition: N_DEV_Device.h:101
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
Instance & operator=(const Instance &)
Class Configuration contains device configuration data.
std::vector< Instance * > InstanceVector
Instance(const Configuration &configuration, const InstanceBlock &IB, Model &Miter, const FactoryBlock &factory_block)
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
int DioIjthVjmEval(double Nvtm, double Ijth, double Isb, double XExpBV, double &Vjm)
int NumFingerDiff(double nf_arg, int minSD, double &nuIntD, double &nuEndD, double &nuIntS, double &nuEndS)
static void loadModelParameters(ParametricData< Model > &model_parameters)
int polyDepletion(double phi, double ngate, double epsgate, double coxe, double Vgs_arg, double &Vgs_eff, double &dVgs_eff_dVg)
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
int PAeffGeo(double nf_arg, int geo, int minSD, double Weffcj, double DMCG, double DMCI, double DMDG, double &Ps, double &Pd, double &As, double &Ad)
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
ModelBlock represents a .MODEL line from the netlist.
The DeviceTraits template describes the configuration of a device.
Manages parameter binding for class C.
Definition: N_DEV_Pars.h:214
InstanceBlock represent a device instance line from the netlist.
static const char * name()
bool processInstanceParams()
processInstanceParams