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:
parent
60f6bb8c77
commit
94bbb2e267
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue