29#include <pegtl/contrib/parse_tree.hpp>
60 bool emptyLine =
true;
72 item.
modelName += fmt::format(
"DC {} ", dc );
78 std::string args =
"";
82 case SIM_MODEL::TYPE::V_PWL:
83 case SIM_MODEL::TYPE::I_PWL:
86 std::unique_ptr<tao::pegtl::parse_tree::node> root;
94 catch(
const tao::pegtl::parse_error& )
101 for(
const auto& node : root->children )
104 SIM_VALUE::NOTATION::SI>>() )
116 case SIM_MODEL::TYPE::V_WHITENOISE:
117 case SIM_MODEL::TYPE::I_WHITENOISE:
120 args.append(
"0 0 0 0 0 " );
123 case SIM_MODEL::TYPE::V_PINKNOISE:
124 case SIM_MODEL::TYPE::I_PINKNOISE:
129 args.append(
"0 0 0 " );
132 case SIM_MODEL::TYPE::V_BURSTNOISE:
133 case SIM_MODEL::TYPE::I_BURSTNOISE:
134 args.append(
"0 0 0 0 " );
140 case SIM_MODEL::TYPE::V_RANDUNIFORM:
141 case SIM_MODEL::TYPE::I_RANDUNIFORM:
167 case SIM_MODEL::TYPE::V_RANDNORMAL:
168 case SIM_MODEL::TYPE::I_RANDNORMAL:
176 case SIM_MODEL::TYPE::V_RANDEXP:
177 case SIM_MODEL::TYPE::I_RANDEXP:
202 args.append( argStr +
" " );
214 case SIM_MODEL::TYPE::V_VCL:
215 case SIM_MODEL::TYPE::I_VCL:
225 case SIM_MODEL::TYPE::V_CCL:
226 case SIM_MODEL::TYPE::I_CCL:
246 item.
modelName += fmt::format(
"AC {} {}", ac, ph );
259 const std::string& aDefaultValue )
const
261 std::string result =
"";
267 result = aDefaultValue;
288 for(
int paramIndex =
static_cast<int>( aParamIndex );
292 m_params.at( aParamIndex ).value =
"";
297 for(
int paramIndex = 0; paramIndex < aParamIndex; ++paramIndex )
301 m_params.at( aParamIndex ).value =
"0";
362 case TYPE::V:
return vdc;
363 case TYPE::I:
return idc;
364 case TYPE::V_SIN:
return vsin;
365 case TYPE::I_SIN:
return isin;
366 case TYPE::V_PULSE:
return vpulse;
367 case TYPE::I_PULSE:
return ipulse;
368 case TYPE::V_EXP:
return vexp;
369 case TYPE::I_EXP:
return iexp;
374 case TYPE::V_VCL:
return vcvs;
375 case TYPE::V_CCL:
return ccvs;
376 case TYPE::V_PWL:
return vpwl;
377 case TYPE::I_VCL:
return vccs;
378 case TYPE::I_CCL:
return cccs;
379 case TYPE::I_PWL:
return ipwl;
380 case TYPE::V_WHITENOISE:
return vwhitenoise;
381 case TYPE::I_WHITENOISE:
return iwhitenoise;
382 case TYPE::V_PINKNOISE:
return vpinknoise;
383 case TYPE::I_PINKNOISE:
return ipinknoise;
384 case TYPE::V_BURSTNOISE:
return vburstnoise;
385 case TYPE::I_BURSTNOISE:
return iburstnoise;
386 case TYPE::V_RANDUNIFORM:
return vrandomuniform;
387 case TYPE::I_RANDUNIFORM:
return irandomuniform;
388 case TYPE::V_RANDNORMAL:
return vrandomnormal;
389 case TYPE::I_RANDNORMAL:
return irandomnormal;
390 case TYPE::V_RANDEXP:
return vrandomexp;
391 case TYPE::I_RANDEXP:
return irandomexp;
395 wxFAIL_MSG(
"Unhandled SIM_MODEL type in SIM_MODEL_SOURCE" );
396 static std::vector<SIM_MODEL::PARAM::INFO>
empty;
403 const std::string& aUnit )
405 std::vector<PARAM::INFO> paramInfos;
408 paramInfo.
name =
"dc";
410 paramInfo.
unit = aUnit;
414 paramInfos.push_back( paramInfo );
422 const std::string& aUnit )
424 std::vector<PARAM::INFO> paramInfos;
427 paramInfo.
name =
"dc";
429 paramInfo.
unit = aUnit;
433 paramInfos.push_back( paramInfo );
435 paramInfo.
name =
"ampl";
437 paramInfo.
unit = aUnit;
441 paramInfos.push_back( paramInfo );
443 paramInfo.
name =
"f";
445 paramInfo.
unit =
"Hz";
449 paramInfos.push_back( paramInfo );
451 paramInfo.
name =
"td";
453 paramInfo.
unit =
"s";
457 paramInfos.push_back( paramInfo );
459 paramInfo.
name =
"theta";
461 paramInfo.
unit =
"1/s";
465 paramInfos.push_back( paramInfo );
467 paramInfo.
name =
"phase";
469 paramInfo.
unit =
"°";
473 paramInfos.push_back( paramInfo );
481 const std::string& aUnit )
483 std::vector<PARAM::INFO> paramInfos;
486 paramInfo.
name = aPrefix +
"1";
488 paramInfo.
unit = aUnit;
492 paramInfos.push_back( paramInfo );
494 paramInfo.
name = aPrefix +
"2";
496 paramInfo.
unit = aUnit;
500 paramInfos.push_back( paramInfo );
502 paramInfo.
name =
"td";
504 paramInfo.
unit =
"s";
508 paramInfos.push_back( paramInfo );
510 paramInfo.
name =
"tr";
512 paramInfo.
unit =
"s";
516 paramInfos.push_back( paramInfo );
518 paramInfo.
name =
"tf";
520 paramInfo.
unit =
"s";
524 paramInfos.push_back( paramInfo );
526 paramInfo.
name =
"tw";
528 paramInfo.
unit =
"s";
532 paramInfos.push_back( paramInfo );
534 paramInfo.
name =
"per";
536 paramInfo.
unit =
"s";
540 paramInfos.push_back( paramInfo );
542 paramInfo.
name =
"np";
548 paramInfos.push_back( paramInfo );
556 const std::string& aUnit )
558 std::vector<PARAM::INFO> paramInfos;
561 paramInfo.
name = aPrefix +
"1";
563 paramInfo.
unit = aUnit;
567 paramInfos.push_back( paramInfo );
569 paramInfo.
name = aPrefix +
"2";
571 paramInfo.
unit = aUnit;
575 paramInfos.push_back( paramInfo );
577 paramInfo.
name =
"td1";
579 paramInfo.
unit =
"s";
583 paramInfos.push_back( paramInfo );
585 paramInfo.
name =
"tau1";
587 paramInfo.
unit =
"s";
591 paramInfos.push_back( paramInfo );
593 paramInfo.
name =
"td2";
595 paramInfo.
unit =
"s";
599 paramInfos.push_back( paramInfo );
601 paramInfo.
name =
"tau2";
603 paramInfo.
unit =
"s";
607 paramInfos.push_back( paramInfo );
731 std::vector<PARAM::INFO> paramInfos;
734 paramInfo.
name =
"gain";
737 paramInfo.
unit = aGainUnit;
739 paramInfos.push_back( paramInfo );
741 paramInfo.
name =
"control";
744 paramInfo.
description =
"Controlling voltage source";
745 paramInfos.push_back( paramInfo );
753 std::vector<PARAM::INFO> paramInfos;
756 paramInfo.
name =
"gain";
759 paramInfo.
unit = aGainUnit;
761 paramInfos.push_back( paramInfo );
763 paramInfo.
name =
"ic";
766 paramInfo.
unit =
"V";
767 paramInfo.
description =
"Initial condition of controlling source (ic)";
768 paramInfos.push_back( paramInfo );
775 const std::string& aQuantity,
776 const std::string& aUnit )
778 std::vector<PARAM::INFO> paramInfos;
781 paramInfo.
name =
"pwl";
783 paramInfo.
unit =
"s," + aUnit;
786 paramInfo.
description = aUnit ==
"V" ?
"Time-voltage points" :
"Time-current points";
787 paramInfos.push_back( paramInfo );
849 const std::string& aUnit )
851 std::vector<PARAM::INFO> paramInfos;
854 paramInfo.
name =
"rms";
856 paramInfo.
unit = aUnit;
859 paramInfo.
description =
"White noise RMS amplitude";
860 paramInfos.push_back( paramInfo );
862 paramInfo.
name =
"dt";
864 paramInfo.
unit =
"s";
868 paramInfos.push_back( paramInfo );
876 const std::string& aUnit )
878 std::vector<PARAM::INFO> paramInfos;
881 paramInfo.
name =
"rms";
887 paramInfos.push_back( paramInfo );
889 paramInfo.
name =
"slope";
895 paramInfos.push_back( paramInfo );
897 paramInfo.
name =
"dt";
899 paramInfo.
unit =
"s";
903 paramInfos.push_back( paramInfo );
911 const std::string& aUnit )
913 std::vector<PARAM::INFO> paramInfos;
916 paramInfo.
name =
"ampl";
918 paramInfo.
unit = aUnit;
922 paramInfos.push_back( paramInfo );
924 paramInfo.
name =
"tcapt";
926 paramInfo.
unit =
"s";
929 paramInfo.
description =
"Burst noise trap capture time";
930 paramInfos.push_back( paramInfo );
932 paramInfo.
name =
"temit";
934 paramInfo.
unit =
"s";
937 paramInfo.
description =
"Burst noise trap emission time";
938 paramInfos.push_back( paramInfo );
946 const std::string& aUnit )
948 std::vector<PARAM::INFO> paramInfos;
951 paramInfo.
name =
"min";
953 paramInfo.
unit = aUnit;
957 paramInfos.push_back( paramInfo );
959 paramInfo.
name =
"max";
961 paramInfo.
unit = aUnit;
965 paramInfos.push_back( paramInfo );
967 paramInfo.
name =
"dt";
969 paramInfo.
unit =
"s";
973 paramInfos.push_back( paramInfo );
975 paramInfo.
name =
"td";
977 paramInfo.
unit =
"s";
981 paramInfos.push_back( paramInfo );
989 const std::string& aUnit )
991 std::vector<PARAM::INFO> paramInfos;
994 paramInfo.
name =
"mean";
996 paramInfo.
unit = aUnit;
1000 paramInfos.push_back( paramInfo );
1002 paramInfo.
name =
"stddev";
1004 paramInfo.
unit = aUnit;
1008 paramInfos.push_back( paramInfo );
1010 paramInfo.
name =
"dt";
1012 paramInfo.
unit =
"s";
1016 paramInfos.push_back( paramInfo );
1018 paramInfo.
name =
"td";
1020 paramInfo.
unit =
"s";
1024 paramInfos.push_back( paramInfo );
1032 const std::string& aUnit )
1034 std::vector<PARAM::INFO> paramInfos;
1037 paramInfo.
name =
"offset";
1039 paramInfo.
unit = aUnit;
1043 paramInfos.push_back( paramInfo );
1045 paramInfo.
name =
"mean";
1047 paramInfo.
unit = aUnit;
1051 paramInfos.push_back( paramInfo );
1053 paramInfo.
name =
"dt";
1055 paramInfo.
unit =
"s";
1059 paramInfos.push_back( paramInfo );
1061 paramInfo.
name =
"td";
1063 paramInfo.
unit =
"s";
1067 paramInfos.push_back( paramInfo );
1075 const std::string& aUnit )
1077 std::vector<PARAM::INFO> paramInfos;
1080 paramInfo.
name =
"offset";
1082 paramInfo.
unit = aUnit;
1086 paramInfos.push_back( paramInfo );
1088 paramInfo.
name =
"lambda";
1090 paramInfo.
unit = aUnit;
1094 paramInfos.push_back( paramInfo );
1096 paramInfo.
name =
"dt";
1098 paramInfo.
unit =
"s";
1102 paramInfos.push_back( paramInfo );
1104 paramInfo.
name =
"td";
1106 paramInfo.
unit =
"s";
1110 paramInfos.push_back( paramInfo );
1120 paramInfo.
name =
"ac";
1122 paramInfo.
unit = aUnit;
1126 aParamInfos.push_back( paramInfo );
1128 paramInfo.
name =
"ph";
1130 paramInfo.
unit =
"°";
1134 aParamInfos.push_back( paramInfo );
1141 return {
"+",
"-",
"C+",
"C-" };
1143 return {
"+",
"-" };
static void appendAcParamInfos(std::vector< PARAM::INFO > &aParamInfos, const std::string &aUnit)
static std::vector< PARAM::INFO > makeBurstNoiseParamInfos(const std::string &aPrefix, const std::string &aUnit)
std::vector< std::string > GetPinNames() const override
static const std::vector< PARAM::INFO > & makeParamInfos(TYPE aType)
static std::vector< PARAM::INFO > makeExpParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makeRandomNormalParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< SIM_MODEL::PARAM::INFO > makeVcParamInfos(const std::string &aGainUnit)
SIM_MODEL_SOURCE(TYPE aType)
static std::vector< PARAM::INFO > makeRandomExpParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makeRandomUniformParamInfos(const std::string &aPrefix, const std::string &aUnit)
void doSetParamValue(int aParamIndex, const std::string &aValue) override
static std::vector< PARAM::INFO > makeRandomPoissonParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makeDcParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makePulseParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makePinkNoiseParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makeSinParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< PARAM::INFO > makePwlParamInfos(const std::string &aPrefix, const std::string &aQuantity, const std::string &aUnit)
static std::vector< PARAM::INFO > makeWhiteNoiseParamInfos(const std::string &aPrefix, const std::string &aUnit)
static std::vector< SIM_MODEL::PARAM::INFO > makeCcParamInfos(const std::string &aGainUnit)
void AddParam(const PARAM::INFO &aInfo)
virtual const PARAM & GetParam(unsigned aParamIndex) const
int GetParamCount() const
DEVICE_T GetDeviceType() const
const PARAM * FindParam(const std::string &aParamName) const
virtual void doSetParamValue(int aParamIndex, const std::string &aValue)
std::vector< PARAM > m_params
void SetParamValue(int aParamIndex, const std::string &aValue, SIM_VALUE::NOTATION aNotation=SIM_VALUE::NOTATION::SI)
SPICE_INFO GetSpiceInfo() const
std::vector< std::reference_wrapper< const PARAM > > GetParams() const
static std::string ToSpice(const std::string &aString)
std::string ModelLine(const SPICE_ITEM &aItem) const override
std::string ItemLine(const SPICE_ITEM &aItem) const override
std::string getParamValueString(const std::string &aParamName, const std::string &aDefaultValue) const
virtual std::string ItemLine(const SPICE_ITEM &aItem) const
const SIM_MODEL & m_model
static bool empty(const wxTextEntryBase *aCtrl)
std::string inlineTypeString