Sim: Fix inference of RLC models with garbage suffixes

Garbage suffix is e.g. the "F" in "100uF".
This commit is contained in:
Mikolaj Wielgus 2022-08-08 17:04:37 +02:00
parent f0c58ccdc1
commit 5096f5d8a9
4 changed files with 37 additions and 4 deletions

View File

@ -62,6 +62,14 @@ namespace SIM_MODEL_GRAMMAR
quotedStringContent,
one<'"'>> {};
struct fieldFloatValue : seq<star<space>,
number<SIM_VALUE::TYPE_FLOAT, NOTATION::SI>,
star<not_at<space>, any>, // Garbage suffix.
star<space>> {};
struct fieldFloatValueGrammar : must<fieldFloatValue,
tao::pegtl::eof> {};
struct param : plus<alnum> {};
struct fieldParamValuePair : seq<param,

View File

@ -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;

View File

@ -68,8 +68,6 @@ void SIM_MODEL_SUBCKT::ReadSpiceCode( const std::string& aSpiceCode )
THROW_IO_ERROR( e.what() );
}
wxASSERT( root );
for( const auto& node : root->children )
{
if( node->is_type<SIM_MODEL_SUBCKT_SPICE_PARSER::dotSubckt>() )

View File

@ -193,7 +193,7 @@ namespace SIM_VALUE_GRAMMAR
struct garbageSuffix;
template <> struct garbageSuffix<NOTATION::SI> : seq<> {};
template <> struct garbageSuffix<NOTATION::SPICE> : star<alnum> {};
template <> struct garbageSuffix<NOTATION::SPICE> : star<alpha> {};
template <SIM_VALUE::TYPE ValueType, NOTATION Notation>