Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_VDMOS.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_VDMOS.h,v $
27 //
28 // Purpose : Vertical, double-dffused power MOSFET
29 // This device model is based on the Uniform Charge Control
30 // Model of Fjeldly, et. al.
31 //
32 // Special Notes :
33 //
34 // Creator : Eric R. Keiter, SNL, Parallel Computational Sciences
35 //
36 // Creation Date : 02/28/00
37 //
38 // Revision Information:
39 // ---------------------
40 //
41 // Revision Number: $Revision: 1.75.2.1 $
42 //
43 // Revision Date : $Date: 2014/02/26 20:16:30 $
44 //
45 // Current Owner : $Author: tvrusso $
46 //-----------------------------------------------------------------------------
47 
48 #ifndef Xyce_N_DEV_VDMOS_h
49 #define Xyce_N_DEV_VDMOS_h
50 
51 // ---------- Xyce Includes ----------
52 #include <N_DEV_Configuration.h>
53 #include <N_DEV_DeviceMaster.h>
54 #include <N_DEV_DeviceInstance.h>
55 #include <N_DEV_DeviceModel.h>
56 #include <N_DEV_DeviceBlock.h>
57 
58 #include <N_DEV_MOSFET1.h>
59 
60 namespace Xyce {
61 namespace Device {
62 namespace VDMOS {
63 
64 // ---------- Forward Declarations -------
65 class Model;
66 class Instance;
67 
68 struct Traits : public DeviceTraits<Model, Instance, MOSFET1::Traits>
69 {
70  static const char *name() {return "Power MOSFET";}
71  static const char *deviceTypeName() {return "M level 18";}
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 // Class : Instance
83 // Purpose :
84 // Special Notes :
85 // Creator : pmc
86 // Creation Date : 1/16/2004
87 //-----------------------------------------------------------------------------
88 class Instance : public DeviceInstance
89 {
90  friend class ParametricData<Instance>;
91  friend class Model;
92  friend class Traits;friend class Master;
93 
94 public:
95 
96  Instance(
97  const Configuration & configuration,
98  const InstanceBlock & IB,
99  Model & Miter,
100  const FactoryBlock & factory_block);
101 
102  ~Instance();
103 
104 private:
105  Instance(const Instance &);
106  Instance &operator=(const Instance &);
107 
108 public:
109  void registerLIDs( const std::vector<int> & intLIDVecRef,
110  const std::vector<int> & extLIDVecRef );
111  void registerStateLIDs( const std::vector<int> & staLIDVecRef);
112  void registerStoreLIDs( const std::vector<int> & stoLIDVecRef);
113 
114  std::map<int,std::string> & getIntNameMap ();
115  std::map<int,std::string> & getStoreNameMap ();
116 
117  const std::vector< std::vector<int> > & jacobianStamp() const;
118  void registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec );
119 
120  // load functions, residual:
121  bool loadDAEQVector ();
122  bool loadDAEFVector ();
123 
124  // load functions, Jacobian:
125  bool loadDAEdQdx ();
126  bool loadDAEdFdx ();
127 
128  void setupPointers();
129 
130  bool updateIntermediateVars ();
131  bool updatePrimaryState ();
132  bool updateSecondaryState ();
133 
134  bool processParams ();
135  bool updateTemperature(const double & temp_tmp);
136 
137  bool UCCMqmeyer(double vgps, double vgpdd, double vgpb, double von_local,
138  double vddsat_local, double & capgs_local, double & capgdd_local,
139  double & capgb_local, double phi, double cox );
140 
141  bool UCCMMeyercap(double vgps, double vgpdd, double vgpb,
142  double & cgs, double & cgd, double & cgb);
143  bool UCCMCharges(double vgps, double vgpdd, double vgpb,
144  double & qD, double & qS, double & qB);
145  bool UCCMcvon(double vbs_local, double & von_local, double & dvonvbs_local);
146  bool UCCMmosa1(double vgps, double vdds, double dvonvbs,
147  double & cdraindrift_loc, double & vsate);
148  bool UCCMmosa2(double vgps, double vdds, double dvonvbs,
149  double & cdraindrift_loc, double & vsate);
150 
151  inline bool isConverged();
152 
153 public:
154  // iterator reference to the model which owns this instance.
155  // Getters and setters
157  {
158  return model_;
159  }
160 
161 private:
162 
163  Model & model_; //< Owning model
164 
165  int states; // index into state table for this device
166  int dNode; // number of the gate node of the mosfet
167  int gNode; // number of the gate node of the mosfet
168  int sNode; // number of the source node of the mosfet
169  int bNode; // number of the bulk node of the mosfet
170  int dNodePrime; // number of the internal drain node of the mosfet
171  int gNodePrime; // number of the internal gate node of the mosfet
172  int sNodePrime; // number of the internal source node of the mosfet
173  int dDriftNode; // number of the internal draindrift node of the mosfet
174 
175  double l; // the length of the channel region
176  double w; // the width of the channel region
177  double drainArea; // the area of the drain diffusion
178  double sourceArea; // the area of the source diffusion
179  double drainSquares; // the length of the drain in squares
180  double sourceSquares; // the length of the source in squares
183  double sourceCond; //conductance of source(or 0):set in setup
184  double gateCond; //conductance of gate(or 0):set in setup
185  double drainCond; //conductance of drain(or 0):set in setup
186  double draindriftCond; //conductance of draindrift channel
187  double numberParallel; // number simulated parallel mosfets
188  double vt; // CONSTKoverQ*temp: set in updateTemperature
189 
190  double temp; // operating temperature of this instance
191  double tSurfMob; // temperature corrected surface mobility
192  double tPhi; // temperature corrected Phi
193  double tVto; // temperature corrected Vto
194  double tSatCur; // temperature corrected saturation Cur.
195  double tSatCurDens; // temperature corrected sat. cur. density
196  double tCbd; // temperature corrected B-D Capacitance
197  double tCbs; // temperature corrected B-S Capacitance
198  double tCj; // temperature corrected Bulk bottom Cap
199  double tCjsw; // temperature corrected Bulk side Cap
200  double tBulkPot; // temperature corrected Bulk potential
201  double tDepCap; // temperature adjusted transition point in
202  // the cureve matching Fc * Vj
203  double tVbi; // temperature adjusted Vbi
204 
205  double von;
206  double vdsat;
207  double vddsat;
208  double sourceVcrit; // vcrit for pos. vds
209  double drainVcrit; // vcrit for neg. vds
210  double draindriftVcrit; // vcrit for neg. vdd
211  double cdd; // draindrift current
212  double cd; // drain current
213  double gmbs; // bulk-source transconductance
214  double gm; // transconductance
215  double gddd; // draindrift conductance
216  double dIdd_dVd; // draindrift derivative
217  double gds; // drain-source conductance
218  double gdds; // drain-source conductance
219  double gdsshunt; // drain-source shunt conductance
220  double gbs; // bulk-source conductance
221  double gbd; // bulk-drain conductance
222  double cbd;
223  double Cbd;
224  double Cbdsw;
225  double cbs;
226  double Cbs;
227  double Cbssw;
228  double f2d;
229  double f3d;
230  double f4d;
231  double f2s;
232  double f3s;
233  double f4s;
234  double n0;
235  double vp;
236  double gammas;
237  double gammal;
238  double gchi0;
239  double vtoo;
240  double vthLimit;
241 
242  int mode; // device mode : 1 = normal, -1 = inverse
243  double mode_low;
244  double mode_high;
245  bool off ; // non-zero to indicate device is off for
246  // dc analysis
249 
250  bool limitedFlag; // for convergence testing
251 
252 
253  ////////////////////////////////////////////////////////////////////
254  // these are intermediate variables added to the instance class instead
255  // of leaving them to be calculated repeatedly in the load function
256 
257  // some caluclated quantities
259  double DrainSatCur;
260  double SourceSatCur;
264  double OxideCap;
265 
266  // Solution variables and intermediate quantities
267  // drain,source,gate, bulk, drainprime and sourceprime voltages
268  double Vd;
269  double Vs;
270  double Vg;
271  double Vb;
272  double Vdp;
273  double Vgp;
274  double Vsp;
275  double Vdd;
276  double Vd1p;
277  // voltage drops between pairs of nodes
278  double Vddp; // drain-drain'
279  double Vddd; // drain-draindrift
280  double Vdddp; // draindrift-drain'
281  double Vssp; // source-source'
282  double Vbsp; // bulk-source'
283  double Vbdp; // bulk-drain'
284  double Vggp; // gate-gate'
285  double Vgpsp; // gate'-source'
286  double Vgpdp; // gate'-drain'
287  double Vgpb; // gate'-bulk
288  double Vdpsp; // drop across channel
289  double Vbdd; // bulk-draindrift
290  double D1vd; // D1prime-drain voltage drop
291 
292  // the gate-drain voltage drop isn't actually a state variable, but it
293  // is calculated at the same time and in the same manner as the state
294  // vars. So here we go, sticking it in the instance class.
295  double vgpd;
296 
297  // the variables capgs, capgd and capgb are the raw output of
298  // qmeyer. They get massaged into total capacitances in
299  // updateIntermediateVars, and get used in updatePrimaryState to get
300  // charges on the capacitors.
301 
302  double Capgs; // total gate-source capacitance
303  double Capgdd; // total gate-drain capacitance
304  double Capgb; // total gate-bulk capacitance
305 
306  // current through source and drain resistors
307  double Isource;
308  double Igate;
309  double Idrain;
310  double Idraindrift;
311  double Irdsshunt;
312  double Ird1rs;
313 
314  // ISUBMOD calculation
315  double mm1;
316  double dmm1vgs;
317  double dmm1vds;
318  double dmm1vbs;
319  double ISUB;
320  double GMSUB;
321  double GDDSSUB;
322  double GBSSUB;
323 
324  double cdrain; // the channel current
325  double cdraindrift; // the draindrift current
326 
327  // these are calculated in loadRHS and used in the jacobian load
328  double Gm,Gmbs; // we do this so we don't really need the xnrm/xrev vars
329  double revsum; // described in comments at the end of
330  double nrmsum; // updateIntermediateVars (uIVB in remaining comments)
331  double cdreq;
332 
333  // variables related to diode 1, which connects the source to the drain
334  int D1DIOoff1; // 'off' flag for diode
335  double D1DIOarea; // area factor for the diode
336  double D1DIOinitCond; // initial condition
337  double D1DIOtemp; // temperature of the instance
338  double D1DIOtJctPot; // temperature adjusted junction potential
339  double D1DIOtJctCap; // temperature adjusted junction capacitance
340  double D1DIOtDepCap; // temperature adjusted transition point in
341  // the curve matching (Fc * Vj )
342  double D1DIOtSatCur; // temperature adjusted saturation current
344  double D1DIOtVcrit; // temperature adjusted V crit
345  double D1DIOtF1; // temperature adjusted f1
347  double D1gspr; // area-scaled conductance
348  double D1gd;
349  double D1cdeq;
350  double D1vt; // K t / Q
351  double D1vte;
352 
353  // end of intermediate variables that aren't state variables
354  ////////////////////////////
355  int li_Drain;
359  int li_Gate;
361  int li_Bulk;
364 
365  // The VDMOS has a 9x9 matrix block; 35 entries are nonzero:
366  // --------------------------------------------------------------------------+
367  // | #NZ | | |
368  // | entries | | V_d V_g V_s V_b V_d' V_g' V_s' V_dd V_d1'|
369  // --------------------------------------------------------------------------+
370  // | 4 | KCL_d | aa -gs -ab A |
371  // | 2 | KCL_g | a -a |
372  // | 4 | KCL_s | -gs g h B |
373  // | 4 | KCL_b | j k i l |
374  // | 5 | KCL_d'| o p n q b |
375  // | 5 | KCL_g'| -a d e c f |
376  // | 5 | KCL_s'| s t u r v |
377  // | 3 | KCL_dd| -ab b w |
378  // | 3 |KCL_D1'| C D E |
379  // --------------------------------------------------------------------------+
380  // 35 total
381  ////////////////////////////////////////////////////////////////////
382  // Offset variables corresponding to the above declared indices.
383 
384  // Jacobian Matrix Offset:
385 
386  // V_d Row:
391 
392  // V_g Row:
395 
396  // V_s Row:
401 
402  // V_b Row:
407 
408  // V_d' Row:
414 
415  // V_g' Row:
421 
422  // V_s' Row:
428 
429  // V_dd Row:
433 
434 
435  // V_d1' row:
439 
440 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
441  ////////////////////////////////////////////////////////////////////
442 
443  // F-matrix pointers:
448 
451 
456 
461 
467 
473 
479 
483 
487 
488  // Q-matrix pointers:
493 
496 
501 
506 
512 
518 
524 
528 
532 #endif
533 
534  ////////////////////////////////////////////////////////////////////
535  // 3f5 State Variables & related quantities:
536  // voltage drops
537  double vbdd;
538  double vbs;
539  double vgpdd;
540  double vgps;
541  double vdds;
542 
543  // "original" versions of various voltage drop variables:
544  double vbdd_orig;
545  double vbs_orig;
546  double vgpdd_orig;
547  double vgps_orig;
548  double vdds_orig;
549  double D1vd_orig;
550 
551  // "old" versions of various voltage drop variables:
552  double vbdd_old;
553  double vbs_old;
554  double vgpdd_old;
555  double vgps_old;
556  double vdds_old;
557  double D1vd_old;
558 
560 
561  // meyer capacitances
562  //gate-source capacitor
563  double capgs; //value
564  double qgs; // charge
565  double cqgs; // current
566  // gate-drain capacitor
567  double capgdd; //value
568  double qgdd; //charge
569  double cqgdd; // current
570  //gate-bulk capacitor
571  double capgb; //value
572  double qgb; //charge
573  double cqgb; //current
574 
575  // diode capacitances
576  double capbd;
577  double qbd; // bulk-drain capacitor charge
578  double cqbd; // bulk-drain capacitor current
579 
580  double capbs;
581  double qbs; // bulk-source capacitor charge
582  double cqbs; // bulk-source capacitor current
583 
584  // diode #1
587  double D1capd;
588 
589  // indices into the state vector.
595 
599 
603 
606 
607  //int li_state_cqgs;
608  //int li_state_cqgdd;
609  //int li_state_cqgb;
610 
611  //int li_state_cqbd;
612  //int li_state_cqbs;
613 
615  //int li_state_D1DIOcapCurrent;
616 
618 
619  // store vector space for lead currents
624 
625  static std::vector< std::vector<int> > jacStamp_DC_SC_GC;
626  static std::vector< std::vector<int> > jacStamp_DC_GC;
627  static std::vector< std::vector<int> > jacStamp_SC_GC;
628  static std::vector< std::vector<int> > jacStamp_DC_SC;
629  static std::vector< std::vector<int> > jacStamp_GC;
630  static std::vector< std::vector<int> > jacStamp_SC;
631  static std::vector< std::vector<int> > jacStamp_DC;
632  static std::vector< std::vector<int> > jacStamp;
633 
634  static std::vector<int> jacMap_DC_SC_GC;
635  static std::vector<int> jacMap_DC_GC;
636  static std::vector<int> jacMap_SC_GC;
637  static std::vector<int> jacMap_DC_SC;
638  static std::vector<int> jacMap_GC;
639  static std::vector<int> jacMap_SC;
640  static std::vector<int> jacMap_DC;
641  static std::vector<int> jacMap;
642 
643  static std::vector< std::vector<int> > jacMap2_DC_SC_GC;
644  static std::vector< std::vector<int> > jacMap2_DC_GC;
645  static std::vector< std::vector<int> > jacMap2_SC_GC;
646  static std::vector< std::vector<int> > jacMap2_DC_SC;
647  static std::vector< std::vector<int> > jacMap2_GC;
648  static std::vector< std::vector<int> > jacMap2_SC;
649  static std::vector< std::vector<int> > jacMap2_DC;
650  static std::vector< std::vector<int> > jacMap2;
651 
652  // duplicating all of the above, but with the RD1RS resistor nonzero
653  static std::vector< std::vector<int> > jacStamp_D1C_DC_SC_GC;
654  static std::vector< std::vector<int> > jacStamp_D1C_DC_GC;
655  static std::vector< std::vector<int> > jacStamp_D1C_SC_GC;
656  static std::vector< std::vector<int> > jacStamp_D1C_DC_SC;
657  static std::vector< std::vector<int> > jacStamp_D1C_GC;
658  static std::vector< std::vector<int> > jacStamp_D1C_SC;
659  static std::vector< std::vector<int> > jacStamp_D1C_DC;
660  static std::vector< std::vector<int> > jacStamp_D1C;
661 
662  static std::vector<int> jacMap_D1C_DC_SC_GC;
663  static std::vector<int> jacMap_D1C_DC_GC;
664  static std::vector<int> jacMap_D1C_SC_GC;
665  static std::vector<int> jacMap_D1C_DC_SC;
666  static std::vector<int> jacMap_D1C_GC;
667  static std::vector<int> jacMap_D1C_SC;
668  static std::vector<int> jacMap_D1C_DC;
669  static std::vector<int> jacMap_D1C;
670 
671  static std::vector< std::vector<int> > jacMap2_D1C_DC_SC_GC;
672  static std::vector< std::vector<int> > jacMap2_D1C_DC_GC;
673  static std::vector< std::vector<int> > jacMap2_D1C_SC_GC;
674  static std::vector< std::vector<int> > jacMap2_D1C_DC_SC;
675  static std::vector< std::vector<int> > jacMap2_D1C_GC;
676  static std::vector< std::vector<int> > jacMap2_D1C_SC;
677  static std::vector< std::vector<int> > jacMap2_D1C_DC;
678  static std::vector< std::vector<int> > jacMap2_D1C;
679 };
680 
681 //--------------------Class Model-----------------------------------
682 
683 //-----------------------------------------------------------------------------
684 // Class : Model
685 // Purpose :
686 // Special Notes :
687 // Creator : pmc
688 // Creation Date : 1/16/2004
689 //-----------------------------------------------------------------------------
690 class Model : public DeviceModel
691 {
692  typedef std::vector<Instance *> InstanceVector;
693 
694  friend class ParametricData<Model>;
695  friend class Instance;
696  friend class Traits;friend class Master;
697 
698 public:
699  Model(
700  const Configuration & configuration,
701  const ModelBlock & MB,
702  const FactoryBlock & factory_block);
703  ~Model();
704 
705 private:
706  Model();
707  Model(const Model &);
708  Model &operator=(const Model &);
709 
710 public:
711  virtual void forEachInstance(DeviceInstanceOp &op) const /* override */;
712 
713  virtual std::ostream &printOutInstances(std::ostream &os) const;
714  bool processParams ();
715  bool processInstanceParams ();
716 
717 
718 public:
719  void addInstance(Instance *instance)
720  {
721  instanceContainer.push_back(instance);
722  }
723 
725  {
726  return instanceContainer;
727  }
728 
730  {
731  return instanceContainer;
732  }
733 
734 private:
735  std::vector<Instance*> instanceContainer;
736 
737 private:
738 
739  int dtype; // device type : 1 = nmos, -1 = pmos
740  int gateType;
741 
742  double l0; // the length of the channel region
743  double w0; // the width of the channel region
744  double tnom; // temperature at which parameters measured
745  double latDiff;
746  double jctSatCurDensity; // input - use tSatCurDens
747  double jctSatCur; // input - use tSatCur instead
756  double vt0; // input - use tVto
757  double capBD; // input - use tCbs
758  double capBS; // input - use tCbd
759  double timeScale;
760  double bulkCapFactor; // input - use tCj
761  double sideWallCapFactor; // input - use tCjsw
762  double bulkJctPotential; // input - use tBulkPot
766  double phi; // input - use tPhi
767  double gamma;
768  double lambda;
772  double surfaceMobility; // input - use tSurfMob
774 
779  bool vpGiven;
780 
781  // extra parameters needed for VDMOS
782  double maxDriftVel; // max carrier drift vel.
783  double junctionDepth; // xj
784  double rdi; // intrinsic ohmic res. per unit width
785  double rsi; // intrinsic ohmic res. per unit width
786 
787  double delta;
788  double eta; // subthreshold ideality factor
789  double m;
790  double mc;
791  double sigma0; // threshold voltage coeff.
792  double vsigmat; // DIBL ouble rsub;
793  double vsigma; // DIBL parameter
794  double theta;
795  double gammas0;
796  double gammal0;
797  double lgammas;
798  double wgammas;
799  double lgammal_;
800  double wgammal;
801  double kacc;
802  double gb;
803  double knit;
804  double nitd;
805  double nits;
806  double mm;
807  double k;
808  double deltaSqr;
809  double kvt;
810  double mdtemp;
811  double kvs;
812  double tvs;
813  double mth;
814  double artd;
815  double brtd;
816  double crtd;
817  double drtd;
818  double nrtd;
819  double n2;
820 
821  // WARD-LIKE MODEL PARAMETERS
822  double xqc; // CV_mod_2 partitioning
823  double mcv; // CV_mod_2 fit parameter
824  double vfb; // Flatband voltage
825  int fpe; // select partitioning
826  double alpha;
827  // END WARD-LIKE MODEL PARAMETERS
828  int cv; // 1= Meyer, 2= Meyer-like capacitances
829  int cve; // 1= Meyer, 2= Ward capacitances
830  double ls;
831  double rsub;
832  double vp;
833  double ai;
834  double bi;
835  double delmax;
836  double md;
837  int isubmod;
838 
839  double kaccd;
840  double kaccs;
841  double invm;
842  double invmc;
843  double invmd;
844 
845  double fact1;
846  double vtnom;
847  double egfet1;
848  double pbfact1;
849 
850  // drift region parameters
851  double driftParamA;
852  double driftParamB;
853  double rdsshunt;
854 
855  // variables related to diode 1 connecting source to drain
856  double D1DIOsatCur; // saturation current
857  double D1DIOresist; // ohmic series resistance
858  double D1DIOconductance; // conductance corresponding to ohmic R
859  double D1DIOemissionCoeff; // emission coefficient (N)
860  double D1DIOtransitTime; // transit time (TT)
861  double D1DIOjunctionCap; // Junction Capacitance (Cj0)
862  double D1DIOjunctionPot; // Junction Potecomp
863  double D1DIOgradingCoeff; // grading coefficient (m)
864  double D1DIOactivationEnergy; // activation energy (EG)
865  double D1DIOsaturationCurrentExp; // Saturation current exponential (XTI)
866  double D1DIOdepletionCapCoeff; // Depletion Cap fraction coeff (FC)
867  double D1DIObreakdownVoltage; // Voltage at reverse breakdown
868  double D1DIObreakdownCurrent; // Current at above voltage
869  double D1DIOf2; // coeff for capacitance equation precomp
870  double D1DIOf3; // coeff for capacitance equation precomp
871  double D1DIOnomTemp; // nominal temperature
872  double D1DIOfNcoef;
873  double D1DIOfNexp;
874  double D1DIOikf;
875  double D1DIOisr;
876  double D1DIOnr;
878 };
879 
880 //-----------------------------------------------------------------------------
881 // Function : Instance:isConverged ()
882 // Purpose : Return whether a BSIM3 device has done something that should
883 // be interpreted as invalidating other convergence tests
884 // In case of bsim3, just do it if the limiter function
885 // pnjlim. This actually agrees with how the Check flag
886 // is used in Spice3F5 b3ld.c
887 // Special Notes :
888 // Scope : public
889 // Creator : Tom Russo, SNL, Component Information and Models
890 // Creation Date : 03/22/05
891 //-----------------------------------------------------------------------------
893 {
894  return (!limitedFlag);
895 }
896 //-----------------------------------------------------------------------------
897 // Class : Master
898 // Purpose :
899 // Special Notes :
900 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
901 // Creation Date : 11/26/08
902 //-----------------------------------------------------------------------------
903 class Master : public DeviceMaster<Traits>
904 {
905  friend class Instance;
906  friend class Model;
907 
908 public:
910  const Configuration & configuration,
911  const FactoryBlock & factory_block,
912  const SolverState & ss1,
913  const DeviceOptions & do1)
914  : DeviceMaster<Traits>(configuration, factory_block, ss1, do1)
915  {}
916 
917  virtual bool updateState (double * solVec, double * staVec, double * stoVec);
918  virtual bool updateSecondaryState (double * staDeriv, double * stoVec);
919 
920  // load functions:
921  virtual bool loadDAEVectors (double * solVec, double * fVec, double * qVec, double * storeLeadF, double * storeLeadQ);
922  virtual bool loadDAEMatrices (N_LAS_Matrix & dFdx, N_LAS_Matrix & dQdx);
923 };
924 
925 void registerDevice();
926 
927 } // namespace VDMOS
928 } // namespace Device
929 } // namespace Xyce
930 
934 
935 #endif