From ba723d36c9c159a83ae8d8ab7357a820f3e0191a Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Wed, 14 Sep 2022 03:15:42 +0200 Subject: [PATCH] Sim: Don't generate .model line when there's no instance param overrides --- eeschema/sim/sim_model.cpp | 68 ++++++++++++---------- eeschema/sim/sim_model.h | 6 +- eeschema/sim/sim_model_mutual_inductor.cpp | 7 ++- eeschema/sim/sim_model_mutual_inductor.h | 2 +- eeschema/sim/sim_model_ngspice.h | 2 + eeschema/sim/sim_model_spice.cpp | 24 ++++++-- eeschema/sim/sim_model_spice.h | 6 +- eeschema/sim/sim_model_subckt.h | 2 +- eeschema/sim/sim_model_switch.cpp | 24 +++++--- eeschema/sim/sim_model_switch.h | 4 +- 10 files changed, 88 insertions(+), 57 deletions(-) diff --git a/eeschema/sim/sim_model.cpp b/eeschema/sim/sim_model.cpp index 84c66afbd6..018ad6610e 100644 --- a/eeschema/sim/sim_model.cpp +++ b/eeschema/sim/sim_model.cpp @@ -911,7 +911,7 @@ wxString SIM_MODEL::GenerateSpiceModelLine( const wxString& aModelName ) const { LOCALE_IO toggle; - if( !HasSpiceNonInstanceOverrides() && !requiresSpiceModel() ) + if( !HasSpiceNonInstanceOverrides() && !requiresSpiceModelLine() ) return ""; wxString result = ""; @@ -982,22 +982,10 @@ wxString SIM_MODEL::GenerateSpiceItemLine( const wxString& aRefName, const std::vector& aPinNetNames ) const { wxString result; - result << GenerateSpiceItemName( aRefName ) << " "; + result << GenerateSpiceItemName( aRefName ); result << GenerateSpiceItemPins( aRefName, aModelName, aSymbolPinNumbers, aPinNetNames ); - - if( requiresSpiceModel() ) - result << aModelName << " "; - - bool isFirst = false; - - for( const PARAM& param : GetParams() ) - { - if( !param.info.isSpiceInstanceParam ) - continue; - - result << GenerateSpiceItemParamValuePair( param, isFirst ); - } - + result << GenerateSpiceItemModelName( aModelName ); + result << GenerateSpiceItemParams(); result << "\n"; return result; } @@ -1102,12 +1090,26 @@ std::vector> SIM_MODEL::GetParams std::vector> params; for( int i = 0; i < GetParamCount(); ++i ) - params.push_back( GetParam( i ) ); + params.emplace_back( GetParam( i ) ); return params; } +std::vector> SIM_MODEL::GetSpiceInstanceParams() const +{ + std::vector> spiceInstanceParams; + + for( const PARAM& param : GetParams() ) + { + if( param.info.isSpiceInstanceParam ) + spiceInstanceParams.emplace_back( param ); + } + + return spiceInstanceParams; +} + + const SIM_MODEL::PARAM& SIM_MODEL::GetUnderlyingParam( unsigned aParamIndex ) const { return m_params.at( aParamIndex ); @@ -1252,12 +1254,12 @@ wxString SIM_MODEL::GenerateSpiceItemPins( const wxString& aRefName, if( it == aSymbolPinNumbers.end() ) { LOCALE_IO toggle; - result << wxString::Format( "NC-%s-%u ", aRefName, ncCounter++ ); + result << wxString::Format( " NC-%s-%u", aRefName, ncCounter++ ); } else { long symbolPinIndex = std::distance( aSymbolPinNumbers.begin(), it ); - result << aPinNetNames.at( symbolPinIndex ) << " "; + result << " " << aPinNetNames.at( symbolPinIndex ); } } @@ -1265,21 +1267,25 @@ wxString SIM_MODEL::GenerateSpiceItemPins( const wxString& aRefName, } -wxString SIM_MODEL::GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const +wxString SIM_MODEL::GenerateSpiceItemModelName( const wxString& aModelName ) const +{ + return " " + aModelName; +} + + +wxString SIM_MODEL::GenerateSpiceItemParams() const { wxString result; - if( aIsFirst ) - aIsFirst = false; - else - result << " "; + for( const PARAM& param : GetSpiceInstanceParams() ) + { + wxString name = ( param.info.spiceInstanceName == "" ) ? + param.info.name : param.info.spiceInstanceName; + wxString value = param.value->ToSpiceString(); - wxString name = ( aParam.info.spiceInstanceName == "" ) ? - aParam.info.name : aParam.info.spiceInstanceName; - wxString value = aParam.value->ToSpiceString(); - - if( value != "" ) - result << name << "=" << value; + if( value != "" ) + result << " " << name << "=" << value; + } return result; } @@ -1682,7 +1688,7 @@ wxString SIM_MODEL::parseFieldFloatValue( wxString aFieldFloatValue ) } -bool SIM_MODEL::requiresSpiceModel() const +bool SIM_MODEL::requiresSpiceModelLine() const { for( const PARAM& param : GetParams() ) { diff --git a/eeschema/sim/sim_model.h b/eeschema/sim/sim_model.h index e55dc66bd2..c3d477ac38 100644 --- a/eeschema/sim/sim_model.h +++ b/eeschema/sim/sim_model.h @@ -541,6 +541,7 @@ public: const PARAM* FindParam( const wxString& aParamName ) const; std::vector> GetParams() const; + std::vector> GetSpiceInstanceParams() const; const PARAM& GetUnderlyingParam( unsigned aParamIndex ) const; // Return the actual parameter. const PARAM& GetBaseParam( unsigned aParamIndex ) const; // Always return base parameter if it exists. @@ -574,7 +575,8 @@ protected: const wxString& aModelName, const std::vector& aSymbolPinNumbers, const std::vector& aPinNetNames ) const; - virtual wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const; + virtual wxString GenerateSpiceItemModelName( const wxString& aModelName ) const; + virtual wxString GenerateSpiceItemParams() const; virtual wxString GenerateParamValuePair( const PARAM& aParam, bool& aIsFirst ) const; @@ -622,7 +624,7 @@ private: wxString parseFieldFloatValue( wxString aFieldFloatValue ); - virtual bool requiresSpiceModel() const; + virtual bool requiresSpiceModelLine() const; virtual std::vector getPinNames() const { return {}; } diff --git a/eeschema/sim/sim_model_mutual_inductor.cpp b/eeschema/sim/sim_model_mutual_inductor.cpp index 8c690efe0e..ccdc86af91 100644 --- a/eeschema/sim/sim_model_mutual_inductor.cpp +++ b/eeschema/sim/sim_model_mutual_inductor.cpp @@ -34,12 +34,13 @@ SIM_MODEL_MUTUAL_INDUCTOR::SIM_MODEL_MUTUAL_INDUCTOR() : SIM_MODEL( SIM_MODEL::T } -wxString SIM_MODEL_MUTUAL_INDUCTOR::GenerateSpiceItemParamValuePair( const PARAM& aParam, - bool& aIsFirst ) const +wxString SIM_MODEL_MUTUAL_INDUCTOR::GenerateSpiceItemParams() const { wxString result; - result << aParam.value->ToSimpleString() << " "; + for( const PARAM& param : GetSpiceInstanceParams() ) + result << param.value->ToSimpleString() << " "; + return result; } diff --git a/eeschema/sim/sim_model_mutual_inductor.h b/eeschema/sim/sim_model_mutual_inductor.h index 5d5a339ff7..4f0aa192ce 100644 --- a/eeschema/sim/sim_model_mutual_inductor.h +++ b/eeschema/sim/sim_model_mutual_inductor.h @@ -33,7 +33,7 @@ class SIM_MODEL_MUTUAL_INDUCTOR : public SIM_MODEL public: SIM_MODEL_MUTUAL_INDUCTOR(); - wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const override; + wxString GenerateSpiceItemParams() const override; private: static const std::vector makeParamInfos(); diff --git a/eeschema/sim/sim_model_ngspice.h b/eeschema/sim/sim_model_ngspice.h index 9d6f180a72..401a7d2a92 100644 --- a/eeschema/sim/sim_model_ngspice.h +++ b/eeschema/sim/sim_model_ngspice.h @@ -95,6 +95,8 @@ protected: static const MODEL_INFO& ModelInfo( MODEL_TYPE aType ); private: + bool requiresSpiceModelLine() const override { return false; } + std::vector getPinNames() const override; MODEL_TYPE getModelType() const; diff --git a/eeschema/sim/sim_model_spice.cpp b/eeschema/sim/sim_model_spice.cpp index 522ad4ff0a..d37b11281c 100644 --- a/eeschema/sim/sim_model_spice.cpp +++ b/eeschema/sim/sim_model_spice.cpp @@ -135,7 +135,7 @@ wxString SIM_MODEL_SPICE::GenerateSpiceItemPins( const wxString& aRefName, if( it != aSymbolPinNumbers.end() ) { long symbolPinIndex = std::distance( aSymbolPinNumbers.begin(), it ); - result << aPinNetNames.at( symbolPinIndex ) << " "; + result << " " << aPinNetNames.at( symbolPinIndex ); } } @@ -143,13 +143,25 @@ wxString SIM_MODEL_SPICE::GenerateSpiceItemPins( const wxString& aRefName, } -wxString SIM_MODEL_SPICE::GenerateSpiceItemParamValuePair( const PARAM& aParam, - bool& aIsFirst ) const +wxString SIM_MODEL_SPICE::GenerateSpiceItemModelName( const wxString& aModelName ) const { - if( aParam.info.name != "model" ) - return ""; + return ""; +} - return aParam.value->ToString(); + +wxString SIM_MODEL_SPICE::GenerateSpiceItemParams() const +{ + wxString result; + + for( const PARAM& param : GetSpiceInstanceParams() ) + { + if( param.info.name != "model" ) + result << ""; + else + result << " " << param.value->ToString(); + } + + return result; } diff --git a/eeschema/sim/sim_model_spice.h b/eeschema/sim/sim_model_spice.h index 76f2fd9b34..b75042f9aa 100644 --- a/eeschema/sim/sim_model_spice.h +++ b/eeschema/sim/sim_model_spice.h @@ -66,7 +66,9 @@ protected: const std::vector& aSymbolPinNumbers, const std::vector& aPinNetNames ) const override; - wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const override; + wxString GenerateSpiceItemModelName( const wxString& aModelName ) const override; + + wxString GenerateSpiceItemParams() const override; bool SetParamFromSpiceCode( const wxString& aParamName, const wxString& aParamValue, SIM_VALUE_GRAMMAR::NOTATION aNotation @@ -80,7 +82,7 @@ private: void parseLegacyPinsField( unsigned aSymbolPinCount, const wxString& aLegacyPinsField ); - bool requiresSpiceModel() const override { return false; } + bool requiresSpiceModelLine() const override { return false; } std::vector> m_paramInfos; }; diff --git a/eeschema/sim/sim_model_subckt.h b/eeschema/sim/sim_model_subckt.h index 319e1a810f..bbf69c3669 100644 --- a/eeschema/sim/sim_model_subckt.h +++ b/eeschema/sim/sim_model_subckt.h @@ -42,7 +42,7 @@ protected: void CreatePins( unsigned aSymbolPinCount ) override; private: - bool requiresSpiceModel() const override { return true; } + bool requiresSpiceModelLine() const override { return true; } std::vector> m_paramInfos; }; diff --git a/eeschema/sim/sim_model_switch.cpp b/eeschema/sim/sim_model_switch.cpp index 5be86392eb..f372c831fd 100644 --- a/eeschema/sim/sim_model_switch.cpp +++ b/eeschema/sim/sim_model_switch.cpp @@ -51,16 +51,22 @@ SIM_MODEL_SWITCH::SIM_MODEL_SWITCH( TYPE aType ) : SIM_MODEL( aType ) } -wxString SIM_MODEL_SWITCH::GenerateSpiceItemParamValuePair( const PARAM& aParam, - bool& aIsFirst ) const +wxString SIM_MODEL_SWITCH::GenerateSpiceItemParams() const { - // The only instance param is "ic", which is positional. - wxString value = aParam.value->ToSpiceString(); - - if( value == "none" ) - return ""; - else - return value; + wxString result; + + for( const PARAM& param : GetSpiceInstanceParams() ) + { + // The only instance param is "ic", which is positional. + wxString value = param.value->ToSpiceString(); + + if( value == "none" ) + result << ""; + else + result << value; + } + + return result; } diff --git a/eeschema/sim/sim_model_switch.h b/eeschema/sim/sim_model_switch.h index 47bcd1893d..8813da7164 100644 --- a/eeschema/sim/sim_model_switch.h +++ b/eeschema/sim/sim_model_switch.h @@ -33,7 +33,7 @@ class SIM_MODEL_SWITCH : public SIM_MODEL public: SIM_MODEL_SWITCH( TYPE aType ); - wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const override; + wxString GenerateSpiceItemParams() const override; wxString GenerateSpiceItemLine( const wxString& aRefName, const wxString& aModelName, const std::vector& aSymbolPinNumbers, const std::vector& aPinNetNames ) const override; @@ -48,7 +48,7 @@ private: return { "ctrl+", "ctrl-", "no+", "no-" }; } - bool requiresSpiceModel() const override { return true; } + bool requiresSpiceModelLine() const override { return true; } static const std::vector makeSwVParamInfos(); static const std::vector makeSwIParamInfos();