|
|
|
@ -55,6 +55,11 @@ namespace SIM_MODEL_PARSER |
|
|
|
template <> struct fieldParamValuePairsSelector<unquotedString> : std::true_type {}; |
|
|
|
|
|
|
|
|
|
|
|
template <typename Rule> struct fieldFloatValueSelector : std::false_type {}; |
|
|
|
template <> struct fieldFloatValueSelector<number<SIM_VALUE::TYPE_FLOAT, NOTATION::SI>> |
|
|
|
: std::true_type {}; |
|
|
|
|
|
|
|
|
|
|
|
template <typename Rule> struct pinSequenceSelector : std::false_type {}; |
|
|
|
template <> struct pinSequenceSelector<pinNumber> : std::true_type {}; |
|
|
|
} |
|
|
|
@ -1316,7 +1321,7 @@ void SIM_MODEL::ParseParamsField( const wxString& aParamsField ) |
|
|
|
THROW_IO_ERROR( e.what() ); |
|
|
|
} |
|
|
|
|
|
|
|
wxString paramName = ""; |
|
|
|
wxString paramName; |
|
|
|
|
|
|
|
for( const auto& node : root->children ) |
|
|
|
{ |
|
|
|
@ -1516,26 +1521,52 @@ void SIM_MODEL::doReadDataFields( unsigned aSymbolPinCount, const std::vector<T> |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
void SIM_MODEL::InferredReadDataFields( unsigned aSymbolPinCount, const std::vector<T>* aFields ) |
|
|
|
void SIM_MODEL::InferredReadDataFields( unsigned aSymbolPinCount, const std::vector<T>* aFields, |
|
|
|
bool aAllowOnlyFirstValue, |
|
|
|
bool aAllowParamValuePairs ) |
|
|
|
{ |
|
|
|
ParsePinsField( aSymbolPinCount, GetFieldValue( aFields, PINS_FIELD ) ); |
|
|
|
|
|
|
|
if( InferTypeFromRefAndValue( GetFieldValue( aFields, REFERENCE_FIELD ), |
|
|
|
GetFieldValue( aFields, VALUE_FIELD ) ) == GetType() ) |
|
|
|
GetFieldValue( aFields, VALUE_FIELD ) ) != GetType() ) |
|
|
|
{ |
|
|
|
// Not an inferred model. Nothing to do here.
|
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
wxString valueField = GetFieldValue( aFields, VALUE_FIELD ); |
|
|
|
|
|
|
|
if( aAllowParamValuePairs ) // The usual param-value pairs have precedence.
|
|
|
|
{ |
|
|
|
ParseParamsField( GetFieldValue( aFields, VALUE_FIELD ) ); |
|
|
|
m_isInferred = true; |
|
|
|
try |
|
|
|
{ |
|
|
|
ParseParamsField( GetFieldValue( aFields, VALUE_FIELD ) ); |
|
|
|
} |
|
|
|
catch( const IO_ERROR& e ) |
|
|
|
{ |
|
|
|
if( aAllowOnlyFirstValue ) |
|
|
|
SetParamValue( 0, parseFieldFloatValue( valueField ) ); |
|
|
|
else |
|
|
|
throw e; |
|
|
|
} |
|
|
|
} |
|
|
|
else if( GetFieldValue( aFields, VALUE_FIELD ) == DeviceTypeInfo( GetDeviceType() ).fieldValue ) |
|
|
|
else if( aAllowOnlyFirstValue ) |
|
|
|
{ |
|
|
|
m_isInferred = true; |
|
|
|
// This is reached only when model allows only the first value.
|
|
|
|
SetParamValue( 0, parseFieldFloatValue( valueField ) ); |
|
|
|
} |
|
|
|
|
|
|
|
m_isInferred = true; |
|
|
|
} |
|
|
|
|
|
|
|
template void SIM_MODEL::InferredReadDataFields( unsigned aSymbolPinCount, |
|
|
|
const std::vector<SCH_FIELD>* aFields ); |
|
|
|
const std::vector<SCH_FIELD>* aFields, |
|
|
|
bool aAllowOnlyFirstValue, |
|
|
|
bool aAllowParamValuePairs ); |
|
|
|
template void SIM_MODEL::InferredReadDataFields( unsigned aSymbolPinCount, |
|
|
|
const std::vector<LIB_FIELD>* aFields ); |
|
|
|
const std::vector<LIB_FIELD>* aFields, |
|
|
|
bool aAllowOnlyFirstValue, |
|
|
|
bool aAllowParamValuePairs ); |
|
|
|
|
|
|
|
|
|
|
|
template <typename T> |
|
|
|
@ -1589,6 +1620,26 @@ wxString SIM_MODEL::generateDisabledField() const |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
wxString SIM_MODEL::parseFieldFloatValue( wxString aFieldFloatValue ) |
|
|
|
{ |
|
|
|
try |
|
|
|
{ |
|
|
|
tao::pegtl::string_input<> in( aFieldFloatValue.ToUTF8(), "Value" ); |
|
|
|
auto root = tao::pegtl::parse_tree::parse< |
|
|
|
SIM_MODEL_PARSER::fieldFloatValueGrammar, |
|
|
|
SIM_MODEL_PARSER::fieldFloatValueSelector> |
|
|
|
( in ); |
|
|
|
|
|
|
|
return root->children[0]->string(); |
|
|
|
} |
|
|
|
catch( const tao::pegtl::parse_error& ) |
|
|
|
{ |
|
|
|
THROW_IO_ERROR( wxString::Format( _( "Failed to infer model from Value '%s'" ), |
|
|
|
aFieldFloatValue ) ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool SIM_MODEL::requiresSpiceModel() const |
|
|
|
{ |
|
|
|
for( const PARAM& param : GetParams() ) |
|
|
|
|