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;
|
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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue