Sim: Skip NC pins of raw Spice models when generating netlist

Unconnected pins were erroreously placed in raw Spice item
instantiations, resulting in passing more pins than model had.
This commit is contained in:
Mikolaj Wielgus 2022-09-01 11:29:29 +02:00
parent 60f6bb8c77
commit 94bbb2e267
4 changed files with 79 additions and 48 deletions

View File

@ -993,26 +993,7 @@ wxString SIM_MODEL::GenerateSpiceItemLine( const wxString& aRefName,
{ {
wxString result; wxString result;
result << GenerateSpiceItemName( aRefName ) << " "; result << GenerateSpiceItemName( aRefName ) << " ";
result << GenerateSpiceItemPins( aRefName, aModelName, aSymbolPinNumbers, aPinNetNames );
int ncCounter = 0;
for( const PIN& pin : GetSpicePins() )
{
auto it = std::find( aSymbolPinNumbers.begin(), aSymbolPinNumbers.end(),
pin.symbolPinNumber );
if( it == aSymbolPinNumbers.end() )
{
LOCALE_IO toggle;
result << wxString::Format( "NC-%s-%u ", aRefName, ncCounter++ );
}
else
{
long symbolPinIndex = std::distance( aSymbolPinNumbers.begin(), it );
wxString netName = aPinNetNames.at( symbolPinIndex );
result << netName << " ";
}
}
if( requiresSpiceModel() ) if( requiresSpiceModel() )
result << aModelName << " "; result << aModelName << " ";
@ -1265,6 +1246,35 @@ void SIM_MODEL::WriteInferredDataFields( std::vector<T>& aFields, const wxString
} }
wxString SIM_MODEL::GenerateSpiceItemPins( const wxString& aRefName,
const wxString& aModelName,
const std::vector<wxString>& aSymbolPinNumbers,
const std::vector<wxString>& aPinNetNames ) const
{
wxString result;
int ncCounter = 0;
for( const PIN& pin : GetSpicePins() )
{
auto it = std::find( aSymbolPinNumbers.begin(), aSymbolPinNumbers.end(),
pin.symbolPinNumber );
if( it == aSymbolPinNumbers.end() )
{
LOCALE_IO toggle;
result << wxString::Format( "NC-%s-%u ", aRefName, ncCounter++ );
}
else
{
long symbolPinIndex = std::distance( aSymbolPinNumbers.begin(), it );
result << aPinNetNames.at( symbolPinIndex ) << " ";
}
}
return result;
}
wxString SIM_MODEL::GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const wxString SIM_MODEL::GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const
{ {
wxString result; wxString result;

View File

@ -498,7 +498,6 @@ public:
virtual wxString GenerateSpiceModelLine( const wxString& aModelName ) const; virtual wxString GenerateSpiceModelLine( const wxString& aModelName ) const;
virtual wxString GenerateSpiceItemName( const wxString& aRefName ) const; virtual wxString GenerateSpiceItemName( const wxString& aRefName ) const;
wxString GenerateSpiceItemLine( const wxString& aRefName, const wxString& aModelName ) const; wxString GenerateSpiceItemLine( const wxString& aRefName, const wxString& aModelName ) const;
wxString GenerateSpiceItemLine( const wxString& aRefName, const wxString& aModelName, wxString GenerateSpiceItemLine( const wxString& aRefName, const wxString& aModelName,
const std::vector<wxString>& aSymbolPinNumbers ) const; const std::vector<wxString>& aSymbolPinNumbers ) const;
@ -573,6 +572,10 @@ protected:
template <typename T> template <typename T>
void WriteInferredDataFields( std::vector<T>& aFields, const wxString& aValue ) const; void WriteInferredDataFields( std::vector<T>& aFields, const wxString& aValue ) const;
virtual wxString GenerateSpiceItemPins( const wxString& aRefName,
const wxString& aModelName,
const std::vector<wxString>& aSymbolPinNumbers,
const std::vector<wxString>& aPinNetNames ) const;
virtual wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const; virtual wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const;
virtual wxString GenerateParamValuePair( const PARAM& aParam, bool& aIsFirst ) const; virtual wxString GenerateParamValuePair( const PARAM& aParam, bool& aIsFirst ) const;

View File

@ -91,36 +91,13 @@ wxString SIM_MODEL_SPICE::GenerateSpiceItemName( const wxString& aRefName ) cons
{ {
wxString elementType = GetParam( static_cast<int>( SPICE_PARAM::TYPE ) ).value->ToString(); wxString elementType = GetParam( static_cast<int>( SPICE_PARAM::TYPE ) ).value->ToString();
if( !aRefName.IsEmpty() && aRefName.StartsWith( elementType ) ) if( aRefName != "" && aRefName.StartsWith( elementType ) )
return aRefName; return aRefName;
else else
return elementType + aRefName; return elementType + aRefName;
} }
wxString SIM_MODEL_SPICE::GenerateSpiceItemLine( const wxString& aRefName,
const wxString& aModelName,
const std::vector<wxString>& aSymbolPinNumbers,
const std::vector<wxString>& aPinNetNames ) const
{
wxString result;
result << GenerateSpiceItemName( aRefName ) << " ";
for( const PIN& pin : GetPins() )
{
auto it = std::find( aSymbolPinNumbers.begin(),
aSymbolPinNumbers.end(),
pin.symbolPinNumber );
long symbolPinIndex = std::distance( aSymbolPinNumbers.begin(), it );
result << aPinNetNames.at( symbolPinIndex ) << " ";
}
result << GetParam( static_cast<unsigned>( SPICE_PARAM::MODEL ) ).value->ToString() << "\n";
return result;
}
void SIM_MODEL_SPICE::CreatePins( unsigned aSymbolPinCount ) void SIM_MODEL_SPICE::CreatePins( unsigned aSymbolPinCount )
{ {
for( unsigned symbolPinIndex = 0; symbolPinIndex < aSymbolPinCount; ++symbolPinIndex ) for( unsigned symbolPinIndex = 0; symbolPinIndex < aSymbolPinCount; ++symbolPinIndex )
@ -128,6 +105,39 @@ void SIM_MODEL_SPICE::CreatePins( unsigned aSymbolPinCount )
} }
wxString SIM_MODEL_SPICE::GenerateSpiceItemPins( const wxString& aRefName,
const wxString& aModelName,
const std::vector<wxString>& aSymbolPinNumbers,
const std::vector<wxString>& aPinNetNames ) const
{
wxString result;
for( const PIN& pin : GetSpicePins() )
{
auto it = std::find( aSymbolPinNumbers.begin(), aSymbolPinNumbers.end(),
pin.symbolPinNumber );
if( it != aSymbolPinNumbers.end() )
{
long symbolPinIndex = std::distance( aSymbolPinNumbers.begin(), it );
result << aPinNetNames.at( symbolPinIndex ) << " ";
}
}
return result;
}
wxString SIM_MODEL_SPICE::GenerateSpiceItemParamValuePair( const PARAM& aParam,
bool& aIsFirst ) const
{
if( aParam.info.name != "model" )
return "";
return aParam.value->ToString();
}
bool SIM_MODEL_SPICE::SetParamFromSpiceCode( const wxString& aParamName, bool SIM_MODEL_SPICE::SetParamFromSpiceCode( const wxString& aParamName,
const wxString& aParamValue, const wxString& aParamValue,
SIM_VALUE_GRAMMAR::NOTATION aNotation ) SIM_VALUE_GRAMMAR::NOTATION aNotation )
@ -173,6 +183,7 @@ std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_SPICE::makeParamInfos()
paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL; paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL;
paramInfo.defaultValue = ""; paramInfo.defaultValue = "";
paramInfo.description = "Spice element type"; paramInfo.description = "Spice element type";
paramInfo.isSpiceInstanceParam = true;
paramInfos.push_back( paramInfo ); paramInfos.push_back( paramInfo );
break; break;
@ -184,6 +195,7 @@ std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_SPICE::makeParamInfos()
paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL; paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL;
paramInfo.defaultValue = ""; paramInfo.defaultValue = "";
paramInfo.description = "Model name or value"; paramInfo.description = "Model name or value";
paramInfo.isSpiceInstanceParam = true;
paramInfos.push_back( paramInfo ); paramInfos.push_back( paramInfo );
break; break;
@ -195,6 +207,7 @@ std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_SPICE::makeParamInfos()
paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL; paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL;
paramInfo.defaultValue = ""; paramInfo.defaultValue = "";
paramInfo.description = "Library path to include"; paramInfo.description = "Library path to include";
paramInfo.isSpiceInstanceParam = true;
paramInfos.push_back( paramInfo ); paramInfos.push_back( paramInfo );
break; break;

View File

@ -56,13 +56,16 @@ public:
wxString GenerateSpiceModelLine( const wxString& aModelName ) const override; wxString GenerateSpiceModelLine( const wxString& aModelName ) const override;
wxString GenerateSpiceItemName( const wxString& aRefName ) const override; wxString GenerateSpiceItemName( const wxString& aRefName ) const override;
wxString GenerateSpiceItemLine( const wxString& aRefName,
protected:
void CreatePins( unsigned aSymbolPinCount ) override;
wxString GenerateSpiceItemPins( const wxString& aRefName,
const wxString& aModelName, const wxString& aModelName,
const std::vector<wxString>& aSymbolPinNumbers, const std::vector<wxString>& aSymbolPinNumbers,
const std::vector<wxString>& aPinNetNames ) const override; const std::vector<wxString>& aPinNetNames ) const override;
protected: wxString GenerateSpiceItemParamValuePair( const PARAM& aParam, bool& aIsFirst ) const override;
void CreatePins( unsigned aSymbolPinCount ) override;
bool SetParamFromSpiceCode( const wxString& aParamName, const wxString& aParamValue, bool SetParamFromSpiceCode( const wxString& aParamName, const wxString& aParamValue,
SIM_VALUE_GRAMMAR::NOTATION aNotation SIM_VALUE_GRAMMAR::NOTATION aNotation
@ -76,6 +79,8 @@ private:
void parseLegacyPinsField( unsigned aSymbolPinCount, const wxString& aLegacyPinsField ); void parseLegacyPinsField( unsigned aSymbolPinCount, const wxString& aLegacyPinsField );
bool requiresSpiceModel() const override { return false; }
std::vector<std::unique_ptr<PARAM::INFO>> m_paramInfos; std::vector<std::unique_ptr<PARAM::INFO>> m_paramInfos;
}; };