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;
result << GenerateSpiceItemName( aRefName ) << " ";
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 << " ";
}
}
result << GenerateSpiceItemPins( aRefName, aModelName, aSymbolPinNumbers, aPinNetNames );
if( requiresSpiceModel() )
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 result;

View File

@ -498,7 +498,6 @@ public:
virtual wxString GenerateSpiceModelLine( const wxString& aModelName ) 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 std::vector<wxString>& aSymbolPinNumbers ) const;
@ -573,6 +572,10 @@ protected:
template <typename T>
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 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();
if( !aRefName.IsEmpty() && aRefName.StartsWith( elementType ) )
if( aRefName != "" && aRefName.StartsWith( elementType ) )
return aRefName;
else
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 )
{
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,
const wxString& aParamValue,
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.defaultValue = "";
paramInfo.description = "Spice element type";
paramInfo.isSpiceInstanceParam = true;
paramInfos.push_back( paramInfo );
break;
@ -184,6 +195,7 @@ std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_SPICE::makeParamInfos()
paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL;
paramInfo.defaultValue = "";
paramInfo.description = "Model name or value";
paramInfo.isSpiceInstanceParam = true;
paramInfos.push_back( paramInfo );
break;
@ -195,6 +207,7 @@ std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_SPICE::makeParamInfos()
paramInfo.category = SIM_MODEL::PARAM::CATEGORY::PRINCIPAL;
paramInfo.defaultValue = "";
paramInfo.description = "Library path to include";
paramInfo.isSpiceInstanceParam = true;
paramInfos.push_back( paramInfo );
break;

View File

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