Revert "Fix more SPICE case-insensitivity bugs."

This reverts commit e5d5335701.
This commit is contained in:
Seth Hillbrand 2023-05-24 08:54:16 -07:00
parent e2c0c6362f
commit 89349c1084
5 changed files with 51 additions and 57 deletions

View File

@ -814,19 +814,13 @@ const SIM_MODEL::PARAM& SIM_MODEL::GetParam( unsigned aParamIndex ) const
} }
bool SIM_MODEL::PARAM::INFO::Matches( const std::string& aParamName ) const
{
return boost::iequals( name, aParamName );
}
int SIM_MODEL::doFindParam( const std::string& aParamName ) const int SIM_MODEL::doFindParam( const std::string& aParamName ) const
{ {
std::vector<std::reference_wrapper<const PARAM>> params = GetParams(); std::vector<std::reference_wrapper<const PARAM>> params = GetParams();
for( int ii = 0; ii < (int) params.size(); ++ii ) for( int ii = 0; ii < (int) params.size(); ++ii )
{ {
if( params[ii].get().Matches( aParamName ) ) if( boost::iequals( params[ii].get().info.name, aParamName ) )
return ii; return ii;
} }

View File

@ -354,8 +354,6 @@ public:
enumValues( std::move( aEnumValues ) ) enumValues( std::move( aEnumValues ) )
{} {}
bool Matches( const std::string& aName ) const;
std::string name; std::string name;
unsigned id; unsigned id;
DIR dir; DIR dir;
@ -371,17 +369,12 @@ public:
std::vector<std::string> enumValues; std::vector<std::string> enumValues;
}; };
std::string value;
const INFO& info;
PARAM( const INFO& aInfo ) : PARAM( const INFO& aInfo ) :
info( aInfo ) info( aInfo )
{} {}
bool Matches( const std::string& aName ) const
{
return info.Matches( aName );
}
std::string value;
const INFO& info;
}; };

View File

