From bd809bf31cd982040cdf32bd970fdfd447bd8951 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Thu, 11 Aug 2022 02:42:16 +0200 Subject: [PATCH] Sim: Fix reading the legacy Spice_Node_Sequence field --- eeschema/sim/sim_model.cpp | 27 +++++++------ eeschema/sim/sim_model.h | 13 ++++++- eeschema/sim/sim_model_spice.cpp | 67 +++++++++++++++++++++++--------- eeschema/sim/sim_model_spice.h | 4 ++ 4 files changed, 81 insertions(+), 30 deletions(-) diff --git a/eeschema/sim/sim_model.cpp b/eeschema/sim/sim_model.cpp index 7024470f41..452bed0207 100644 --- a/eeschema/sim/sim_model.cpp +++ b/eeschema/sim/sim_model.cpp @@ -1192,6 +1192,21 @@ SIM_MODEL::SIM_MODEL( TYPE aType ) : m_baseModel( nullptr ), m_type( aType ), } +void SIM_MODEL::CreatePins( unsigned aSymbolPinCount ) +{ + // Default pin sequence: model pins are the same as symbol pins. + // Excess model pins are set as Not Connected. + // Note that intentionally nothing is added if `getPinNames()` returns an empty vector. + for( unsigned i = 0; i < getPinNames().size(); ++i ) + { + if( i < aSymbolPinCount ) + AddPin( { getPinNames().at( i ), i + 1 } ); + else + AddPin( { getPinNames().at( i ), PIN::NOT_CONNECTED } ); + } +} + + template void SIM_MODEL::WriteInferredDataFields( std::vector& aFields, const wxString& aValue ) const; template void SIM_MODEL::WriteInferredDataFields( std::vector& aFields, @@ -1314,21 +1329,11 @@ void SIM_MODEL::ParseParamsField( const wxString& aParamsField ) void SIM_MODEL::ParsePinsField( unsigned aSymbolPinCount, const wxString& aPinsField ) { - // Default pin sequence: model pins are the same as symbol pins. - // Excess model pins are set as Not Connected. - for( unsigned i = 0; i < getPinNames().size(); ++i ) - { - if( i < aSymbolPinCount ) - AddPin( { getPinNames().at( i ), i + 1 } ); - else - AddPin( { getPinNames().at( i ), PIN::NOT_CONNECTED } ); - } + CreatePins( aSymbolPinCount ); if( aPinsField == "" ) return; - LOCALE_IO toggle; - tao::pegtl::string_input<> in( aPinsField.ToUTF8(), PINS_FIELD ); std::unique_ptr root; diff --git a/eeschema/sim/sim_model.h b/eeschema/sim/sim_model.h index 581534b3c8..3cf73ab767 100644 --- a/eeschema/sim/sim_model.h +++ b/eeschema/sim/sim_model.h @@ -46,8 +46,16 @@ namespace SIM_MODEL_GRAMMAR struct sep : plus {}; + struct legacyPinNumber : digits {}; + struct legacyPinSequence : seq, + star> {}; + + struct legacyPinSequenceGrammar : must {}; + + struct pinNumber : sor> {}; - struct pinSequence : opt, star> {}; @@ -70,6 +78,7 @@ namespace SIM_MODEL_GRAMMAR struct fieldFloatValueGrammar : must {}; + struct param : plus {}; struct fieldParamValuePair : seq void WriteInferredDataFields( std::vector& aFields, const wxString& aValue ) const; diff --git a/eeschema/sim/sim_model_spice.cpp b/eeschema/sim/sim_model_spice.cpp index 21d2d2dc77..f808f81e42 100644 --- a/eeschema/sim/sim_model_spice.cpp +++ b/eeschema/sim/sim_model_spice.cpp @@ -25,7 +25,15 @@ #include #include #include -#include + + +namespace SIM_MODEL_SPICE_PARSER +{ + using namespace SIM_MODEL_GRAMMAR; + + template struct legacyPinSequenceSelector : std::false_type {}; + template <> struct legacyPinSequenceSelector : std::true_type {}; +} SIM_MODEL_SPICE::SIM_MODEL_SPICE( TYPE aType ) @@ -38,25 +46,17 @@ SIM_MODEL_SPICE::SIM_MODEL_SPICE( TYPE aType ) } -void SIM_MODEL_SPICE::ReadDataSchFields( unsigned aSymbolPinCount, const std::vector* aFields ) +void SIM_MODEL_SPICE::ReadDataSchFields( unsigned aSymbolPinCount, + const std::vector* aFields ) { - LOCALE_IO toggle; - - for( unsigned i = 0; i < aSymbolPinCount; ++i ) - AddPin( { wxString::Format( "%d", i + 1 ), i + 1 } ); - SIM_MODEL::ReadDataSchFields( aSymbolPinCount, aFields ); readLegacyDataFields( aSymbolPinCount, aFields ); } -void SIM_MODEL_SPICE::ReadDataLibFields( unsigned aSymbolPinCount, const std::vector* aFields ) +void SIM_MODEL_SPICE::ReadDataLibFields( unsigned aSymbolPinCount, + const std::vector* aFields ) { - LOCALE_IO toggle; - - for( unsigned i = 0; i < aSymbolPinCount; ++i ) - AddPin( { wxString::Format( "%d", i + 1 ), i + 1 } ); - SIM_MODEL::ReadDataLibFields( aSymbolPinCount, aFields ); readLegacyDataFields( aSymbolPinCount, aFields ); } @@ -121,6 +121,13 @@ wxString SIM_MODEL_SPICE::GenerateSpiceItemLine( const wxString& aRefName, } +void SIM_MODEL_SPICE::CreatePins( unsigned aSymbolPinCount ) +{ + for( unsigned i = 0; i < aSymbolPinCount; ++i ) + AddPin( { "", PIN::NOT_CONNECTED } ); +} + + bool SIM_MODEL_SPICE::SetParamFromSpiceCode( const wxString& aParamName, const wxString& aParamValue, SIM_VALUE_GRAMMAR::NOTATION aNotation ) @@ -206,31 +213,55 @@ void SIM_MODEL_SPICE::readLegacyDataFields( unsigned aSymbolPinCount, const std: { // Fill in the blanks with the legacy parameters. - if( GetParam( static_cast( SPICE_PARAM::TYPE ) ).value->ToString().IsEmpty() ) + if( GetParam( static_cast( SPICE_PARAM::TYPE ) ).value->ToString() == "" ) { SetParamValue( static_cast( SPICE_PARAM::TYPE ), GetFieldValue( aFields, LEGACY_TYPE_FIELD ) ); } if( GetFieldValue( aFields, PINS_FIELD ) == "" ) - ParsePinsField( aSymbolPinCount, GetFieldValue( aFields, LEGACY_PINS_FIELD ) ); + parseLegacyPinsField( aSymbolPinCount, GetFieldValue( aFields, LEGACY_PINS_FIELD ) ); - if( GetParam( static_cast( SPICE_PARAM::MODEL ) ).value->ToString().IsEmpty() ) + if( GetParam( static_cast( SPICE_PARAM::MODEL ) ).value->ToString() == "" ) { SetParamValue( static_cast( SPICE_PARAM::MODEL ), GetFieldValue( aFields, LEGACY_MODEL_FIELD ) ); } // If model param is still empty, then use Value field. - if( GetParam( static_cast( SPICE_PARAM::MODEL ) ).value->ToString().IsEmpty() ) + if( GetParam( static_cast( SPICE_PARAM::MODEL ) ).value->ToString() == "" ) { SetParamValue( static_cast( SPICE_PARAM::MODEL ), GetFieldValue( aFields, SIM_MODEL::VALUE_FIELD ) ); } - if( GetParam( static_cast( SPICE_PARAM::LIB ) ).value->ToString().IsEmpty() ) + if( GetParam( static_cast( SPICE_PARAM::LIB ) ).value->ToString() == "" ) { SetParamValue( static_cast( SPICE_PARAM::LIB ), GetFieldValue( aFields, LEGACY_LIB_FIELD ) ); } } + + +void SIM_MODEL_SPICE::parseLegacyPinsField( unsigned aSymbolPinCount, const wxString& aPinsField ) +{ + tao::pegtl::string_input<> in( aPinsField.ToUTF8(), PINS_FIELD ); + std::unique_ptr root; + + try + { + root = tao::pegtl::parse_tree::parse + ( in ); + } + catch( const tao::pegtl::parse_error& e ) + { + THROW_IO_ERROR( e.what() ); + } + + for( unsigned i = 0; i < root->children.size(); ++i ) + { + SetPinSymbolPinNumber( std::stoi( root->children.at( i )->string() ) - 1, + static_cast( i + 1 ) ); + } +} diff --git a/eeschema/sim/sim_model_spice.h b/eeschema/sim/sim_model_spice.h index 645a43c547..63151f83da 100644 --- a/eeschema/sim/sim_model_spice.h +++ b/eeschema/sim/sim_model_spice.h @@ -61,6 +61,8 @@ public: const std::vector& aPinNetNames ) const override; protected: + void CreatePins( unsigned aSymbolPinCount ) override; + bool SetParamFromSpiceCode( const wxString& aParamName, const wxString& aParamValue, SIM_VALUE_GRAMMAR::NOTATION aNotation = SIM_VALUE_GRAMMAR::NOTATION::SPICE ) override; @@ -71,6 +73,8 @@ private: template void readLegacyDataFields( unsigned aSymbolPinCount, const std::vector* aFields ); + void parseLegacyPinsField( unsigned aSymbolPinCount, const wxString& aPinsField ); + std::vector> m_paramInfos; };