25 changed files with 517 additions and 449 deletions
-
1eeschema/CMakeLists.txt
-
1eeschema/dialogs/dialog_signal_list.cpp
-
196eeschema/sim/sim_model.cpp
-
48eeschema/sim/sim_model.h
-
52eeschema/sim/sim_model_behavioral.cpp
-
23eeschema/sim/sim_model_behavioral.h
-
18eeschema/sim/sim_model_ideal.cpp
-
23eeschema/sim/sim_model_ideal.h
-
9eeschema/sim/sim_model_mutual_inductor.cpp
-
17eeschema/sim/sim_model_mutual_inductor.h
-
31eeschema/sim/sim_model_ngspice.cpp
-
18eeschema/sim/sim_model_ngspice.h
-
46eeschema/sim/sim_model_source.cpp
-
29eeschema/sim/sim_model_source.h
-
29eeschema/sim/sim_model_spice.cpp
-
31eeschema/sim/sim_model_spice.h
-
10eeschema/sim/sim_model_subckt.cpp
-
17eeschema/sim/sim_model_subckt.h
-
34eeschema/sim/sim_model_switch.cpp
-
23eeschema/sim/sim_model_switch.h
-
10eeschema/sim/sim_model_tline.cpp
-
15eeschema/sim/sim_model_tline.h
-
212eeschema/sim/spice_generator.cpp
-
72eeschema/sim/spice_generator.h
-
1eeschema/tools/sch_editor_control.cpp
@ -0,0 +1,212 @@ |
|||||
|
/*
|
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2022 Mikolaj Wielgus |
||||
|
* Copyright (C) 2022 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 3 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
* or you may search the http://www.gnu.org website for the version 3 license,
|
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
|
||||
|
#include <sim/spice_generator.h>
|
||||
|
#include <locale_io.h>
|
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ModelLine( const wxString& aModelName ) const |
||||
|
{ |
||||
|
LOCALE_IO toggle; |
||||
|
|
||||
|
if( !m_model.HasSpiceNonInstanceOverrides() && !m_model.requiresSpiceModelLine() ) |
||||
|
return ""; |
||||
|
|
||||
|
wxString result = ""; |
||||
|
|
||||
|
result << wxString::Format( ".model %s ", aModelName ); |
||||
|
size_t indentLength = result.Length(); |
||||
|
|
||||
|
result << wxString::Format( "%s \n", m_model.GetSpiceInfo().modelType ); |
||||
|
|
||||
|
for( const SIM_MODEL::PARAM& param : m_model.GetParams() ) |
||||
|
{ |
||||
|
if( param.info.isSpiceInstanceParam ) |
||||
|
continue; |
||||
|
|
||||
|
wxString name = ( param.info.spiceModelName == "" ) ? |
||||
|
param.info.name : param.info.spiceModelName; |
||||
|
wxString value = param.value->ToSpiceString(); |
||||
|
|
||||
|
if( value == "" ) |
||||
|
continue; |
||||
|
|
||||
|
result << wxString::Format( "+%s%s=%s\n", wxString( ' ', indentLength - 1 ), name, value ); |
||||
|
} |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ItemLine( const wxString& aRefName, |
||||
|
const wxString& aModelName ) const |
||||
|
{ |
||||
|
// Use linear symbol pin numbers enumeration. Used in model preview.
|
||||
|
|
||||
|
std::vector<wxString> pinNumbers; |
||||
|
|
||||
|
for( int i = 0; i < m_model.GetPinCount(); ++i ) |
||||
|
pinNumbers.push_back( wxString::FromCDouble( i + 1 ) ); |
||||
|
|
||||
|
return ItemLine( aRefName, aModelName, pinNumbers ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ItemLine( const wxString& aRefName, |
||||
|
const wxString& aModelName, |
||||
|
const std::vector<wxString>& aSymbolPinNumbers ) const |
||||
|
{ |
||||
|
std::vector<wxString> pinNetNames; |
||||
|
|
||||
|
for( const SIM_MODEL::PIN& pin : GetPins() ) |
||||
|
pinNetNames.push_back( pin.name ); |
||||
|
|
||||
|
return ItemLine( aRefName, aModelName, aSymbolPinNumbers, pinNetNames ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ItemLine( const wxString& aRefName, |
||||
|
const wxString& aModelName, |
||||
|
const std::vector<wxString>& aSymbolPinNumbers, |
||||
|
const std::vector<wxString>& aPinNetNames ) const |
||||
|
{ |
||||
|
wxString result; |
||||
|
result << ItemName( aRefName ); |
||||
|
result << ItemPins( aRefName, aModelName, aSymbolPinNumbers, aPinNetNames ); |
||||
|
result << ItemModelName( aModelName ); |
||||
|
result << ItemParams(); |
||||
|
result << "\n"; |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ItemName( const wxString& aRefName ) const |
||||
|
{ |
||||
|
if( aRefName != "" && aRefName.StartsWith( m_model.GetSpiceInfo().itemType ) ) |
||||
|
return aRefName; |
||||
|
else |
||||
|
return m_model.GetSpiceInfo().itemType + aRefName; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ItemPins( const wxString& aRefName, |
||||
|
const wxString& aModelName, |
||||
|
const std::vector<wxString>& aSymbolPinNumbers, |
||||
|
const std::vector<wxString>& aPinNetNames ) const |
||||
|
{ |
||||
|
wxString result; |
||||
|
int ncCounter = 0; |
||||
|
|
||||
|
for( const SIM_MODEL::PIN& pin : GetPins() ) |
||||
|
{ |
||||
|
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 SPICE_GENERATOR::ItemModelName( const wxString& aModelName ) const |
||||
|
{ |
||||
|
return " " + aModelName; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::ItemParams() const |
||||
|
{ |
||||
|
wxString result; |
||||
|
|
||||
|
for( const SIM_MODEL::PARAM& param : GetInstanceParams() ) |
||||
|
{ |
||||
|
wxString name = ( param.info.spiceInstanceName == "" ) ? |
||||
|
param.info.name : param.info.spiceInstanceName; |
||||
|
wxString value = param.value->ToSpiceString(); |
||||
|
|
||||
|
if( value != "" ) |
||||
|
result << " " << name << "=" << value; |
||||
|
} |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::TuningLine( const wxString& aSymbol ) const |
||||
|
{ |
||||
|
// TODO.
|
||||
|
return ""; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
std::vector<wxString> SPICE_GENERATOR::CurrentNames( const wxString& aRefName ) const |
||||
|
{ |
||||
|
LOCALE_IO toggle; |
||||
|
return { wxString::Format( "I(%s)", ItemName( aRefName ) ) }; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
wxString SPICE_GENERATOR::Preview( const wxString& aModelName ) const |
||||
|
{ |
||||
|
wxString spiceCode = ModelLine( aModelName ); |
||||
|
|
||||
|
if( spiceCode == "" ) |
||||
|
spiceCode = m_model.m_spiceCode; |
||||
|
|
||||
|
if( spiceCode == "" && m_model.GetBaseModel() ) |
||||
|
spiceCode = m_model.GetBaseModel()->m_spiceCode; |
||||
|
|
||||
|
wxString itemLine = ItemLine( "", aModelName ); |
||||
|
if( spiceCode != "" ) |
||||
|
spiceCode << "\n"; |
||||
|
|
||||
|
spiceCode << itemLine; |
||||
|
return spiceCode.Trim(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
std::vector<std::reference_wrapper<const SIM_MODEL::PARAM>> SPICE_GENERATOR::GetInstanceParams() const |
||||
|
{ |
||||
|
std::vector<std::reference_wrapper<const SIM_MODEL::PARAM>> instanceParams; |
||||
|
|
||||
|
for( const SIM_MODEL::PARAM& param : m_model.GetParams() ) |
||||
|
{ |
||||
|
if( param.info.isSpiceInstanceParam ) |
||||
|
instanceParams.emplace_back( param ); |
||||
|
} |
||||
|
|
||||
|
return instanceParams; |
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,72 @@ |
|||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2022 Mikolaj Wielgus |
||||
|
* Copyright (C) 2022 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 3 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* https://www.gnu.org/licenses/gpl-3.0.html |
||||
|
* or you may search the http://www.gnu.org website for the version 3 license, |
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
|
||||
|
#ifndef SPICE_GENERATOR_H |
||||
|
#define SPICE_GENERATOR_H |
||||
|
|
||||
|
#include <sim/sim_model.h> |
||||
|
|
||||
|
|
||||
|
class SPICE_GENERATOR |
||||
|
{ |
||||
|
public: |
||||
|
SPICE_GENERATOR( const SIM_MODEL& aModel ) : m_model( aModel ) {} |
||||
|
|
||||
|
virtual wxString ModelLine( const wxString& aModelName ) const; |
||||
|
|
||||
|
wxString ItemLine( const wxString& aRefName, |
||||
|
const wxString& aModelName ) const; |
||||
|
wxString ItemLine( const wxString& aRefName, |
||||
|
const wxString& aModelName, |
||||
|
const std::vector<wxString>& aSymbolPinNumbers ) const; |
||||
|
virtual wxString ItemLine( const wxString& aRefName, |
||||
|
const wxString& aModelName, |
||||
|
const std::vector<wxString>& aSymbolPinNumbers, |
||||
|
const std::vector<wxString>& aPinNetNames ) const; |
||||
|
virtual wxString ItemName( const wxString& aRefName ) const; |
||||
|
virtual wxString ItemPins( const wxString& aRefName, |
||||
|
const wxString& aModelName, |
||||
|
const std::vector<wxString>& aSymbolPinNumbers, |
||||
|
const std::vector<wxString>& aPinNetNames ) const; |
||||
|
virtual wxString ItemModelName( const wxString& aModelName ) const; |
||||
|
virtual wxString ItemParams() const; |
||||
|
|
||||
|
virtual wxString TuningLine( const wxString& aSymbol ) const; |
||||
|
|
||||
|
virtual std::vector<wxString> CurrentNames( const wxString& aRefName ) const; |
||||
|
|
||||
|
virtual wxString Preview( const wxString& aModelName ) const; |
||||
|
|
||||
|
protected: |
||||
|
virtual std::vector<std::reference_wrapper<const SIM_MODEL::PIN>> GetPins() const |
||||
|
{ |
||||
|
return m_model.GetPins(); |
||||
|
} |
||||
|
|
||||
|
std::vector<std::reference_wrapper<const SIM_MODEL::PARAM>> GetInstanceParams() const; |
||||
|
|
||||
|
const SIM_MODEL& m_model; |
||||
|
}; |
||||
|
|
||||
|
#endif // SPICE_GENERATOR_H |
Write
Preview
Loading…
Cancel
Save
Reference in new issue