|
|
@ -23,10 +23,22 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
#include <sim/sim_model_ideal.h>
|
|
|
|
#include <tao/pegtl.hpp>
|
|
|
|
#include <tao/pegtl/contrib/parse_tree.hpp>
|
|
|
|
|
|
|
|
using PARAM = SIM_MODEL::PARAM; |
|
|
|
|
|
|
|
|
|
|
|
namespace SIM_MODEL_PARSER |
|
|
|
{ |
|
|
|
using namespace SIM_MODEL_GRAMMAR; |
|
|
|
|
|
|
|
template <typename Rule> struct fieldFloatValueSelector : std::false_type {}; |
|
|
|
template <> struct fieldFloatValueSelector<number<SIM_VALUE::TYPE_FLOAT, NOTATION::SI>> |
|
|
|
: std::true_type {}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
SIM_MODEL_IDEAL::SIM_MODEL_IDEAL( TYPE aType ) |
|
|
|
: SIM_MODEL( aType ), |
|
|
|
m_isInferred( false ) |
|
|
@ -111,9 +123,24 @@ void SIM_MODEL_IDEAL::inferredReadDataFields( unsigned aSymbolPinCount, const st |
|
|
|
if( InferTypeFromRefAndValue( GetFieldValue( aFields, REFERENCE_FIELD ), |
|
|
|
GetFieldValue( aFields, VALUE_FIELD ) ) == GetType() ) |
|
|
|
{ |
|
|
|
if( !SetParamValue( 0, GetFieldValue( aFields, VALUE_FIELD ) ) ) |
|
|
|
try |
|
|
|
{ |
|
|
|
wxString value = GetFieldValue( aFields, VALUE_FIELD ); |
|
|
|
|
|
|
|
tao::pegtl::string_input<> in( value.ToStdString(), "Value" ); |
|
|
|
auto root = tao::pegtl::parse_tree::parse< |
|
|
|
SIM_MODEL_PARSER::fieldFloatValueGrammar, |
|
|
|
SIM_MODEL_PARSER::fieldFloatValueSelector> |
|
|
|
( in ); |
|
|
|
|
|
|
|
// The grammar and selector must guarantee having at least one child.
|
|
|
|
SetParamValue( 0, root->children[0]->string() ); |
|
|
|
} |
|
|
|
catch( const tao::pegtl::parse_error& e ) |
|
|
|
{ |
|
|
|
THROW_IO_ERROR( wxString::Format( _( "Failed to infer model from Value '%s'" ), |
|
|
|
GetFieldValue( aFields, VALUE_FIELD ) ) ); |
|
|
|
} |
|
|
|
|
|
|
|
m_isInferred = true; |
|
|
|
return; |
|
|
|