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>>() )
115 case SIM_MODEL::TYPE::V_WHITENOISE:
116 case SIM_MODEL::TYPE::I_WHITENOISE:
119 args.append(
"0 0 0 0 0 " );
122 case SIM_MODEL::TYPE::V_PINKNOISE:
123 case SIM_MODEL::TYPE::I_PINKNOISE:
128 args.append(
"0 0 0 " );
131 case SIM_MODEL::TYPE::V_BURSTNOISE:
132 case SIM_MODEL::TYPE::I_BURSTNOISE:
133 args.append(
"0 0 0 0 " );
139 case SIM_MODEL::TYPE::V_RANDUNIFORM:
140 case SIM_MODEL::TYPE::I_RANDUNIFORM:
150 case SIM_MODEL::TYPE::V_RANDGAUSSIAN:
151 case SIM_MODEL::TYPE::I_RANDGAUSSIAN:
159 case SIM_MODEL::TYPE::V_RANDEXP:
160 case SIM_MODEL::TYPE::I_RANDEXP:
168 case SIM_MODEL::TYPE::V_RANDPOISSON:
169 case SIM_MODEL::TYPE::I_RANDPOISSON:
180 if( ac !=
"" && (
param.Matches(
"ac" ) ||
param.Matches(
"ph" ) ) )
186 args.append( argStr +
" " );
198 case SIM_MODEL::TYPE::V_VCL:
199 case SIM_MODEL::TYPE::I_VCL:
206 case SIM_MODEL::TYPE::V_CCL:
207 case SIM_MODEL::TYPE::I_CCL:
227 item.
modelName += fmt::format(
"AC {} {} ", ac, ph );
230 std::string portnum =
"";
237 item.
modelName += fmt::format(
"portnum {} ", portnum );
245 item.
modelName += fmt::format(
"z0 {} ", z0 );
258 const std::string& aDefaultValue )
const
260 std::string result =
"";
266 result = aDefaultValue;
287 for(
int paramIndex = aParamIndex; paramIndex <
GetParamCount(); ++paramIndex )
289 m_params.at( aParamIndex ).value =
"";
294 for(
int paramIndex = 0; paramIndex < aParamIndex; ++paramIndex )
299 wxString defaultValue =
m_params.at( aParamIndex ).info.defaultValue;
301 if( !defaultValue.ToDouble( &
dummy ) )
302 defaultValue = wxT(
"0" );
304 m_params.at( aParamIndex ).value = defaultValue;
365 case TYPE::V:
return vdc;
366 case TYPE::I:
return idc;
367 case TYPE::V_SIN:
return vsin;
368 case TYPE::I_SIN:
return isin;
369 case TYPE::V_PULSE:
return vpulse;
370 case TYPE::I_PULSE:
return ipulse;
371 case TYPE::V_EXP:
return vexp;
372 case TYPE::I_EXP:
return iexp;
373 case TYPE::V_AM:
return vam;
374 case TYPE::I_AM:
return iam;
375 case TYPE::V_SFFM:
return vsffm;
376 case TYPE::I_SFFM:
return isffm;
377 case TYPE::V_VCL:
return vcvs;
378 case TYPE::V_CCL:
return ccvs;
379 case TYPE::V_PWL:
return vpwl;
380 case TYPE::I_VCL:
return vccs;
381 case TYPE::I_CCL:
return cccs;
382 case TYPE::I_PWL:
return ipwl;
383 case TYPE::V_WHITENOISE:
return vwhitenoise;
384 case TYPE::I_WHITENOISE:
return iwhitenoise;
385 case TYPE::V_PINKNOISE:
return vpinknoise;
386 case TYPE::I_PINKNOISE:
return ipinknoise;
387 case TYPE::V_BURSTNOISE:
return vburstnoise;
388 case TYPE::I_BURSTNOISE:
return iburstnoise;
389 case TYPE::V_RANDUNIFORM:
return vrandomuniform;
390 case TYPE::I_RANDUNIFORM:
return irandomuniform;
391 case TYPE::V_RANDGAUSSIAN:
return vrandomnormal;
392 case TYPE::I_RANDGAUSSIAN:
return irandomnormal;
393 case TYPE::V_RANDEXP:
return vrandomexp;
394 case TYPE::I_RANDEXP:
return irandomexp;
395 case TYPE::V_RANDPOISSON:
return vrandompoisson;
396 case TYPE::I_RANDPOISSON:
return irandompoisson;
398 wxFAIL_MSG(
"Unhandled SIM_MODEL type in SIM_MODEL_SOURCE" );
399 static std::vector<SIM_MODEL::PARAM::INFO>
empty;
406 const std::string& aUnit )
408 std::vector<PARAM::INFO> paramInfos;
411 paramInfo.
name =
"dc";
413 paramInfo.
unit = aUnit;
417 paramInfos.push_back( paramInfo );
426 const std::string& aUnit )
428 std::vector<PARAM::INFO> paramInfos;
431 paramInfo.
name =
"dc";
433 paramInfo.
unit = aUnit;
437 paramInfos.push_back( paramInfo );
439 paramInfo.
name =
"ampl";
441 paramInfo.
unit = aUnit;
445 paramInfos.push_back( paramInfo );
447 paramInfo.
name =
"f";
449 paramInfo.
unit =
"Hz";
453 paramInfos.push_back( paramInfo );
455 paramInfo.
name =
"td";
457 paramInfo.
unit =
"s";
461 paramInfos.push_back( paramInfo );
463 paramInfo.
name =
"theta";
465 paramInfo.
unit =
"1/s";
469 paramInfos.push_back( paramInfo );
471 paramInfo.
name =
"phase";
473 paramInfo.
unit =
"°";
477 paramInfos.push_back( paramInfo );
486 const std::string& aUnit )
488 std::vector<PARAM::INFO> paramInfos;
491 paramInfo.
name = aPrefix +
"1";
493 paramInfo.
unit = aUnit;
497 paramInfos.push_back( paramInfo );
499 paramInfo.
name = aPrefix +
"2";
501 paramInfo.
unit = aUnit;
505 paramInfos.push_back( paramInfo );
507 paramInfo.
name =
"td";
509 paramInfo.
unit =
"s";
513 paramInfos.push_back( paramInfo );
515 paramInfo.
name =
"tr";
517 paramInfo.
unit =
"s";
521 paramInfos.push_back( paramInfo );
523 paramInfo.
name =
"tf";
525 paramInfo.
unit =
"s";
529 paramInfos.push_back( paramInfo );
531 paramInfo.
name =
"tw";
533 paramInfo.
unit =
"s";
537 paramInfos.push_back( paramInfo );
539 paramInfo.
name =
"per";
541 paramInfo.
unit =
"s";
545 paramInfos.push_back( paramInfo );
547 paramInfo.
name =
"np";
553 paramInfos.push_back( paramInfo );
562 const std::string& aUnit )
564 std::vector<PARAM::INFO> paramInfos;
567 paramInfo.
name = aPrefix +
"1";
569 paramInfo.
unit = aUnit;
573 paramInfos.push_back( paramInfo );
575 paramInfo.
name = aPrefix +
"2";
577 paramInfo.
unit = aUnit;
581 paramInfos.push_back( paramInfo );
583 paramInfo.
name =
"td1";
585 paramInfo.
unit =
"s";
589 paramInfos.push_back( paramInfo );
591 paramInfo.
name =
"tau1";
593 paramInfo.
unit =
"s";
597 paramInfos.push_back( paramInfo );
599 paramInfo.
name =
"td2";
601 paramInfo.
unit =
"s";
605 paramInfos.push_back( paramInfo );
607 paramInfo.
name =
"tau2";
609 paramInfo.
unit =
"s";
613 paramInfos.push_back( paramInfo );
622 const std::string& aUnit )
624 std::vector<PARAM::INFO> paramInfos;
627 paramInfo.
name =
"vo";
629 paramInfo.
unit = aUnit;
633 paramInfos.push_back( paramInfo );
635 paramInfo.
name =
"vmo";
637 paramInfo.
unit = aUnit;
640 paramInfo.
description =
"Modulation signal offset";
641 paramInfos.push_back( paramInfo );
643 paramInfo.
name =
"vma";
645 paramInfo.
unit = aUnit;
648 paramInfo.
description =
"Modulation signal amplitude";
649 paramInfos.push_back( paramInfo );
651 paramInfo.
name =
"fm";
653 paramInfo.
unit =
"Hz";
656 paramInfo.
description =
"Modulation signal frequency";
657 paramInfos.push_back( paramInfo );
659 paramInfo.
name =
"fc";
661 paramInfo.
unit =
"Hz";
664 paramInfo.
description =
"Carrier signal frequency";
665 paramInfos.push_back( paramInfo );
667 paramInfo.
name =
"td";
669 paramInfo.
unit =
"s";
673 paramInfos.push_back( paramInfo );
675 paramInfo.
name =
"phasem";
677 paramInfo.
unit =
"°";
681 paramInfos.push_back( paramInfo );
683 paramInfo.
name =
"phasec";
685 paramInfo.
unit =
"°";
689 paramInfos.push_back( paramInfo );
698 const std::string& aUnit )
700 std::vector<PARAM::INFO> paramInfos;
703 paramInfo.
name =
"vo";
705 paramInfo.
unit = aUnit;
709 paramInfos.push_back( paramInfo );
711 paramInfo.
name =
"va";
713 paramInfo.
unit = aUnit;
717 paramInfos.push_back( paramInfo );
719 paramInfo.
name =
"fm";
721 paramInfo.
unit =
"Hz";
725 paramInfos.push_back( paramInfo );
727 paramInfo.
name =
"mdi";
733 paramInfos.push_back( paramInfo );
735 paramInfo.
name =
"fc";
737 paramInfo.
unit =
"Hz";
741 paramInfos.push_back( paramInfo );
743 paramInfo.
name =
"phasem";
745 paramInfo.
unit =
"°";
749 paramInfos.push_back( paramInfo );
751 paramInfo.
name =
"phasec";
753 paramInfo.
unit =
"°";
757 paramInfos.push_back( paramInfo );
767 std::vector<PARAM::INFO> paramInfos;
770 paramInfo.
name =
"gain";
773 paramInfo.
unit = aGainUnit;
775 paramInfos.push_back( paramInfo );
777 paramInfo.
name =
"control";
781 paramInfo.
description =
"Controlling voltage source";
782 paramInfos.push_back( paramInfo );
790 std::vector<PARAM::INFO> paramInfos;
793 paramInfo.
name =
"gain";
796 paramInfo.
unit = aGainUnit;
798 paramInfos.push_back( paramInfo );
805 const std::string& aQuantity,
806 const std::string& aUnit )
808 std::vector<PARAM::INFO> paramInfos;
811 paramInfo.
name =
"pwl";
813 paramInfo.
unit =
"s," + aUnit;
816 paramInfo.
description = aUnit ==
"V" ?
"Time-voltage points" :
"Time-current points";
817 paramInfos.push_back( paramInfo );
880 const std::string& aUnit )
882 std::vector<PARAM::INFO> paramInfos;
885 paramInfo.
name =
"rms";
887 paramInfo.
unit = aUnit;
890 paramInfo.
description =
"White noise RMS amplitude";
891 paramInfos.push_back( paramInfo );
893 paramInfo.
name =
"dt";
895 paramInfo.
unit =
"s";
899 paramInfos.push_back( paramInfo );
908 const std::string& aUnit )
910 std::vector<PARAM::INFO> paramInfos;
913 paramInfo.
name =
"rms";
919 paramInfos.push_back( paramInfo );
921 paramInfo.
name =
"slope";
927 paramInfos.push_back( paramInfo );
929 paramInfo.
name =
"dt";
931 paramInfo.
unit =
"s";
935 paramInfos.push_back( paramInfo );
944 const std::string& aUnit )
946 std::vector<PARAM::INFO> paramInfos;
949 paramInfo.
name =
"ampl";
951 paramInfo.
unit = aUnit;
955 paramInfos.push_back( paramInfo );
957 paramInfo.
name =
"tcapt";
959 paramInfo.
unit =
"s";
962 paramInfo.
description =
"Burst noise trap capture time";
963 paramInfos.push_back( paramInfo );
965 paramInfo.
name =
"temit";
967 paramInfo.
unit =
"s";
970 paramInfo.
description =
"Burst noise trap emission time";
971 paramInfos.push_back( paramInfo );
980 const std::string& aUnit )
982 std::vector<PARAM::INFO> paramInfos;
985 paramInfo.
name =
"ts";
987 paramInfo.
unit =
"s";
990 paramInfo.
description =
"Individual voltage duration";
991 paramInfos.push_back( paramInfo );
993 paramInfo.
name =
"td";
995 paramInfo.
unit =
"s";
999 paramInfos.push_back( paramInfo );
1001 paramInfo.
name =
"range";
1003 paramInfo.
unit = aUnit;
1007 paramInfos.push_back( paramInfo );
1009 paramInfo.
name =
"offset";
1011 paramInfo.
unit = aUnit;
1015 paramInfos.push_back( paramInfo );
1024 const std::string& aUnit )
1026 std::vector<PARAM::INFO> paramInfos;
1029 paramInfo.
name =
"ts";
1031 paramInfo.
unit =
"s";
1034 paramInfo.
description =
"Individual voltage duration";
1035 paramInfos.push_back( paramInfo );
1037 paramInfo.
name =
"td";
1039 paramInfo.
unit =
"s";
1043 paramInfos.push_back( paramInfo );
1045 paramInfo.
name =
"stddev";
1047 paramInfo.
unit = aUnit;
1051 paramInfos.push_back( paramInfo );
1053 paramInfo.
name =
"mean";
1055 paramInfo.
unit = aUnit;
1059 paramInfos.push_back( paramInfo );
1068 const std::string& aUnit )
1070 std::vector<PARAM::INFO> paramInfos;
1073 paramInfo.
name =
"ts";
1075 paramInfo.
unit =
"s";
1078 paramInfo.
description =
"Individual voltage duration";
1079 paramInfos.push_back( paramInfo );
1081 paramInfo.
name =
"td";
1083 paramInfo.
unit =
"s";
1087 paramInfos.push_back( paramInfo );
1089 paramInfo.
name =
"mean";
1091 paramInfo.
unit = aUnit;
1095 paramInfos.push_back( paramInfo );
1097 paramInfo.
name =
"offset";
1099 paramInfo.
unit = aUnit;
1103 paramInfos.push_back( paramInfo );
1112 const std::string& aUnit )
1114 std::vector<PARAM::INFO> paramInfos;
1117 paramInfo.
name =
"ts";
1119 paramInfo.
unit =
"s";
1122 paramInfo.
description =
"Individual voltage duration";
1123 paramInfos.push_back( paramInfo );
1125 paramInfo.
name =
"td";
1127 paramInfo.
unit =
"s";
1131 paramInfos.push_back( paramInfo );
1133 paramInfo.
name =
"lambda";
1135 paramInfo.
unit = aUnit;
1139 paramInfos.push_back( paramInfo );
1141 paramInfo.
name =
"offset";
1143 paramInfo.
unit = aUnit;
1147 paramInfos.push_back( paramInfo );
1158 paramInfo.
name =
"ac";
1160 paramInfo.
unit = aUnit;
1164 aParamInfos.push_back( paramInfo );
1166 paramInfo.
name =
"ph";
1168 paramInfo.
unit =
"°";
1172 aParamInfos.push_back( paramInfo );
1176 const std::string& aUnit )
1180 if( !strcmp( aUnit.c_str(),
"V" ) )
1182 paramInfo.
name =
"portnum";
1184 paramInfo.
unit =
"";
1188 aParamInfos.push_back( paramInfo );
1190 paramInfo.
name =
"z0";
1192 paramInfo.
unit =
"Ohm";
1196 aParamInfos.push_back( paramInfo );
1204 return {
"+",
"-",
"C+",
"C-" };
1206 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 > makeAMParamInfos(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 > makeSFFMParamInfos(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::vector< FAB_LAYER_COLOR > dummy