46 #include <Xyce_config.h>
58 #include <N_ERH_ErrorMgr.h>
59 #include <N_IO_CmdParse.h>
60 #include <N_IO_PkgOptionsMgr.h>
61 #include <N_UTL_Diagnostic.h>
62 #include <N_UTL_FeatureTest.h>
63 #include <N_UTL_OptionBlock.h>
64 #include <N_UTL_MachDepParams.h>
66 #ifndef Xyce_NEW_EXCESS_PHASE
103 testJac_relTol(0.01),
104 testJac_absTol(1.0e-8),
105 testJac_SqrtEta(1.0e-8),
106 deviceSens_dp(1.0e-8),
110 numericalJacobianFlag (false),
111 testJacobianFlag (false),
113 testJacStopStep(Util::MachineDependentParams::IntMax()),
115 testJacDeviceName(
""),
116 testJacDeviceNameGiven( false ),
117 voltageLimiterFlag (true),
119 icMultiplier (10000.0),
120 defaultMaxTimeStep (1.0e99),
123 numGainScaleBlocks(1),
124 staggerGainScale(false),
125 randomizeVgstConst(false),
132 zeroResistanceTol(1.0e-100),
133 checkForZeroResistance(true),
134 debugMinTimestep (0),
135 debugMaxTimestep (Util::MachineDependentParams::IntMax()),
137 debugMaxTime (Util::MachineDependentParams::DoubleMax()),
141 excessPhaseScalar1 (1.0),
142 excessPhaseScalar2 (1.0),
144 tryToCompact (false),
145 calculateAllLeadCurrents (false),
149 setSensitivityDebugLevel(0);
150 setDeviceDebugLevel(1);
174 const Util::OptionBlock & option_block)
176 for (Util::ParamList::const_iterator it = option_block.begin(), end = option_block.end(); it != end; ++it)
178 const std::string &tag = (*it).uTag();
181 defad = (*it).getImmutableValue<
double>();
182 else if (tag ==
"DEFAS")
183 defas = (*it).getImmutableValue<
double>();
184 else if (tag ==
"DEFL")
185 defl = (*it).getImmutableValue<
double>();
186 else if (tag ==
"DEFW")
187 defw = (*it).getImmutableValue<
double>();
188 else if (tag ==
"ABSTOL")
189 abstol = (*it).getImmutableValue<
double>();
190 else if (tag ==
"RELTOL")
191 reltol = (*it).getImmutableValue<
double>();
192 else if (tag ==
"CHGTOL")
193 chgtol = (*it).getImmutableValue<
double>();
194 else if (tag ==
"GMIN")
195 gmin = (*it).getImmutableValue<
double>();
196 else if (tag ==
"GMINSCALAR")
198 else if (tag ==
"GMAX")
199 gmax = (*it).getImmutableValue<
double>();
200 else if (tag ==
"TJRELTOL")
202 else if (tag ==
"TJABSTOL")
204 else if (tag ==
"TJSQRTETA")
206 else if (tag ==
"SENSDP")
208 else if (tag ==
"TNOM")
210 else if (tag ==
"TEMP")
213 if ( !(*it).isTimeDependent() )
217 temp.setVal( (*it).stringValue() );
218 temp.setTimeDependent(
true );
221 else if (tag ==
"SCALESRC")
222 scale_src = (*it).getImmutableValue<
double>();
223 else if (tag ==
"NUMJAC")
225 else if (tag ==
"TESTJAC")
227 else if (tag ==
"TESTJACSTARTSTEP")
229 else if (tag ==
"TESTJACSTOPSTEP")
231 else if (tag ==
"TESTJACWARN")
232 testJacWarn =
static_cast<bool> ((*it).getImmutableValue<
int>());
233 else if (tag ==
"TESTJACDEVICENAME")
238 else if (tag ==
"VOLTLIM")
240 else if (tag ==
"LAMBERTW")
241 lambertWFlag =
static_cast<int>((*it).getImmutableValue<
int>());
242 else if (tag ==
"ICFAC" )
244 else if (tag ==
"MAXTIMESTEP" )
247 else if (tag ==
"VDSSCALEMIN" )
249 else if (tag ==
"VGSTCONST" )
250 vgstConst = (*it).getImmutableValue<
double>();
251 else if (tag ==
"NUMGAINSCALEBLOCKS" )
253 else if (tag ==
"STAGGERGAINSCALE")
255 else if (tag ==
"RANDOMIZEVGSTCONST")
257 else if (tag ==
"LENGTH0" )
258 length0 = (*it).getImmutableValue<
double>();
259 else if (tag ==
"WIDTH0" )
260 width0 = (*it).getImmutableValue<
double>();
261 else if (tag ==
"TOX0" )
262 tox0 = (*it).getImmutableValue<
double>();
263 else if (tag ==
"MINRES" )
264 minRes = (*it).getImmutableValue<
double>();
265 else if (tag ==
"MINCAP" )
266 minCap = (*it).getImmutableValue<
double>();
267 else if (tag ==
"NEWMEYER" )
269 else if (tag ==
"SENSDEBUGLEVEL")
271 setDeviceSensitivityDebugLevel((*it).getImmutableValue<
int>());
273 else if (tag ==
"DEBUGLEVEL")
275 setDeviceDebugLevel((*it).getImmutableValue<
int>());
277 else if (tag ==
"VERBOSELEVEL")
281 else if (tag ==
"DEBUGMINTIMESTEP")
285 else if (tag ==
"DEBUGMAXTIMESTEP")
289 else if (tag ==
"DEBUGMINTIME")
293 else if (tag ==
"DEBUGMAXTIME")
297 else if (tag ==
"NEWEXCESSPHASE")
299 newExcessPhase =
static_cast<bool> ((*it).getImmutableValue<
int>());
301 else if (tag ==
"EXCESSPHASESCALAR1")
305 else if (tag ==
"EXCESSPHASESCALAR2")
309 else if (tag ==
"ZERORESISTANCETOL")
313 else if (tag ==
"CHECKFORZERORESISTANCE")
317 else if (tag ==
"RANDOMSEED" )
319 randomSeed = ((*it).getImmutableValue<
long>());
321 else if (tag ==
"TRYTOCOMPACT")
323 tryToCompact =
static_cast<bool> ((*it).getImmutableValue<
int>());
325 else if (tag ==
"CALCULATEALLLEADCURRENTS")
329 else if (tag ==
"DIGINITSTATE")
335 Report::UserError0() << tag <<
" is not a recognized device package option.";
342 if (DEBUG_DEVICE && isActive(Diag::DEVICE_PARAMETERS))
343 dout() << *
this << std::endl;
350 IO::PkgOptionsMgr & options_manager)
352 Util::ParamMap ¶meters = options_manager.addOptionsMetadataMap(
"DEVICE");
354 parameters.insert(Util::ParamMap::value_type(
"DEFAS", Util::Param(
"DEFAS", 0.0)));
355 parameters.insert(Util::ParamMap::value_type(
"DEFAD", Util::Param(
"DEFAD", 0.0)));
356 parameters.insert(Util::ParamMap::value_type(
"DEFL", Util::Param(
"DEFL", 1.0e-4)));
357 parameters.insert(Util::ParamMap::value_type(
"DEFW", Util::Param(
"DEFW", 1.0e-4)));
358 parameters.insert(Util::ParamMap::value_type(
"GMIN", Util::Param(
"GMIN", 1.0e-12)));
359 parameters.insert(Util::ParamMap::value_type(
"GMINSCALAR", Util::Param(
"GMINSCALAR", 1.0e+10)));
360 parameters.insert(Util::ParamMap::value_type(
"GMAX", Util::Param(
"GMAX", 1.0e20)));
361 parameters.insert(Util::ParamMap::value_type(
"TEMP", Util::Param(
"TEMP", 27.0)));
362 parameters.insert(Util::ParamMap::value_type(
"TNOM", Util::Param(
"TNOM", 27.0)));
363 parameters.insert(Util::ParamMap::value_type(
"SCALESRC", Util::Param(
"SCALESRC", 0.0)));
364 parameters.insert(Util::ParamMap::value_type(
"NUMJAC", Util::Param(
"NUMJAC", 0)));
365 parameters.insert(Util::ParamMap::value_type(
"TESTJAC", Util::Param(
"TESTJAC", 0)));
366 parameters.insert(Util::ParamMap::value_type(
"TESTJACSTARTSTEP", Util::Param(
"TESTJACSTARTSTEP", 0)));
367 parameters.insert(Util::ParamMap::value_type(
"TESTJACSTOPSTEP", Util::Param(
"TESTJACSTOPSTEP", 0)));
368 parameters.insert(Util::ParamMap::value_type(
"TJRELTOL", Util::Param(
"TJRELTOL", 0.01)));
369 parameters.insert(Util::ParamMap::value_type(
"TJABSTOL", Util::Param(
"TJABSTOL", 1.0e-8)));
370 parameters.insert(Util::ParamMap::value_type(
"TJSQRTETA", Util::Param(
"TJSQRTETA", 1.0e-8)));
371 parameters.insert(Util::ParamMap::value_type(
"SENSDP", Util::Param(
"SENSDP", 1.0e-8)));
372 parameters.insert(Util::ParamMap::value_type(
"TESTJACWARN", Util::Param(
"TESTJACWARN", 0)));
373 parameters.insert(Util::ParamMap::value_type(
"TESTJACDEVICENAME", Util::Param(
"TESTJACDEVICENAME",
"")));
374 parameters.insert(Util::ParamMap::value_type(
"VOLTLIM", Util::Param(
"VOLTLIM", 1)));
375 parameters.insert(Util::ParamMap::value_type(
"ICFAC", Util::Param(
"ICFAC", 10000.0)));
376 parameters.insert(Util::ParamMap::value_type(
"LAMBERTW", Util::Param(
"LAMBERTW", 0)));
377 parameters.insert(Util::ParamMap::value_type(
"MAXTIMESTEP", Util::Param(
"MAXTIMESTEP", 1.0e99)));
378 parameters.insert(Util::ParamMap::value_type(
"DEBUGLEVEL", Util::Param(
"DEBUGLEVEL", 1)));
379 parameters.insert(Util::ParamMap::value_type(
"DEBUGMINTIMESTEP", Util::Param(
"DEBUGMINTIMESTEP", 0)));
380 parameters.insert(Util::ParamMap::value_type(
"DEBUGMAXTIMESTEP", Util::Param(
"DEBUGMAXTIMESTEP", 65536)));
381 parameters.insert(Util::ParamMap::value_type(
"DEBUGMINTIME", Util::Param(
"DEBUGMINTIME", 0.0)));
382 parameters.insert(Util::ParamMap::value_type(
"DEBUGMAXTIME", Util::Param(
"DEBUGMAXTIME", 100.0)));
383 parameters.insert(Util::ParamMap::value_type(
"VERBOSELEVEL", Util::Param(
"VERBOSELEVEL", 0)));
384 parameters.insert(Util::ParamMap::value_type(
"ABSTOL", Util::Param(
"ABSTOL", 1.0e-12)));
385 parameters.insert(Util::ParamMap::value_type(
"CHGTOL", Util::Param(
"CHGTOL", 1.0e-12)));
386 parameters.insert(Util::ParamMap::value_type(
"VDSSCALEMIN", Util::Param(
"VDSSCALEMIN", 0.3)));
387 parameters.insert(Util::ParamMap::value_type(
"VGSTCONST", Util::Param(
"VGSTCONST", 4.5)));
388 parameters.insert(Util::ParamMap::value_type(
"LENGTH0", Util::Param(
"LENGTH0", 5.0e-6)));
389 parameters.insert(Util::ParamMap::value_type(
"WIDTH0", Util::Param(
"WIDTH0", 200.0e-6)));
390 parameters.insert(Util::ParamMap::value_type(
"TOX0", Util::Param(
"TOX0", 6.0e-8)));
391 parameters.insert(Util::ParamMap::value_type(
"MINRES", Util::Param(
"MINRES", 0.0)));
392 parameters.insert(Util::ParamMap::value_type(
"MINCAP", Util::Param(
"MINCAP", 0.0)));
393 parameters.insert(Util::ParamMap::value_type(
"SENSDEBUGLEVEL", Util::Param(
"SENSDEBUGLEVEL", 0)));
394 parameters.insert(Util::ParamMap::value_type(
"NUMGAINSCALEBLOCKS", Util::Param(
"NUMGAINSCALEBLOCKS", 1)));
395 parameters.insert(Util::ParamMap::value_type(
"STAGGERGAINSCALE", Util::Param(
"STAGGERGAINSCALE", 0)));
396 parameters.insert(Util::ParamMap::value_type(
"RANDOMIZEVGSTCONST", Util::Param(
"RANDOMIZEVGSTCONST", 0)));
397 parameters.insert(Util::ParamMap::value_type(
"NEWEXCESSPHASE", Util::Param(
"NEWEXCESSPHASE", 1)));
398 parameters.insert(Util::ParamMap::value_type(
"EXCESSPHASESCALAR1", Util::Param(
"EXCESSPHASESCALAR1", 1.0)));
399 parameters.insert(Util::ParamMap::value_type(
"EXCESSPHASESCALAR2", Util::Param(
"EXCESSPHASESCALAR2", 1.0)));
400 parameters.insert(Util::ParamMap::value_type(
"RANDOMSEED", Util::Param(
"RANDOMSEED", 0)));
401 parameters.insert(Util::ParamMap::value_type(
"TRYTOCOMPACT", Util::Param(
"TRYTOCOMPACT",
false)));
402 parameters.insert(Util::ParamMap::value_type(
"CALCULATEALLLEADCURRENTS", Util::Param(
"CALCULATEALLLEADCURRENTS",
false)));
403 parameters.insert(Util::ParamMap::value_type(
"NEWMEYER", Util::Param(
"NEWMEYER",
false )));
404 parameters.insert(Util::ParamMap::value_type(
"ZERORESISTANCETOL", Util::Param(
"ZERORESISTANCETOL", 1.0e-100 )));
405 parameters.insert(Util::ParamMap::value_type(
"CHECKFORZERORESISTANCE", Util::Param(
"CHECKFORZERORESISTANCE",
true )));
406 parameters.insert(Util::ParamMap::value_type(
"DIGINITSTATE", Util::Param(
"DIGINITSTATE", 3 )));
419 os <<
"\n\n-----------------------------------------" << std::endl
420 <<
"\tDevice Options:\n"
421 <<
"\t\tdefad = " << devOp.
defad <<
"\n"
422 <<
"\t\tdefas = " << devOp.
defas <<
"\n"
423 <<
"\t\tdefl = " << devOp.
defl <<
"\n"
424 <<
"\t\tdefw = " << devOp.
defw <<
"\n"
425 <<
"\t\tabstol = " << devOp.
abstol <<
"\n"
426 <<
"\t\treltol = " << devOp.
reltol <<
"\n"
427 <<
"\t\tchgtol = " << devOp.
chgtol <<
"\n"
428 <<
"\t\tgmin = " << devOp.
gmin <<
"\n"
429 <<
"\t\tgmin_orig = " << devOp.
gmin_orig <<
"\n"
430 <<
"\t\tgmin_init = " << devOp.
gmin_init <<
"\n"
431 <<
"\t\tgmin_scalar = " << devOp.
gmin_scalar <<
"\n"
432 <<
"\t\tgmax = " << devOp.
gmax <<
"\n"
433 <<
"\t\ttnom = " << devOp.
tnom <<
"\n"
434 <<
"\t\tscale_src = " << devOp.
scale_src <<
"\n"
439 <<
"\t\ttestJacWarn = " << devOp.
testJacWarn <<
"\n"
451 <<
"\t\tvdsScaleMin = " << devOp.
vdsScaleMin <<
"\n"
452 <<
"\t\tvgstConst = " << devOp.
vgstConst <<
"\n"
456 <<
"\t\tlength0 = " << devOp.
length0 <<
"\n"
457 <<
"\t\twidth0 = " << devOp.
width0 <<
"\n"
458 <<
"\t\ttox0 = " << devOp.
tox0 <<
"\n"
459 <<
"\t\tminres = " << devOp.
minRes <<
"\n"
460 <<
"\t\tmincap = " << devOp.
minCap <<
"\n"
472 << Xyce::section_divider
double defad
MOS drain diffusion area.
double excessPhaseScalar2
double defw
MOS channel width.
double testJac_absTol
abstol for num. jacobian diagnostic.
double chgtol
absolute charge error tolerance.
double reltol
relative current error tolerance.
Pure virtual class to augment a linear system.
unsigned int randomSeed
seed for random number generator used by some devices.
double gmax
maximum allowed conductance.
double testJac_relTol
reltol for num. jacobian diagnostic
double gmin_scalar
this is needed for gmin-homotopy.
static const bool EXCESS_PHASE
double defl
MOS channel length.
double tnom
nominal temperature for device params.
double deviceSens_dp
similar to eta, but for numerical device sensitivities
double gmin_init
this is needed for gmin-homotopy.
bool tryToCompact
Try to compact past history for LTRA device(s).
double excessPhaseScalar1
double abstol
absolute current error tolerance.
bool calculateAllLeadCurrents
configure all devices to load lead currents
double defas
MOS source diffusion area.
bool setOptions(const Util::OptionBlock &option_block)
int digInitState
used to initialize all of the digital gates in a circuit
double defaultMaxTimeStep
mosfet homotopy:
bool checkForZeroResistance
static void populateMetadata(IO::PkgOptionsMgr &options_manager)
double testJac_SqrtEta
dx = numJacSqrtEta * (1.0 + std::fabs(soln[i]));
double gmin
minimum allowed conductance.
bool numericalJacobianFlag
double scale_src
scaling for source loads
bool testJacDeviceNameGiven
std::string testJacDeviceName
Util::Param temp
operating temperature of ckt.
bool defaultNewExcessPhase
default is true for MPDE, false for non-MPDE.
double gmin_orig
this is needed for gmin-homotopy.
std::ostream & operator<<(std::ostream &os, const Configuration &configuration)