38 #include <Xyce_config.h>
45 #include <N_ERH_Message.h>
46 #include <N_IO_CircuitBlock.h>
47 #include <N_IO_CmdParse.h>
48 #include <N_IO_OptionBlock.h>
49 #include <N_IO_PkgOptionsMgr.h>
50 #include <N_IO_SpiceSeparatedFieldTool.h>
51 #include <N_PDS_Manager.h>
54 #include <N_UTL_Diagnostic.h>
55 #include <N_UTL_ExtendedString.h>
56 #include <N_UTL_Factory.h>
57 #include <N_UTL_FeatureTest.h>
58 #include <N_UTL_OptionBlock.h>
59 #include <N_UTL_Timer.h>
131 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
133 Xyce::dout() << std::endl << std::endl;
134 Xyce::dout() << section_divider << std::endl;
135 Xyce::dout() <<
"Step::init" << std::endl;
156 bool integration_status =
true;
167 if (DEBUG_ANALYSIS && isActive(Diag::TIME_PARAMETERS))
171 Xyce::dout() <<
"Step Analysis # " << i<<
"\t";
172 Xyce::dout() << (*it);
187 return integration_status;
271 Linear::System & linear_system,
281 virtual ~StepFactory()
301 step->setAnalysisParams(*it);
321 void setStepAnalysisOptionBlock(
const Util::OptionBlock &option_block)
325 if (Util::compareParamLists(option_block, *it))
327 (*it) = option_block;
347 struct StepAnalysisReg :
public IO::PkgOptionsReg
350 StepFactory & factory)
354 bool operator()(
const Util::OptionBlock &option_block)
356 factory_.setStepAnalysisOptionBlock(option_block);
377 IO::PkgOptionsMgr & options_manager,
378 IO::CircuitBlock & circuit_block,
379 const std::string & netlist_filename,
380 const IO::TokenVector & parsed_line)
382 Util::OptionBlock option_block(
"STEP", Util::OptionBlock::NO_EXPRESSIONS, netlist_filename, parsed_line[0].lineNumber_);
384 int numFields = parsed_line.size();
390 bool typeExplicitSetLinDecOct =
false;
391 bool typeExplicitSetList =
false;
392 std::string type(
"LIN");
393 while ( pos1 < numFields )
395 ExtendedString stringVal ( parsed_line[pos1].string_ );
396 stringVal.toUpper ();
397 if (stringVal ==
"LIN" ||
398 stringVal ==
"DEC" ||
401 typeExplicitSetLinDecOct =
true;
404 else if (stringVal ==
"LIST")
406 typeExplicitSetList =
true;
415 if (typeExplicitSetLinDecOct)
420 if (!typeExplicitSetList)
422 if ( (numFields-offset)%4 != 0 )
424 Report::UserError0().at(netlist_filename, parsed_line[0].lineNumber_)
425 <<
".STEP line not formatted correctly.";
430 int linePosition = 1;
431 Util::Param parameter(
"",
"");
434 parameter.setTag(
"TYPE" );
435 parameter.setVal( type );
436 option_block.addParam( parameter );
440 if (typeExplicitSetLinDecOct) linePosition=2;
441 while ( linePosition < numFields )
443 parameter.setTag(
"PARAM" );
444 parameter.setVal(std::string(ExtendedString(parsed_line[linePosition].string_).toUpper()));
445 option_block.addParam( parameter );
448 parameter.setTag(
"START" );
449 parameter.setVal( parsed_line[linePosition].string_ );
450 option_block.addParam( parameter );
453 parameter.setTag(
"STOP" );
454 parameter.setVal( parsed_line[linePosition].string_ );
455 option_block.addParam( parameter );
458 parameter.setTag(
"STEP" );
459 parameter.setVal( parsed_line[linePosition].string_ );
460 option_block.addParam( parameter );
464 else if (type==
"DEC")
466 if (typeExplicitSetLinDecOct) linePosition=2;
468 while ( linePosition < numFields )
470 parameter.setTag(
"PARAM" );
471 parameter.setVal(std::string(ExtendedString(parsed_line[linePosition].string_).toUpper()));
472 option_block.addParam( parameter );
475 parameter.setTag(
"START" );
476 parameter.setVal( parsed_line[linePosition].string_ );
477 option_block.addParam( parameter );
480 parameter.setTag(
"STOP" );
481 parameter.setVal( parsed_line[linePosition].string_ );
482 option_block.addParam( parameter );
485 parameter.setTag(
"NUMSTEPS" );
486 parameter.setVal( parsed_line[linePosition].string_ );
487 option_block.addParam( parameter );
491 else if (type==
"OCT")
493 if (typeExplicitSetLinDecOct) linePosition=2;
495 while ( linePosition < numFields )
497 parameter.setTag(
"PARAM" );
498 parameter.setVal(std::string(ExtendedString(parsed_line[linePosition].string_).toUpper()));
499 option_block.addParam( parameter );
502 parameter.setTag(
"START" );
503 parameter.setVal( parsed_line[linePosition].string_ );
504 option_block.addParam( parameter );
507 parameter.setTag(
"STOP" );
508 parameter.setVal( parsed_line[linePosition].string_ );
509 option_block.addParam( parameter );
512 parameter.setTag(
"NUMSTEPS" );
513 parameter.setVal( parsed_line[linePosition].string_ );
514 option_block.addParam( parameter );
519 else if (type==
"LIST")
521 parameter.setTag(
"PARAM" );
522 parameter.setVal(std::string(ExtendedString(parsed_line[1].string_).toUpper()));
523 option_block.addParam( parameter );
526 while (linePosition<numFields)
528 parameter.setTag(
"VAL" );
529 parameter.setVal( parsed_line[linePosition].string_ );
530 option_block.addParam( parameter );
537 Report::UserError0().at(netlist_filename, parsed_line[0].lineNumber_)
538 <<
".STEP line contains an unrecognized type";
541 circuit_block.addOptions(option_block);
557 factory_block.
optionsManager_.addCommandParser(
".STEP", extractSTEPData);
559 factory_block.
optionsManager_.addCommandProcessor(
"STEP",
new StepAnalysisReg(*factory));
int setupSweepLoop(Parallel::Machine comm, Loader::Loader &loader, std::vector< SweepParam >::iterator begin, std::vector< SweepParam >::iterator end)
virtual const TimeIntg::TIAParams & getTIAParams() const =0
IO::PkgOptionsMgr & optionsManager_
virtual bool doProcessFailedStep()
Pure virtual class to augment a linear system.
AnalysisBase & childAnalysis_
bool updateSweepParams(Loader::Loader &loader, int step_count, std::vector< SweepParam >::iterator begin, std::vector< SweepParam >::iterator end, bool overrideOriginal)
Nonlinear::Manager & nonlinearManager_
double finalTime
End time for simulation.
Parallel::Machine getComm() const
SweepVector stepSweepVector_
virtual bool doProcessSuccessfulStep()
void setStepSweepVector(const Analysis::SweepVector &sweep_vector)
virtual bool getDCOPFlag() const
virtual bool getDCOPFlag() const =0
The FactoryBlock contains parameters needed by the analysis creation functions.
Linear::System & linearSystem_
bool registerStepFactory(FactoryBlock &factory_block)
std::vector< Util::OptionBlock > stepSweepAnalysisOptionBlock_
Linear::System & linearSystem_
AnalysisManager & analysisManager_
SweepParam parseSweepParams(Util::ParamList::const_iterator first, Util::ParamList::const_iterator last)
Populate the sweep params from the parameter list.
bool setAnalysisParams(const Util::OptionBlock ¶msBlock)
Nonlinear::Manager & nonlinearManager_
TimeIntegrationMethod *(* Factory)(const TIAParams &tia_params, StepErrorControl &step_error_control, DataStore &data_store)
AnalysisManager & analysisManager_
void addAnalysisFactory(FactoryBlock &factory_block, Util::Factory< AnalysisBase, void > *factory)
void setSweepSourceResetFlag(bool reset)
OutputMgrAdapter & outputManagerAdapter_
virtual bool doLoopProcess()
AnalysisManager & analysisManager_
const TimeIntg::TIAParams & getTIAParams() const