46 #include <Xyce_config.h>
50 #include <N_UTL_Math.h>
60 #include <N_ERH_ErrorMgr.h>
62 #include <N_LAS_Matrix.h>
63 #include <N_LAS_Vector.h>
64 #include <N_UTL_FeatureTest.h>
74 .setDescription(
"Device temperature");
79 .setDescription(
"device area");
87 .setDescription(
"Flicker noise exponent");
92 .setDescription(
"Doping tail parameter");
97 .setDescription(
"Transconductance parameter");
102 .setDescription(
"Saturation voltage parameter");
108 .setDescription(
"Zero-bias gate-source junction capacitance");
114 .setDescription(
"Zero-bias gate-drain junction capacitance");
119 .setDescription(
"Coefficient for forward-bias depletion capacitance");
124 .setDescription(
"Gate junction saturation current");
129 .setDescription(
"Flicker noise coefficient");
134 .setDescription(
"Channel length modulation");
139 .setDescription(
"Gate junction potential");
145 .setDescription(
"Drain ohmic resistance");
151 .setDescription(
"Source ohmic resistance");
156 .setDescription(
"Parameter measurement temperature");
161 .setDescription(
"Threshold voltage");
194 :
DeviceModel(MB, configuration.getModelParameters(), factory_block),
256 std::vector<Instance*>::iterator iter;
260 for (iter=first; iter!=last; ++iter)
278 std::vector<Instance*>::const_iterator iter;
285 os <<
"Number of MESFET Instances: " << isize << std::endl;
286 os <<
" name model name Parameters" << std::endl;
288 for (i=0, iter=first; iter!=last; ++iter, ++i)
290 os <<
" " << i <<
": " << (*iter)->getName() <<
"\t";
316 for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
346 std::vector<Instance*>::iterator iter;
350 for (iter=first; iter!=last; ++iter)
352 (*iter)->processParams();
372 :
DeviceInstance(instance_block, configuration.getInstanceParameters(), factory_block),
380 temp(getDeviceOptions().temp.getImmutableValue<double>()),
423 ADrainEquDrainNodeOffset(-1),
424 ADrainEquDrainPrimeNodeOffset(-1),
426 AGateEquGateNodeOffset(-1),
427 AGateEquDrainPrimeNodeOffset(-1),
428 AGateEquSourcePrimeNodeOffset(-1),
430 ASourceEquSourceNodeOffset(-1),
431 ASourceEquSourcePrimeNodeOffset(-1),
433 ADrainPrimeEquDrainNodeOffset(-1),
434 ADrainPrimeEquGateNodeOffset(-1),
435 ADrainPrimeEquDrainPrimeNodeOffset(-1),
436 ADrainPrimeEquSourcePrimeNodeOffset(-1),
438 ASourcePrimeEquGateNodeOffset(-1),
439 ASourcePrimeEquSourceNodeOffset(-1),
440 ASourcePrimeEquDrainPrimeNodeOffset(-1),
441 ASourcePrimeEquSourcePrimeNodeOffset(-1),
446 f_DrainEquDrainNodePtr(0),
447 f_DrainEquDrainPrimeNodePtr(0),
449 f_GateEquGateNodePtr(0),
450 f_GateEquDrainPrimeNodePtr(0),
451 f_GateEquSourcePrimeNodePtr(0),
453 f_SourceEquSourceNodePtr(0),
454 f_SourceEquSourcePrimeNodePtr(0),
456 f_DrainPrimeEquDrainNodePtr(0),
457 f_DrainPrimeEquGateNodePtr(0),
458 f_DrainPrimeEquDrainPrimeNodePtr(0),
459 f_DrainPrimeEquSourcePrimeNodePtr(0),
461 f_SourcePrimeEquGateNodePtr(0),
462 f_SourcePrimeEquSourceNodePtr(0),
463 f_SourcePrimeEquDrainPrimeNodePtr(0),
464 f_SourcePrimeEquSourcePrimeNodePtr(0),
468 q_DrainEquDrainNodePtr(0),
469 q_DrainEquDrainPrimeNodePtr(0),
471 q_GateEquGateNodePtr(0),
472 q_GateEquDrainPrimeNodePtr(0),
473 q_GateEquSourcePrimeNodePtr(0),
475 q_SourceEquSourceNodePtr(0),
476 q_SourceEquSourcePrimeNodePtr(0),
478 q_DrainPrimeEquDrainNodePtr(0),
479 q_DrainPrimeEquGateNodePtr(0),
480 q_DrainPrimeEquDrainPrimeNodePtr(0),
481 q_DrainPrimeEquSourcePrimeNodePtr(0),
483 q_SourcePrimeEquGateNodePtr(0),
484 q_SourcePrimeEquSourceNodePtr(0),
485 q_SourcePrimeEquDrainPrimeNodePtr(0),
486 q_SourcePrimeEquSourcePrimeNodePtr(0),
602 const std::vector<int> & extLIDVecRef )
609 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
611 Xyce::dout() << std::endl << section_divider << std::endl;
612 Xyce::dout() <<
" Instance::registerLIDs" << std::endl;
613 Xyce::dout() <<
" name = " <<
getName() << std::endl;
614 Xyce::dout() <<
" number of internal variables: " <<
numIntVars << std::endl;
615 Xyce::dout() <<
" number of external variables: " <<
numExtVars << std::endl;
642 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
644 Xyce::dout() <<
"\n variable local indices:\n";
645 Xyce::dout() <<
" li_Drain = " <<
li_Drain << std::endl;
646 Xyce::dout() <<
" li_DrainPrime = " <<
li_DrainPrime << std::endl;
647 Xyce::dout() <<
" li_Source = " <<
li_Source << std::endl;
648 Xyce::dout() <<
" li_SourcePrime = " <<
li_SourcePrime << std::endl;
649 Xyce::dout() <<
" li_Gate = " <<
li_Gate << std::endl;
651 Xyce::dout() << section_divider << std::endl;
691 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
693 Xyce::dout() << std::endl;
694 Xyce::dout() << section_divider << std::endl;
695 Xyce::dout() <<
" In Instance::registerStateLIDs\n\n";
696 Xyce::dout() <<
" name = " <<
getName() << std::endl;
697 Xyce::dout() <<
" Number of State LIDs: " <<
numStateVars << std::endl;
710 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
712 Xyce::dout() <<
" State local indices:" << std::endl;
713 Xyce::dout() << std::endl;
715 Xyce::dout() <<
" li_state_qgs = " <<
li_state_qgs << std::endl;
718 Xyce::dout() <<
" li_state_gcgd = " <<
li_state_gcgd << std::endl;;
720 Xyce::dout() << section_divider << std::endl;
784 std::vector<int> map;
785 std::vector< std::vector<int> > map2;
845 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
937 double czgdf2, czgsf2;
945 double prod, denom, invdenom, afact, lfact;
947 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
949 Xyce::dout() << subsection_divider << std::endl;
950 Xyce::dout() <<
" Instance::updateIntermediateVars.\n"<<std::endl;
951 Xyce::dout() <<
" name = " <<
getName() << std::endl;
952 Xyce::dout() <<
" Model name = " <<
model_.
getName() << std::endl;
953 Xyce::dout() <<
" dtype is " <<
model_.
dtype << std::endl;
954 Xyce::dout() << std::endl;
955 Xyce::dout().width(25); Xyce::dout().precision(17); Xyce::dout().setf(std::ios::scientific);
974 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
976 Xyce::dout() <<
" " << std::endl;
977 Xyce::dout() <<
" Vg = " <<
Vg << std::endl;
978 Xyce::dout() <<
" Vd = " <<
Vd << std::endl;
979 Xyce::dout() <<
" Vs = " <<
Vs << std::endl;
980 Xyce::dout() <<
" Vdp = " <<
Vdp << std::endl;
981 Xyce::dout() <<
" Vsp = " <<
Vsp << std::endl;
1009 if ((*flagSolVectorPtr)[
li_Drain] == 0 || (*flagSolVectorPtr)[
li_Gate] == 0 ||
1049 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1051 Xyce::dout() <<
" before limiting: " << std::endl;
1052 Xyce::dout() <<
" vgs = " <<
vgs <<
" vgs_old = " <<
vgs_old << std::endl;
1053 Xyce::dout() <<
" vgd = " << vgd <<
" vgd_old = " <<
vgd_old << std::endl;
1060 if (ichk1 == 1) {icheck=1;}
1067 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1069 Xyce::dout() <<
" After limiting: " << std::endl;
1070 Xyce::dout() <<
" vgs = " <<
vgs << std::endl;
1071 Xyce::dout() <<
" vgd = " << vgd << std::endl;
1072 Xyce::dout() <<
" " << std::endl;
1076 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1078 Xyce::dout() <<
"vgs = " <<
vgs << std::endl;
1079 Xyce::dout() <<
"vgd = " << vgd << std::endl;
1080 Xyce::dout() <<
"vds = " <<
vds << std::endl;
1081 Xyce::dout() <<
"Vddp = " <<
Vddp << std::endl;
1082 Xyce::dout() <<
"Vssp = " <<
Vssp << std::endl;
1083 Xyce::dout() <<
"Vgsp = " << Vgsp << std::endl;
1084 Xyce::dout() <<
"Vgdp = " << Vgdp << std::endl;
1085 Xyce::dout() <<
"Vdpsp = " <<
Vdpsp << std::endl;
1086 Xyce::dout() <<
" " << std::endl;
1091 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1095 Xyce::dout() <<
" Something modified the voltages. " << std::endl;
1096 Xyce::dout() <<
" Voltage before after diff " << std::endl;
1098 Xyce::dout() <<
" vgd " <<
vgd_orig <<
" " << vgd <<
" " << vgd-
vgd_orig << std::endl;
1100 Xyce::dout() <<
" " << std::endl;
1159 denom = 1 +
tMESb*vgst;
1161 if (vds >= ( 3/
tAlpha ) )
1166 cdrain = betap*vgst*vgst*invdenom;
1167 gm = betap*vgst*(1 + denom)*invdenom*invdenom;
1175 afact = 1 -
tAlpha*vds/3;
1176 lfact = 1 - afact*afact*afact;
1177 cdrain = betap*vgst*vgst*invdenom*lfact;
1178 gm = betap*vgst*(1 + denom)*invdenom*invdenom*lfact;
1202 denom = 1 +
tMESb*vgdt;
1206 cdrain = -betap*vgdt*vgdt*invdenom;
1207 gm = -betap*vgdt*(1 + denom)*invdenom*invdenom;
1215 afact = 1 +
tAlpha*vds/3;
1216 lfact = 1 - afact*afact*afact;
1217 cdrain = -betap*vgdt*vgdt*invdenom*lfact;
1218 gm = -betap*vgdt*(1 + denom)*invdenom*invdenom*lfact;
1236 if (
vgs < corDepCap)
1239 qgs = twop*czgs*(1-sarg);
1245 +(
vgs*
vgs - fcpb2)/(2*twop));
1258 if (vgd < corDepCap)
1260 sarg=sqrt(1-vgd/
tPB);
1261 qgd = twop*czgd*(1-sarg);
1267 +(vgd*vgd - fcpb2)/(2*twop) );
1282 Xyce::dout() <<
" Done with Instance::updateIntermediateVars." << std::endl;
1283 Xyce::dout() <<
" mode = " <<
mode << std::endl;
1284 Xyce::dout() <<
" tBeta = " <<
tBeta << std::endl;
1285 Xyce::dout() <<
" Idrain = " <<
Idrain << std::endl;
1286 Xyce::dout() <<
" Isource = " <<
Isource << std::endl;
1287 Xyce::dout() <<
" gds = " <<
gds << std::endl;
1288 Xyce::dout() <<
" gm = " <<
gm << std::endl;
1359 double ceqgd = Dtype*(
qgd);
1361 double cdreq = Dtype*(((-
qgd)+
qgd));
1365 double cdreq_Jdxp = 0.0;
1367 qVec[
li_Gate ] += ( ceqgs+ceqgd);
1373 dQdxdVp[
li_Gate ] -= ( ceqgs_Jdxp+ceqgd_Jdxp);
1400 double ceqgd = Dtype*(
cgd);
1401 double ceqgs = Dtype*((
cg-
cgd));
1402 double cdreq = Dtype*((
cd+
cgd));
1418 fVec[
li_Gate ] += (ceqgs+ceqgd);
1424 dFdxdVp[
li_Gate ] -= ( ceqgs_Jdxp+ceqgd_Jdxp);
1513 bool bsuccess =
true;
1517 double fact1, fact2;
1520 double egfet, egfet1;
1522 double cjfact, cjfact1;
1523 double gmanew, gmaold;
1528 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1531 Xyce::dout() <<
" Instance::Begin of updateTemperature. \n";
1532 Xyce::dout() <<
" name = " <<
getName() << std::endl;
1533 Xyce::dout() << std::endl;
1537 if (temp_tmp != -999.0)
temp = temp_tmp;
1557 egfet1 = 1.16 - (7.02e-4*tnom*tnom)/(tnom + 1108);
1559 pbfact = -2.0*vtnom*(1.5*log(fact1) +
CONSTQ*arg1);
1560 pbo = (Pb - pbfact)/fact1;
1561 gmaold = (Pb - pbo)/pbo;
1562 cjfact = 1.0/(1.0 + 0.5*(4e-4*(tnom -
CONSTREFTEMP) - gmaold));
1565 Xyce::dout() <<
"Depletion cap. coeff. FC too large, limited to .95";
1566 Xyce::dout() << std::endl;
1579 ratio1 = ratio - 1.0;
1585 arg = -egfet/(2.0*kt) + 1.1150877/(CONSTboltz*2.0*CONSTREFTEMP);
1586 pbfact = -2.0*
vt*(1.5*log(fact2) +
CONSTQ*arg);
1587 tPB = fact2*pbo + pbfact;
1588 gmanew = (tPB - pbo)/pbo;
1594 f1 = tPB*(1.0 - exp((0.5)*xfc))/(0.5);
1607 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS) &&
getSolverState().debugTimeFlag)
1609 Xyce::dout() <<
"temp = "<<
temp << std::endl;
1610 Xyce::dout() <<
"tnom = " << tnom << std::endl;
1611 Xyce::dout() <<
"ratio = " << ratio << std::endl;
1612 Xyce::dout() <<
"vt = " <<
vt << std::endl;
1613 Xyce::dout() <<
"kt = " << kt << std::endl;
1614 Xyce::dout() <<
"fact2 = " << fact2 << std::endl;
1615 Xyce::dout() <<
"egfet = " << egfet << std::endl;
1616 Xyce::dout() <<
"arg = " << arg << std::endl;
1617 Xyce::dout() <<
"pbfact = " << pbfact << std::endl;
1618 Xyce::dout() <<
"PB = " << Pb << std::endl;
1619 Xyce::dout() <<
"pbo = " << pbo << std::endl;
1620 Xyce::dout() <<
"f2 = " <<
f2 << std::endl;
1621 Xyce::dout() <<
"f3 = " <<
f3 << std::endl;
1622 Xyce::dout() <<
"corDepCap= " <<
corDepCap << std::endl;
1623 Xyce::dout() <<
"tBeta = " <<
tBeta << std::endl;
1624 Xyce::dout() <<
"tvt0 = " <<
tvt0 << std::endl;
1625 Xyce::dout() <<
"tPB = " << tPB << std::endl;
1626 Xyce::dout() <<
"tMESb = " <<
tMESb << std::endl;
1627 Xyce::dout() <<
"tLambda = " <<
tLambda << std::endl;
1629 Xyce::dout() <<
"tRD = " <<
tRD << std::endl;
1630 Xyce::dout() <<
"tRS = " <<
tRS << std::endl;
1631 Xyce::dout() <<
" " << std::endl;
1672 bool bsuccess =
true;
1679 bsuccess = bsuccess && btmp;
1699 bool Master::loadDAEVectors (
double * solVec,
double * fVec,
double *qVec,
double * bVec,
double * storeLeadF,
double * storeLeadQ,
double * leadF,
double * leadQ,
double * junctionV)
1710 double f_ceqgd = Dtype*(ji.
cgd);
1711 double f_ceqgs = Dtype*((ji.
cg-ji.
cgd));
1712 double f_cdreq = Dtype*((ji.
cd+ji.
cgd));
1727 fVec[ji.
li_Gate ] += (f_ceqgs+f_ceqgd);
1733 dFdxdVp[ji.
li_Gate ] -= ( f_ceqgs_Jdxp+f_ceqgd_Jdxp);
1742 double q_ceqgd = Dtype*(ji.
qgd);
1743 double q_ceqgs = Dtype*(((ji.
qgs+ji.
qgd)-ji.
qgd));
1744 double q_cdreq = Dtype*(((-ji.
qgd)+ji.
qgd));
1748 double q_cdreq_Jdxp = 0.0;
1750 qVec[ji.
li_Gate ] += ( q_ceqgs+q_ceqgd);
1756 dQdxdVp[ji.
li_Gate ] -= ( q_ceqgs_Jdxp+q_ceqgd_Jdxp);
1790 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
1872 int sizeInstances = instanceContainer_.size();
1873 for (
int i=0; i<sizeInstances; ++i)
1875 Instance & ji = *(instanceContainer_.at(i));
1945 .registerDevice(
"z", 1)
1946 .registerModelType(
"nmf", 1)
1947 .registerModelType(
"pmf", 1);
const InstanceName & getName() const
int ADrainPrimeEquDrainNodeOffset
double * f_SourcePrimeEquGateNodePtr
static std::vector< std::vector< int > > jacMap2_DC_SC
static void initThermalModel(ParametricData< T > ¶metric_data)
Add the parameter "TEMPMODEL" to the parametric_data.
double * currStoVectorRawPtr
bool updateDependentParameters()
static std::vector< std::vector< int > > jacStamp_SC
double * f_SourceEquSourcePrimeNodePtr
static std::vector< std::vector< int > > jacStamp_DC
std::vector< Instance * > instanceContainer
const DeviceOptions & deviceOptions_
double * q_SourcePrimeEquSourceNodePtr
Descriptor & addPar(const char *parName, T default_value, T U::*varPtr)
Adds the parameter description to the parameter map.
double * daeQVectorRawPtr
double * q_DrainEquDrainPrimeNodePtr
int AGateEquGateNodeOffset
double * dFdxdVpVectorRawPtr
double * f_DrainEquDrainPrimeNodePtr
double pnjlim(double vnew, double vold, double vt, double vcrit, int *icheck)
int ASourceEquSourceNodeOffset
std::vector< int > devConMap
bool given(const std::string ¶meter_name) const
Pure virtual class to augment a linear system.
Parameter may be specified as time dependent expression from netlist.
void addInternalNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
virtual bool loadDAEMatrices(Linear::Matrix &dFdx, Linear::Matrix &dQdx)
Populates the device's Jacobian object with these pointers.
double * currStaVectorRawPtr
double * f_SourceEquSourceNodePtr
double * f_GateEquGateNodePtr
double * f_GateEquDrainPrimeNodePtr
double * f_DrainPrimeEquDrainNodePtr
void setNumStoreVars(int num_store_vars)
int ASourcePrimeEquSourceNodeOffset
double * q_GateEquGateNodePtr
InstanceVector::const_iterator getInstanceEnd() const
Returns an iterator to the ending of the vector of all instances created for this device...
void loadNodeSymbols(Util::SymbolTable &symbol_table) const
Populates and returns the store name map.
int ADrainPrimeEquDrainPrimeNodeOffset
static Device * factory(const Configuration &configuration, const FactoryBlock &factory_block)
Parameter is subject to being set to minimum junction capacitance.
double * q_SourcePrimeEquGateNodePtr
double * f_DrainEquDrainNodePtr
virtual void registerJacLIDs(const JacobianStamp &jacLIDVec)
Parameter is subject to being set to minimum lead resistance.
bool updateTemperature(const double &temp_tmp)
double fetlim(double vnew, double vold, double vto)
void registerJacLIDs(const std::vector< std::vector< int > > &jacLIDVec)
int ADrainEquDrainPrimeNodeOffset
double tnom
nominal temperature for device params.
static std::vector< int > jacMap_DC
double * q_DrainPrimeEquDrainNodePtr
double * f_DrainPrimeEquGateNodePtr
double * q_DrainEquDrainNodePtr
int ADrainPrimeEquSourcePrimeNodeOffset
void registerStateLIDs(const std::vector< int > &staLIDVecRef)
int getNumStoreVars() const
InstanceVector::const_iterator getInstanceBegin() const
Returns an iterator to the beginning of the vector of all instances created for this device...
double * q_SourcePrimeEquDrainPrimeNodePtr
std::vector< Param > params
Parameters from the line.
static std::vector< std::vector< int > > jacStamp
virtual bool updateState(double *solVec, double *staVec, double *stoVec)
Updates the devices state information.
static std::vector< std::vector< int > > jacMap2
void setParams(const std::vector< Param > ¶ms)
double * f_SourcePrimeEquSourceNodePtr
const std::string & getName() const
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.
double * daeFVectorRawPtr
The FactoryBlock contains parameters needed by the device, instance and model creation functions...
int ADrainPrimeEquGateNodeOffset
const DeviceOptions & getDeviceOptions() const
int ASourcePrimeEquDrainPrimeNodeOffset
double * q_SourcePrimeEquSourcePrimeNodePtr
static std::vector< std::vector< int > > jacMap2_SC
int ASourcePrimeEquSourcePrimeNodeOffset
double * nextStoVectorRawPtr
static void loadInstanceParameters(ParametricData< Instance > &instance_parameters)
double * q_GateEquSourcePrimeNodePtr
int AGateEquDrainPrimeNodeOffset
static Config< T > & addConfiguration()
Adds the device to the Xyce device configuration.
Linear::Matrix * dFdxMatrixPtr
int ASourceEquSourcePrimeNodeOffset
The Device class is an interface for device implementations.
double * q_DrainPrimeEquSourcePrimeNodePtr
void addStoreNode(Util::SymbolTable &symbol_table, int index, const InstanceName &instance_name, const std::string &lead_name)
double * f_GateEquSourcePrimeNodePtr
double * q_SourceEquSourceNodePtr
static std::vector< int > jacMap_DC_SC
bool updatePrimaryState()
const SolverState & solverState_
double * dQdxdVpVectorRawPtr
Class Configuration contains device configuration data.
void registerStoreLIDs(const std::vector< int > &stoLIDVecRef)
bool interpolateTNOM(double)
virtual std::ostream & printOutInstances(std::ostream &os) const
void jacStampMap(const JacobianStamp &stamp_parent, IdVector &map_parent, JacobianStamp &map2_parent, JacobianStamp &stamp, IdVector &map, JacobianStamp &map2, int from, int to, int original_size)
const std::vector< std::vector< int > > & jacobianStamp() const
const SolverState & getSolverState() const
static std::vector< std::vector< int > > jacMap2_DC
static void loadModelParameters(ParametricData< Model > &model_parameters)
static std::vector< int > jacMap
double * nextStaVectorRawPtr
#define Xyce_NONPOINTER_MATRIX_LOAD
bool processInstanceParams()
processInstanceParams
Instance(const Configuration &configuration, const InstanceBlock &instance_block, Model &model, const FactoryBlock &factory_block)
const std::string & getType() const
double gmin
minimum allowed conductance.
double * f_DrainPrimeEquDrainPrimeNodePtr
double * q_DrainPrimeEquDrainPrimeNodePtr
virtual void forEachInstance(DeviceInstanceOp &op) const
Apply a device instance "op" to all instances associated with this model.
double * q_DrainPrimeEquGateNodePtr
static std::vector< int > jacMap_SC
double * q_SourceEquSourcePrimeNodePtr
const ExternData & extData
ModelBlock represents a .MODEL line from the netlist.
double * f_DrainPrimeEquSourcePrimeNodePtr
Manages parameter binding for class C.
bool updateIntermediateVars()
InstanceBlock represent a device instance line from the netlist.
Util::Param temp
operating temperature of ckt.
std::vector< Param > params
double * f_SourcePrimeEquDrainPrimeNodePtr
Linear::Matrix * dQdxMatrixPtr
void registerLIDs(const std::vector< int > &intLIDVecRef, const std::vector< int > &extLIDVecRef)
int ASourcePrimeEquGateNodeOffset
int ADrainEquDrainNodeOffset
double * f_SourcePrimeEquSourcePrimeNodePtr
static std::vector< std::vector< int > > jacStamp_DC_SC
Linear::Vector * flagSolVectorPtr
bool processParams()
processParams
double * q_GateEquDrainPrimeNodePtr
void setModParams(const std::vector< Param > ¶ms)
double * nextSolVectorRawPtr
int numLeadCurrentStoreVars
int AGateEquSourcePrimeNodeOffset