diff --git a/eeschema/sim/sim_model.cpp b/eeschema/sim/sim_model.cpp index 14157495e5..0c3cbf80a1 100644 --- a/eeschema/sim/sim_model.cpp +++ b/eeschema/sim/sim_model.cpp @@ -794,11 +794,9 @@ bool SIM_MODEL::PARAM::INFO::Matches( const std::string& aParamName ) const int SIM_MODEL::doFindParam( const std::string& aParamName ) const { - std::vector> params = GetParams(); - - for( int ii = 0; ii < (int) params.size(); ++ii ) + for( int ii = 0; ii < (int) GetParamCount(); ++ii ) { - if( params[ii].get().Matches( aParamName ) ) + if( GetParam( ii ).Matches( aParamName ) ) return ii; } @@ -814,17 +812,6 @@ const SIM_MODEL::PARAM* SIM_MODEL::FindParam( const std::string& aParamName ) co } -std::vector> SIM_MODEL::GetParams() const -{ - std::vector> params; - - for( int i = 0; i < GetParamCount(); ++i ) - params.emplace_back( GetParam( i ) ); - - return params; -} - - const SIM_MODEL::PARAM& SIM_MODEL::GetParamOverride( unsigned aParamIndex ) const { return m_params.at( aParamIndex ); diff --git a/eeschema/sim/sim_model.h b/eeschema/sim/sim_model.h index 2642dd6c05..5615847b36 100644 --- a/eeschema/sim/sim_model.h +++ b/eeschema/sim/sim_model.h @@ -485,8 +485,6 @@ public: const PARAM* FindParam( const std::string& aParamName ) const; - std::vector> GetParams() const; - const PARAM& GetParamOverride( unsigned aParamIndex ) const; // Return the actual parameter. const PARAM& GetBaseParam( unsigned aParamIndex ) const; // Always return base parameter if it exists. diff --git a/eeschema/sim/sim_model_ibis.cpp b/eeschema/sim/sim_model_ibis.cpp index 63d7b5d4b3..7e45c1c949 100644 --- a/eeschema/sim/sim_model_ibis.cpp +++ b/eeschema/sim/sim_model_ibis.cpp @@ -40,13 +40,6 @@ std::string SPICE_GENERATOR_IBIS::ModelLine( const SPICE_ITEM& aItem ) const return ""; } -std::vector> SPICE_GENERATOR_IBIS::GetInstanceParams() const -{ - std::vector> vec; - return vec; -} - - std::vector SPICE_GENERATOR_IBIS::CurrentNames( const SPICE_ITEM& aItem ) const { std::vector currentNames; @@ -278,9 +271,9 @@ SIM_MODEL_IBIS::SIM_MODEL_IBIS( TYPE aType, const SIM_MODEL_IBIS& aSource ) : { for( PARAM& param1 : m_params ) { - for( auto& param2refwrap : aSource.GetParams() ) + for( int ii = 0; ii < aSource.GetParamCount(); ++ii ) { - const PARAM& param2 = param2refwrap.get(); + const PARAM& param2 = aSource.GetParam( ii ); if( param1.info.name == param2.info.name ) param1.value = param2.value; diff --git a/eeschema/sim/sim_model_ibis.h b/eeschema/sim/sim_model_ibis.h index e35d5a004a..eb70708a5f 100644 --- a/eeschema/sim/sim_model_ibis.h +++ b/eeschema/sim/sim_model_ibis.h @@ -44,9 +44,6 @@ public: std::string IbisDevice( const SPICE_ITEM& aItem, const PROJECT& aProject, const wxString& aCacheDir, REPORTER& aReporter ) const; - -protected: - std::vector> GetInstanceParams() const override; }; class SIM_MODEL_IBIS : public SIM_MODEL diff --git a/eeschema/sim/sim_model_l_mutual.cpp b/eeschema/sim/sim_model_l_mutual.cpp index 3b693b1025..f460a286ca 100644 --- a/eeschema/sim/sim_model_l_mutual.cpp +++ b/eeschema/sim/sim_model_l_mutual.cpp @@ -29,8 +29,15 @@ std::string SPICE_GENERATOR_L_MUTUAL::ItemParams() const { std::string result; - for( const SIM_MODEL::PARAM& param : GetInstanceParams() ) + for( int ii = 0; ii < m_model.GetParamCount(); ++ii ) + { + const SIM_MODEL::PARAM& param = m_model.GetParam( ii ); + + if( !param.info.isSpiceInstanceParam ) + continue; + result.append( " " + SIM_VALUE::ToSpice( param.value ) ); + } return result; } diff --git a/eeschema/sim/sim_model_ngspice.cpp b/eeschema/sim/sim_model_ngspice.cpp index 19a5af27fd..1c57689db1 100644 --- a/eeschema/sim/sim_model_ngspice.cpp +++ b/eeschema/sim/sim_model_ngspice.cpp @@ -85,11 +85,9 @@ int SIM_MODEL_NGSPICE::doFindParam( const std::string& aParamName ) const { // Special case to allow escaped model parameters (suffixed with "_") - std::vector> params = GetParams(); - - for( int ii = 0; ii < (int) params.size(); ++ii ) + for( int ii = 0; ii < (int) GetParamCount(); ++ii ) { - const PARAM& param = params[ii]; + const PARAM& param = GetParam( ii ); if( param.Matches( aParamName ) || param.Matches( aParamName + "_" ) ) return ii; @@ -111,16 +109,29 @@ void SIM_MODEL_NGSPICE::SetParamFromSpiceCode( const std::string& aParamName, // First we try to use the name as is. Note that you can't set instance parameters from this // function, it's for ".model" cards, not for instantiations. - std::vector> params = GetParams(); - - for( int ii = 0; ii < (int) params.size(); ++ii ) + for( int ii = 0; ii < (int) GetParamCount(); ++ii ) { - const PARAM& param = params[ii]; + const PARAM& param = GetParam(ii); if( param.info.isSpiceInstanceParam || param.info.category == PARAM::CATEGORY::SUPERFLUOUS ) continue; - if( param.Matches( aParamName ) || param.Matches( aParamName + "_" ) ) + if( param.Matches( aParamName ) ) + { + SetParamValue( ii, aValue, aNotation ); + return; + } + } + + for( int ii = 0; ii < (int) GetParamCount(); ++ii ) + { + const PARAM& param = GetParam(ii); + + if( param.info.isSpiceInstanceParam || param.info.category == PARAM::CATEGORY::SUPERFLUOUS ) + continue; + + if( param.info.name.ends_with( "_" ) + && boost::iequals( param.info.name, aParamName + "_" ) ) { SetParamValue( ii, aValue, aNotation ); return; @@ -138,9 +149,9 @@ void SIM_MODEL_NGSPICE::SetParamFromSpiceCode( const std::string& aParamName, { // Find an actual parameter with the same id. Even if the ngspiceParam was // superfluous, its alias target might not be. - for( int ii = 0; ii < (int) params.size(); ++ii ) + for( int ii = 0; ii < (int) GetParamCount(); ++ii ) { - const PARAM::INFO& paramInfo = params[ii].get().info; + const PARAM::INFO& paramInfo = GetParam( ii ).info; if( paramInfo.category == PARAM::CATEGORY::SUPERFLUOUS ) continue; diff --git a/eeschema/sim/sim_model_raw_spice.cpp b/eeschema/sim/sim_model_raw_spice.cpp index c504f12315..a15935cf13 100644 --- a/eeschema/sim/sim_model_raw_spice.cpp +++ b/eeschema/sim/sim_model_raw_spice.cpp @@ -101,8 +101,13 @@ std::string SPICE_GENERATOR_RAW_SPICE::ItemParams() const { std::string result; - for( const SIM_MODEL::PARAM& param : GetInstanceParams() ) + for( int ii = 0; ii < m_model.GetParamCount(); ++ii ) { + const SIM_MODEL::PARAM& param = m_model.GetParam( ii ); + + if( !param.info.isSpiceInstanceParam ) + continue; + if( param.info.name == "model" ) result.append( " " + SIM_VALUE::ToSpice( param.value ) ); } diff --git a/eeschema/sim/sim_model_source.cpp b/eeschema/sim/sim_model_source.cpp index 3080c649d6..b0b7496532 100644 --- a/eeschema/sim/sim_model_source.cpp +++ b/eeschema/sim/sim_model_source.cpp @@ -175,8 +175,10 @@ std::string SPICE_GENERATOR_SOURCE::ItemLine( const SPICE_ITEM& aItem ) const break; default: - for( const SIM_MODEL::PARAM& param : m_model.GetParams() ) + for( int ii = 0; ii < m_model.GetParamCount(); ++ii ) { + const SIM_MODEL::PARAM& param = m_model.GetParam( ii ); + if( ac != "" && ( param.Matches( "ac" ) || param.Matches( "ph" ) ) ) continue; diff --git a/eeschema/sim/sim_model_spice_fallback.cpp b/eeschema/sim/sim_model_spice_fallback.cpp index 320a44d99e..8b8be5734b 100644 --- a/eeschema/sim/sim_model_spice_fallback.cpp +++ b/eeschema/sim/sim_model_spice_fallback.cpp @@ -31,8 +31,8 @@ SIM_MODEL_SPICE_FALLBACK::SIM_MODEL_SPICE_FALLBACK( TYPE aType, const std::strin // Create the model we *should* have had to copy its parameter list std::unique_ptr model = SIM_MODEL::Create( aType ); - for( const SIM_MODEL::PARAM& param : model->GetParams() ) - AddParam( param.info ); + for( int ii = 0; ii < GetParamCount(); ++ii ) + AddParam( GetParam( ii ).info ); m_spiceCode = aRawSpiceCode; } @@ -66,11 +66,9 @@ int SIM_MODEL_SPICE_FALLBACK::doFindParam( const std::string& aParamName ) const { // Special case to allow escaped model parameters (suffixed with "_") - std::vector> params = GetParams(); - - for( int ii = 0; ii < (int) params.size(); ++ii ) + for( int ii = 0; ii < GetParamCount(); ++ii ) { - const PARAM& param = params[ii]; + const SIM_MODEL::PARAM& param = GetParam( ii ); if( param.Matches( aParamName ) || param.Matches( aParamName + "_" ) ) return ii; diff --git a/eeschema/sim/sim_model_subckt.cpp b/eeschema/sim/sim_model_subckt.cpp index 68be2da010..9828e11512 100644 --- a/eeschema/sim/sim_model_subckt.cpp +++ b/eeschema/sim/sim_model_subckt.cpp @@ -151,8 +151,8 @@ void SIM_MODEL_SUBCKT::SetBaseModel( const SIM_MODEL& aBaseModel ) AddPin( pin ); // Same for parameters. - for( const PARAM& param : GetBaseModel()->GetParams() ) - AddParam( param.info ); + for( int ii = 0; ii < GetBaseModel()->GetParamCount(); ++ii ) + AddParam( GetBaseModel()->GetParam( ii ).info ); } diff --git a/eeschema/sim/sim_model_switch.cpp b/eeschema/sim/sim_model_switch.cpp index f02dfe73b8..83bb78c59b 100644 --- a/eeschema/sim/sim_model_switch.cpp +++ b/eeschema/sim/sim_model_switch.cpp @@ -66,8 +66,13 @@ std::string SPICE_GENERATOR_SWITCH::ItemParams() const { std::string result; - for( const SIM_MODEL::PARAM& param : GetInstanceParams() ) + for( int ii = 0; ii < m_model.GetParamCount(); ++ii ) { + const SIM_MODEL::PARAM& param = m_model.GetParam( ii ); + + if( !param.info.isSpiceInstanceParam ) + continue; + // The only instance param is "ic", which is positional. std::string value = param.value; diff --git a/eeschema/sim/sim_value.cpp b/eeschema/sim/sim_value.cpp index 7dc2350360..e80fcec8b8 100644 --- a/eeschema/sim/sim_value.cpp +++ b/eeschema/sim/sim_value.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #define CALL_INSTANCE( ValueType, Notation, func, ... ) \ @@ -370,6 +371,13 @@ std::string SIM_VALUE::ConvertNotation( const std::string& aString, NOTATION aFr NOTATION aToNotation ) { wxString buf( aString ); + + // PEGTL is slow as shit. Avoid if possible. + static const wxRegEx plainNumber( wxS( "^[0-9.]*$" ) ); + + if( plainNumber.Matches( buf ) ) + return aString; + buf.Replace( ',', '.' ); SIM_VALUE_PARSER::PARSE_RESULT parseResult = SIM_VALUE_PARSER::Parse( buf.ToStdString(), diff --git a/eeschema/sim/spice_generator.cpp b/eeschema/sim/spice_generator.cpp index 68d3e51413..8f796335ad 100644 --- a/eeschema/sim/spice_generator.cpp +++ b/eeschema/sim/spice_generator.cpp @@ -62,8 +62,10 @@ std::string SPICE_GENERATOR::ModelLine( const SPICE_ITEM& aItem ) const result.append( "\n" ); - for( const SIM_MODEL::PARAM& param : m_model.GetParams() ) + for( int ii = 0; ii < m_model.GetParamCount(); ++ii ) { + const SIM_MODEL::PARAM& param = m_model.GetParam( ii ); + if( param.info.isSpiceInstanceParam ) continue; @@ -181,8 +183,13 @@ std::string SPICE_GENERATOR::ItemParams() const { std::string result; - for( const SIM_MODEL::PARAM& param : GetInstanceParams() ) + for( int ii = 0; ii < m_model.GetParamCount(); ++ii ) { + const SIM_MODEL::PARAM& param = m_model.GetParam( ii ); + + if( !param.info.isSpiceInstanceParam ) + continue; + std::string name = param.info.spiceInstanceName.empty() ? param.info.name : param.info.spiceInstanceName; std::string value = SIM_VALUE::ToSpice( param.value ); @@ -230,17 +237,3 @@ std::string SPICE_GENERATOR::Preview( const SPICE_ITEM& aItem ) const } -std::vector> SPICE_GENERATOR::GetInstanceParams() const -{ - std::vector> instanceParams; - - for( const SIM_MODEL::PARAM& param : m_model.GetParams() ) - { - if( param.info.isSpiceInstanceParam ) - instanceParams.emplace_back( param ); - } - - return instanceParams; -} - - diff --git a/eeschema/sim/spice_generator.h b/eeschema/sim/spice_generator.h index 8062f50d39..541075e78a 100644 --- a/eeschema/sim/spice_generator.h +++ b/eeschema/sim/spice_generator.h @@ -70,8 +70,6 @@ protected: return m_model.GetPins(); } - virtual std::vector> GetInstanceParams() const; - const SIM_MODEL& m_model; }; diff --git a/eeschema/sim/spice_model_parser.cpp b/eeschema/sim/spice_model_parser.cpp index 8280bb04f0..fbd244779e 100644 --- a/eeschema/sim/spice_model_parser.cpp +++ b/eeschema/sim/spice_model_parser.cpp @@ -292,9 +292,6 @@ SIM_MODEL::TYPE SPICE_MODEL_PARSER::ReadTypeFromSpiceStrings( const std::string& for( SIM_MODEL::TYPE candidate : SIM_MODEL::TYPE_ITERATOR() ) { wxString candidate_type = SIM_MODEL::SpiceInfo( candidate ).modelType; - wxString candidate_level = SIM_MODEL::SpiceInfo( candidate ).level; - wxString candidate_version = SIM_MODEL::SpiceInfo( candidate ).version; - bool candidate_isDefaultLevel = SIM_MODEL::SpiceInfo( candidate ).isDefaultLevel; if( candidate_type.IsEmpty() ) continue; @@ -308,16 +305,16 @@ SIM_MODEL::TYPE SPICE_MODEL_PARSER::ReadTypeFromSpiceStrings( const std::string& } else if( input_type.StartsWith( candidate_type ) ) { - if( candidate_version != aVersion ) + if( SIM_MODEL::SpiceInfo( candidate ).version != aVersion ) continue; - if( candidate_level == input_level ) + if( SIM_MODEL::SpiceInfo( candidate ).level == input_level ) return candidate; if( aSkipDefaultLevel ) continue; - if( candidate_isDefaultLevel && aLevel == "" ) + if( SIM_MODEL::SpiceInfo( candidate ).isDefaultLevel && aLevel == "" ) return candidate; } }