29#include <pegtl/contrib/parse_tree.hpp>
60 bool emptyLine =
true;
72 item.
modelName += fmt::format(
"DC {} ", dc );
79 std::string args =
"";
83 case SIM_MODEL::TYPE::V_PWL:
84 case SIM_MODEL::TYPE::I_PWL:
87 std::unique_ptr<tao::pegtl::parse_tree::node> root;
95 catch(
const tao::pegtl::parse_error& )
102 for(
const auto& node : root->children )
105 SIM_VALUE::NOTATION::SI>>() )
117 case SIM_MODEL::TYPE::V_WHITENOISE:
118 case SIM_MODEL::TYPE::I_WHITENOISE:
121 args.append(
"0 0 0 0 0 " );
124 case SIM_MODEL::TYPE::V_PINKNOISE:
125 case SIM_MODEL::TYPE::I_PINKNOISE:
130 args.append(
"0 0 0 " );
133 case SIM_MODEL::TYPE::V_BURSTNOISE:
134 case SIM_MODEL::TYPE::I_BURSTNOISE:
135 args.append(
"0 0 0 0 " );
141 case SIM_MODEL::TYPE::V_RANDUNIFORM:
142 case SIM_MODEL::TYPE::I_RANDUNIFORM:
168 case SIM_MODEL::TYPE::V_RANDNORMAL:
169 case SIM_MODEL::TYPE::I_RANDNORMAL:
177 case SIM_MODEL::TYPE::V_RANDEXP:
178 case SIM_MODEL::TYPE::I_RANDEXP:
203 args.append( argStr +
" " );
215 case SIM_MODEL::TYPE::V_VCL:
216 case SIM_MODEL::TYPE::I_VCL:
226 case SIM_MODEL::TYPE::V_CCL:
227 case SIM_MODEL::TYPE::I_CCL:
247 item.
modelName += fmt::format(
"AC {} {} ", ac, ph );
250 std::string portnum =
"";
257 item.
modelName += fmt::format(
"portnum {} ", portnum );
265 item.
modelName += fmt::format(
"z0 {} ", z0 );
278 const std::string& aDefaultValue )
const
280 std::string result =
"";
286 result = aDefaultValue;
307 for(
int paramIndex =
static_cast<int>( aParamIndex );
311 m_params.at( aParamIndex ).value =
"";
316 for(
int paramIndex = 0; paramIndex < aParamIndex; ++paramIndex )
320 m_params.at( aParamIndex ).value =
"0";
381 case TYPE::V:
return vdc;
382 case TYPE::I:
return idc;
383 case TYPE::V_SIN:
return vsin;
384 case TYPE::I_SIN:
return isin;
385 case TYPE::V_PULSE:
return vpulse;
386 case TYPE::I_PULSE:
return ipulse;
387 case TYPE::V_EXP:
return vexp;
388 case TYPE::I_EXP:
return iexp;
393 case TYPE::V_VCL:
return vcvs;
394 case TYPE::V_CCL:
return ccvs;
395 case TYPE::V_PWL:
return vpwl;
396 case TYPE::I_VCL:
return vccs;
397 case TYPE::I_CCL:
return cccs;
398 case TYPE::I_PWL:
return ipwl;
399 case TYPE::V_WHITENOISE:
return vwhitenoise;
400 case TYPE::I_WHITENOISE:
return iwhitenoise;
401 case TYPE::V_PINKNOISE:
return vpinknoise;
402 case TYPE::I_PINKNOISE:
return ipinknoise;
403 case TYPE::V_BURSTNOISE:
return vburstnoise;
404 case TYPE::I_BURSTNOISE:
return iburstnoise;
405 case TYPE::V_RANDUNIFORM:
return vrandomuniform;
406 case TYPE::I_RANDUNIFORM:
return irandomuniform;
407 case TYPE::V_RANDNORMAL:
return vrandomnormal;
408 case TYPE::I_RANDNORMAL:
return irandomnormal;
409 case TYPE::V_RANDEXP:
return vrandomexp;
410 case TYPE::I_RANDEXP:
return irandomexp;
414 wxFAIL_MSG(
"Unhandled SIM_MODEL type in SIM_MODEL_SOURCE" );
415 static std::vector<SIM_MODEL::PARAM::INFO>
empty;
422 const std::string& aUnit )
424 std::vector<PARAM::INFO> paramInfos;
427 paramInfo.
name =
"dc";
429 paramInfo.
unit = aUnit;
433 paramInfos.push_back( paramInfo );
442 const std::string& aUnit )
444 std::vector<PARAM::INFO> paramInfos;
447 paramInfo.
name =
"dc";
449 paramInfo.
unit = aUnit;
453 paramInfos.push_back( paramInfo );
455 paramInfo.
name =
"ampl";
457 paramInfo.
unit = aUnit;
461 paramInfos.push_back( paramInfo );
463 paramInfo.
name =
"f";
465 paramInfo.
unit =
"Hz";
469 paramInfos.push_back( paramInfo );
471 paramInfo.
name =
"td";
473 paramInfo.
unit =
"s";
477 paramInfos.push_back( paramInfo );
479 paramInfo.
name =
"theta";
481 paramInfo.
unit =
"1/s";
485 paramInfos.push_back( paramInfo );
487 paramInfo.
name =
"phase";
489 paramInfo.
unit =
"°";
493 paramInfos.push_back( paramInfo );
502 const std::string& aUnit )
504 std::vector<PARAM::INFO> paramInfos;
507 paramInfo.
name = aPrefix +
"1";
509 paramInfo.
unit = aUnit;
513 paramInfos.push_back( paramInfo );
515 paramInfo.
name = aPrefix +
"2";
517 paramInfo.
unit = aUnit;
521 paramInfos.push_back( paramInfo );
523 paramInfo.
name =
"td";
525 paramInfo.
unit =
"s";
529 paramInfos.push_back( paramInfo );
531 paramInfo.
name =
"tr";
533 paramInfo.
unit =
"s";
537 paramInfos.push_back( paramInfo );
539 paramInfo.
name =
"tf";
541 paramInfo.
unit =
"s";
545 paramInfos.push_back( paramInfo );
547 paramInfo.
name =
"tw";
549 paramInfo.
unit =
"s";
553 paramInfos.push_back( paramInfo );
555 paramInfo.
name =
"per";
557 paramInfo.
unit =
"s";
561 paramInfos.push_back( paramInfo );
563 paramInfo.
name =
"np";
569 paramInfos.push_back( paramInfo );
578 const std::string& aUnit )
580 std::vector<PARAM::INFO> paramInfos;
583 paramInfo.
name = aPrefix +
"1";
585 paramInfo.
unit = aUnit;
589 paramInfos.push_back( paramInfo );
591 paramInfo.
name = aPrefix +
"2";
593 paramInfo.
unit = aUnit;
597 paramInfos.push_back( paramInfo );
599 paramInfo.
name =
"td1";
601 paramInfo.
unit =
"s";
605 paramInfos.push_back( paramInfo );
607 paramInfo.
name =
"tau1";
609 paramInfo.
unit =
"s";
613 paramInfos.push_back( paramInfo );
615 paramInfo.
name =
"td2";
617 paramInfo.
unit =
"s";
621 paramInfos.push_back( paramInfo );
623 paramInfo.
name =
"tau2";
625 paramInfo.
unit =
"s";
629 paramInfos.push_back( paramInfo );
754 std::vector<PARAM::INFO> paramInfos;
757 paramInfo.
name =
"gain";
760 paramInfo.
unit = aGainUnit;
762 paramInfos.push_back( paramInfo );
764 paramInfo.
name =
"control";
767 paramInfo.
description =
"Controlling voltage source";
768 paramInfos.push_back( paramInfo );
776 std::vector<PARAM::INFO> paramInfos;
779 paramInfo.
name =
"gain";
782 paramInfo.
unit = aGainUnit;
784 paramInfos.push_back( paramInfo );
786 paramInfo.
name =
"ic";
789 paramInfo.
unit =
"V";
790 paramInfo.
description =
"Initial condition of controlling source (ic)";
791 paramInfos.push_back( paramInfo );
798 const std::string& aQuantity,
799 const std::string& aUnit )
801 std::vector<PARAM::INFO> paramInfos;
804 paramInfo.
name =
"pwl";
806 paramInfo.
unit =
"s," + aUnit;
809 paramInfo.
description = aUnit ==
"V" ?
"Time-voltage points" :
"Time-current points";
810 paramInfos.push_back( paramInfo );
873 const std::string& aUnit )
875 std::vector<PARAM::INFO> paramInfos;
878 paramInfo.
name =
"rms";
880 paramInfo.
unit = aUnit;
883 paramInfo.
description =
"White noise RMS amplitude";
884 paramInfos.push_back( paramInfo );
886 paramInfo.
name =
"dt";
888 paramInfo.
unit =
"s";
892 paramInfos.push_back( paramInfo );
901 const std::string& aUnit )
903 std::vector<PARAM::INFO> paramInfos;
906 paramInfo.
name =
"rms";
912 paramInfos.push_back( paramInfo );
914 paramInfo.
name =
"slope";
920 paramInfos.push_back( paramInfo );
922 paramInfo.
name =
"dt";
924 paramInfo.
unit =
"s";
928 paramInfos.push_back( paramInfo );
937 const std::string& aUnit )
939 std::vector<PARAM::INFO> paramInfos;
942 paramInfo.
name =
"ampl";
944 paramInfo.
unit = aUnit;
948 paramInfos.push_back( paramInfo );
950 paramInfo.
name =
"tcapt";
952 paramInfo.
unit =
"s";
955 paramInfo.
description =
"Burst noise trap capture time";
956 paramInfos.push_back( paramInfo );
958 paramInfo.
name =
"temit";
960 paramInfo.
unit =
"s";
963 paramInfo.
description =
"Burst noise trap emission time";
964 paramInfos.push_back( paramInfo );
973 const std::string& aUnit )
975 std::vector<PARAM::INFO> paramInfos;
978 paramInfo.
name =
"min";
980 paramInfo.
unit = aUnit;
984 paramInfos.push_back( paramInfo );
986 paramInfo.
name =
"max";
988 paramInfo.
unit = aUnit;
992 paramInfos.push_back( paramInfo );
994 paramInfo.
name =
"dt";
996 paramInfo.
unit =
"s";
1000 paramInfos.push_back( paramInfo );
1002 paramInfo.
name =
"td";
1004 paramInfo.
unit =
"s";
1008 paramInfos.push_back( paramInfo );
1017 const std::string& aUnit )
1019 std::vector<PARAM::INFO> paramInfos;
1022 paramInfo.
name =
"mean";
1024 paramInfo.
unit = aUnit;
1028 paramInfos.push_back( paramInfo );
1030 paramInfo.
name =
"stddev";
1032 paramInfo.
unit = aUnit;
1036 paramInfos.push_back( paramInfo );
1038 paramInfo.
name =
"dt";
1040 paramInfo.
unit =
"s";
1044 paramInfos.push_back( paramInfo );
1046 paramInfo.
name =
"td";
1048 paramInfo.
unit =
"s";
1052 paramInfos.push_back( paramInfo );
1061 const std::string& aUnit )
1063 std::vector<PARAM::INFO> paramInfos;
1066 paramInfo.
name =
"offset";
1068 paramInfo.
unit = aUnit;
1072 paramInfos.push_back( paramInfo );
1074 paramInfo.
name =
"mean";
1076 paramInfo.
unit = aUnit;
1080 paramInfos.push_back( paramInfo );
1082 paramInfo.
name =
"dt";
1084 paramInfo.
unit =
"s";
1088 paramInfos.push_back( paramInfo );
1090 paramInfo.
name =
"td";
1092 paramInfo.
unit =
"s";
1096 paramInfos.push_back( paramInfo );
1105 const std::string& aUnit )
1107 std::vector<PARAM::INFO> paramInfos;
1110 paramInfo.
name =
"offset";
1112 paramInfo.
unit = aUnit;
1116 paramInfos.push_back( paramInfo );
1118 paramInfo.
name =
"lambda";
1120 paramInfo.
unit = aUnit;
1124 paramInfos.push_back( paramInfo );
1126 paramInfo.
name =
"dt";
1128 paramInfo.
unit =
"s";
1132 paramInfos.push_back( paramInfo );
1134 paramInfo.
name =
"td";
1136 paramInfo.
unit =
"s";
1140 paramInfos.push_back( paramInfo );
1151 paramInfo.
name =
"ac";
1153 paramInfo.
unit = aUnit;
1157 aParamInfos.push_back( paramInfo );
1159 paramInfo.
name =
"ph";
1161 paramInfo.
unit =
"°";
1165 aParamInfos.push_back( paramInfo );
1169 const std::string& aUnit )
1173 if( !strcmp( aUnit.c_str(),
"V" ) )
1175 paramInfo.
name =
"portnum";
1177 paramInfo.
unit =
"";
1181 aParamInfos.push_back( paramInfo );
1183 paramInfo.
name =
"z0";
1185 paramInfo.
unit =
"Ohm";
1189 aParamInfos.push_back( paramInfo );
1197 return {
"+",
"-",
"C+",
"C-" };
1199 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)
static void appendSpParamInfos(std::vector< PARAM::INFO > &aParamInfos, const std::string &aUnit)
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