@ -24,7 +24,7 @@
#include <sim/sim_model_ngspice.h> #include <sim/sim_model_ngspice.h>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string/case_conv.hpp>
#include <fmt/core.h> #include <fmt/core.h>
@ -85,13 +85,15 @@ int SIM_MODEL_NGSPICE::doFindParam( const std::string& aParamName ) const
{ {
// Special case to allow escaped model parameters (suffixed with "_") // Special case to allow escaped model parameters (suffixed with "_")
std::string lowerParamName = boost::to_lower_copy( aParamName );
std::vector<std::reference_wrapper<const PARAM>> params = GetParams(); std::vector<std::reference_wrapper<const PARAM>> params = GetParams();
for( int ii = 0; ii < (int) params.size(); ++ii ) for( int ii = 0; ii < (int) params.size(); ++ii )
{ {
const PARAM& param = params[ii]; const PARAM& param = params[ii];
if( param.Matches( aParamName ) || param.Matches( aParamName + "_" ) ) if( param.info.name == lowerParamName || param.info.name == lowerParamName + "_" )
return ii; return ii;
} }
@ -103,24 +105,27 @@ void SIM_MODEL_NGSPICE::SetParamFromSpiceCode( const std::string& aParamName,
const std::string& aValue, const std::string& aValue,
SIM_VALUE_GRAMMAR::NOTATION aNotation ) SIM_VALUE_GRAMMAR::NOTATION aNotation )
{ {
std::string paramName = boost::to_lower_copy( aParamName );
// "level" and "version" are not really parameters - they're part of the type - so silently // "level" and "version" are not really parameters - they're part of the type - so silently
// ignore them. // ignore them.
if( boost::iequals( aParamName, "level" ) || boost::iequals( aParamName, "version" ) ) if( paramName == "level" || paramName == "version" )
return; return;
// First we try to use the name as is. Note that you can't set instance parameters from this // 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. // function, it's for ".model" cards, not for instantiations.
std::string lowerParamName = boost::to_lower_copy( paramName );
std::vector<std::reference_wrapper<const PARAM>> params = GetParams(); std::vector<std::reference_wrapper<const PARAM>> params = GetParams();
for( int ii = 0; ii < (int) params.size(); ++ii ) for( int ii = 0; ii < (int) params.size(); ++ii )
{ {
const PARAM& param = params[ii]; const PARAM& param = params[ii];
if( param.info.isSpiceInstanceParam || param.info.category == PARAM::CATEGORY::SUPERFLUOUS ) if( !param.info.isSpiceInstanceParam
continue; && param.info.category != PARAM::CATEGORY::SUPERFLUOUS
&& ( param.info.name == lowerParamName || param.info.name == lowerParamName + "_" ) )
if( param.Matches( aParamName ) || param.Matches( aParamName + "_" ) )
{ {
SetParamValue( ii, aValue, aNotation ); SetParamValue( ii, aValue, aNotation );
return; return;
@ -134,18 +139,16 @@ void SIM_MODEL_NGSPICE::SetParamFromSpiceCode( const std::string& aParamName,
for( const PARAM::INFO& ngspiceParamInfo : ModelInfo( getModelType() ).modelParams ) for( const PARAM::INFO& ngspiceParamInfo : ModelInfo( getModelType() ).modelParams )
{ {
if( ngspiceParamInfo.Matches( aParamName ) ) if( ngspiceParamInfo.name == lowerParamName )
{ {
// Find an actual parameter with the same id. Even if the ngspiceParam was // Find an actual parameter with the same id. Even if the ngspiceParam was
// superfluous, its alias target might not be. // superfluous, its alias target might not be.
for( int ii = 0; ii < (int) params.size(); ++ii ) for( int ii = 0; ii < (int) params.size(); ++ii )
{ {
const PARAM::INFO& paramInfo = params[ii].get().info; const PARAM& param = params[ii];
if( paramInfo.category == PARAM::CATEGORY::SUPERFLUOUS ) if( param.info.id == ngspiceParamInfo.id
continue; && param.info.category != PARAM::CATEGORY::SUPERFLUOUS )
if( paramInfo.id == ngspiceParamInfo.id )
{ {
SetParamValue( ii, aValue, aNotation ); SetParamValue( ii, aValue, aNotation );
return; return;
@ -156,7 +159,7 @@ void SIM_MODEL_NGSPICE::SetParamFromSpiceCode( const std::string& aParamName,
} }
} }
if( !canSilentlyIgnoreParam( aParamName ) ) if( !canSilentlyIgnoreParam( paramName ) )
{ {
THROW_IO_ERROR( wxString::Format( "Failed to set parameter '%s' to value '%s'", THROW_IO_ERROR( wxString::Format( "Failed to set parameter '%s' to value '%s'",
aParamName, aParamName,
@ -168,19 +171,19 @@ void SIM_MODEL_NGSPICE::SetParamFromSpiceCode( const std::string& aParamName,
bool SIM_MODEL_NGSPICE::canSilentlyIgnoreParam( const std::string& aParamName ) bool SIM_MODEL_NGSPICE::canSilentlyIgnoreParam( const std::string& aParamName )
{ {
// Ignore the purely informative LTspice-specific parameters "mfg" and "type". // Ignore the purely informative LTspice-specific parameters "mfg" and "type".
if( boost::iequals( aParamName, "mfg" ) || boost::iequals( aParamName, "type" ) ) if( aParamName == "mfg" || aParamName == "type" )
return true; return true;
if( GetDeviceType() == DEVICE_T::D ) if( GetDeviceType() == DEVICE_T::D )
{ {
if( boost::iequals( aParamName, "perim" ) if( aParamName == "perim"
|| boost::iequals( aParamName, "isw" ) || aParamName == "isw"
|| boost::iequals( aParamName, "ns" ) || aParamName == "ns"
|| boost::iequals( aParamName, "rsw" ) || aParamName == "rsw"
|| boost::iequals( aParamName, "cjsw" ) || aParamName == "cjsw"
|| boost::iequals( aParamName, "vjsw" ) || aParamName == "vjsw"
|| boost::iequals( aParamName, "mjsw" ) || aParamName == "mjsw"
|| boost::iequals( aParamName, "fcs" ) ) || aParamName == "fcs" )
{ {
return true; return true;
} }
@ -189,20 +192,20 @@ bool SIM_MODEL_NGSPICE::canSilentlyIgnoreParam( const std::string& aParamName )
if( GetDeviceType() == DEVICE_T::NPN || GetDeviceType() == DEVICE_T::PNP ) if( GetDeviceType() == DEVICE_T::NPN || GetDeviceType() == DEVICE_T::PNP )
{ {
// Ignore the purely informative LTspice-specific parameters "icrating" and "vceo". // Ignore the purely informative LTspice-specific parameters "icrating" and "vceo".
if( boost::iequals( aParamName, "icrating" ) || boost::iequals( aParamName, "vceo" ) ) if( aParamName == "icrating" || aParamName == "vceo" )
return true; return true;
} }
if( GetType() == TYPE::NPN_GUMMELPOON || GetType() == TYPE::PNP_GUMMELPOON ) if( GetType() == TYPE::NPN_GUMMELPOON || GetType() == TYPE::PNP_GUMMELPOON )
{ {
// Ignore unused parameters. // Ignore unused parameters.
if( boost::iequals( aParamName, "bvcbo" ) if( aParamName == "bvcbo"
|| boost::iequals( aParamName, "nbvcbo" ) || aParamName == "nbvcbo"
|| boost::iequals( aParamName, "tbvcbo1" ) || aParamName == "tbvcbo1"
|| boost::iequals( aParamName, "tbvcbo2" ) || aParamName == "tbvcbo2"
|| boost::iequals( aParamName, "bvbe" ) || aParamName == "bvbe"
|| boost::iequals( aParamName, "ibvbe" ) || aParamName == "ibvbe"
|| boost::iequals( aParamName, "nbvbe" ) ) || aParamName == "nbvbe" )
{ {
return true; return true;
} }
@ -211,9 +214,9 @@ bool SIM_MODEL_NGSPICE::canSilentlyIgnoreParam( const std::string& aParamName )
if( GetType() == TYPE::NMOS_VDMOS || GetType() == TYPE::PMOS_VDMOS ) if( GetType() == TYPE::NMOS_VDMOS || GetType() == TYPE::PMOS_VDMOS )
{ {
// Ignore the purely informative LTspice-specific parameters "Vds", "Ron" and "Qg". // Ignore the purely informative LTspice-specific parameters "Vds", "Ron" and "Qg".
if( boost::iequals( aParamName, "vds" ) if( aParamName == "vds"
|| boost::iequals( aParamName, "ron" ) || aParamName == "ron"
|| boost::iequals( aParamName, "qg" ) ) || aParamName == "qg" )
{ {
return true; return true;
} }

View File

@ -211,7 +211,7 @@ bool SIM_MODEL_SERIALIZER::ParseParams( const std::string& aParams )
} }
std::string paramName; std::string paramName;
bool isPrimaryValueSet = false; bool isPrimaryValueSet = false;
for( const auto& node : root->children ) for( const auto& node : root->children )
{ {
@ -223,10 +223,11 @@ bool SIM_MODEL_SERIALIZER::ParseParams( const std::string& aParams )
|| node->is_type<SIM_MODEL_SERIALIZER_PARSER::unquotedString>() ) || node->is_type<SIM_MODEL_SERIALIZER_PARSER::unquotedString>() )
{ {
wxASSERT( paramName != "" ); wxASSERT( paramName != "" );
// TODO: Shouldn't be named "...fromSpiceCode" here...
m_model.SetParamValue( paramName, node->string(), SIM_VALUE_GRAMMAR::NOTATION::SI ); m_model.SetParamValue( paramName, node->string(), SIM_VALUE_GRAMMAR::NOTATION::SI );
if( m_model.GetParam( 0 ).Matches( paramName ) ) if( paramName == m_model.GetParam( 0 ).info.name )
isPrimaryValueSet = true; isPrimaryValueSet = true;
} }
else if( node->is_type<SIM_MODEL_SERIALIZER_PARSER::quotedString>() ) else if( node->is_type<SIM_MODEL_SERIALIZER_PARSER::quotedString>() )
@ -302,13 +303,13 @@ std::string SIM_MODEL_SERIALIZER::generateParamValuePair( const SIM_MODEL::PARAM
std::string name = aParam.info.name; std::string name = aParam.info.name;
// Because of collisions with instance parameters, we append some model parameters with "_". // Because of collisions with instance parameters, we append some model parameters with "_".
if( boost::ends_with( name, "_" ) ) if( boost::ends_with( aParam.info.name, "_" ) )
name = name.substr( 0, aParam.info.name.length() - 1 ); name = aParam.info.name.substr( 0, aParam.info.name.length() - 1 );
std::string value = aParam.value; std::string value = aParam.value;
if( aParam.info.category == SIM_MODEL::PARAM::CATEGORY::FLAGS ) if( aParam.info.category == SIM_MODEL::PARAM::CATEGORY::FLAGS )
return value == "1" ? name : ""; return value == "1" ? aParam.info.name : "";
if( value == "" || value.find( ' ' ) != std::string::npos ) if( value == "" || value.find( ' ' ) != std::string::npos )
value = fmt::format( "\"{}\"", value ); value = fmt::format( "\"{}\"", value );

View File

@ -23,6 +23,7 @@
#include <sim/sim_model_spice_fallback.h> #include <sim/sim_model_spice_fallback.h>
#include <fmt/format.h> #include <fmt/format.h>
#include <boost/algorithm/string/case_conv.hpp>
SIM_MODEL_SPICE_FALLBACK::SIM_MODEL_SPICE_FALLBACK( TYPE aType, const std::string& aRawSpiceCode ) : SIM_MODEL_SPICE_FALLBACK::SIM_MODEL_SPICE_FALLBACK( TYPE aType, const std::string& aRawSpiceCode ) :
@ -66,13 +67,15 @@ int SIM_MODEL_SPICE_FALLBACK::doFindParam( const std::string& aParamName ) const
{ {
// Special case to allow escaped model parameters (suffixed with "_") // Special case to allow escaped model parameters (suffixed with "_")
std::string lowerParamName = boost::to_lower_copy( aParamName );
std::vector<std::reference_wrapper<const PARAM>> params = GetParams(); std::vector<std::reference_wrapper<const PARAM>> params = GetParams();
for( int ii = 0; ii < (int) params.size(); ++ii ) for( int ii = 0; ii < (int) params.size(); ++ii )
{ {
const PARAM& param = params[ii]; const PARAM& param = params[ii];
if( param.Matches( aParamName ) || param.Matches( aParamName + "_" ) ) if( param.info.name == lowerParamName || param.info.name == lowerParamName + "_" )
return ii; return ii;
} }