Browse Source

Uniform application of recursion guards in simulation code.

pull/18/head
Jeff Young 7 months ago
parent
commit
42c68f1a16
  1. 36
      eeschema/dialogs/dialog_sim_model.cpp
  2. 2
      eeschema/erc/erc.cpp
  3. 4
      eeschema/netlist_exporters/netlist_exporter_spice.cpp
  4. 2
      eeschema/sch_edit_frame.cpp
  5. 2
      eeschema/sch_field.cpp
  6. 2
      eeschema/sch_field.h
  7. 2
      eeschema/sch_symbol.cpp
  8. 28
      eeschema/sim/sim_lib_mgr.cpp
  9. 15
      eeschema/sim/sim_lib_mgr.h
  10. 58
      eeschema/sim/sim_model.cpp
  11. 9
      eeschema/sim/sim_model.h
  12. 10
      eeschema/sim/sim_model_ibis.cpp
  13. 2
      eeschema/sim/simulator_frame_ui.cpp
  14. 2
      eeschema/tools/sch_editor_control.cpp

36
eeschema/dialogs/dialog_sim_model.cpp

@ -201,7 +201,7 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
FindField( m_fields, FIELD_T::VALUE )->SetText( wxT( "${SIM.PARAMS}" ) );
}
wxString libraryFilename = GetFieldValue( &m_fields, SIM_LIBRARY::LIBRARY_FIELD );
wxString libraryFilename = GetFieldValue( &m_fields, SIM_LIBRARY::LIBRARY_FIELD, true, 0 );
if( libraryFilename != "" )
{
@ -214,16 +214,16 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
m_infoBar->ShowMessage( reporter.GetMessages() );
m_libraryPathText->ChangeValue( libraryFilename );
m_curModelType = SIM_MODEL::ReadTypeFromFields( m_fields, reporter );
m_curModelType = SIM_MODEL::ReadTypeFromFields( m_fields, true, 0, reporter );
m_libraryModelsMgr.CreateModel( nullptr, m_sortedPartPins, m_fields, reporter );
m_libraryModelsMgr.CreateModel( nullptr, m_sortedPartPins, m_fields, true, 0, reporter );
m_modelListBox->Append( _( "<unknown>" ) );
m_modelListBox->SetSelection( 0 );
}
else
{
std::string modelName = GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD );
std::string modelName = GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD, true, 0 );
int modelIdx = m_modelListBox->FindString( modelName );
if( modelIdx == wxNOT_FOUND )
@ -251,8 +251,7 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
if( m_modelListBoxEntryToLibraryIdx.contains( sel ) )
idx = m_modelListBoxEntryToLibraryIdx.at( sel );
auto ibismodel =
dynamic_cast<SIM_MODEL_IBIS*>( &m_libraryModelsMgr.GetModels()[idx].get() );
auto ibismodel = dynamic_cast<SIM_MODEL_IBIS*>( &m_libraryModelsMgr.GetModels()[idx].get() );
if( ibismodel )
{
@ -262,7 +261,7 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
for( const std::pair<std::string, std::string>& strs : ibismodel->GetIbisPins() )
{
if( strs.first == GetFieldValue( &m_fields, SIM_LIBRARY_IBIS::PIN_FIELD ) )
if( strs.first == GetFieldValue( &m_fields, SIM_LIBRARY_IBIS::PIN_FIELD, true, 0 ) )
{
auto ibisLibrary = static_cast<const SIM_LIBRARY_IBIS*>( library() );
@ -277,10 +276,11 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
{
onPinCombobox( dummyEvent ); // refresh list of models
m_pinModelCombobox->SetStringSelection( GetFieldValue( &m_fields, SIM_LIBRARY_IBIS::MODEL_FIELD ) );
wxString ibisModel = GetFieldValue( &m_fields, SIM_LIBRARY_IBIS::MODEL_FIELD, true, 0 );
m_pinModelCombobox->SetStringSelection( ibisModel );
}
if( GetFieldValue( &m_fields, SIM_LIBRARY_IBIS::DIFF_FIELD ) == "1" )
if( GetFieldValue( &m_fields, SIM_LIBRARY_IBIS::DIFF_FIELD, true, 0 ) == "1" )
{
ibismodel->SwitchSingleEndedDiff( true );
m_differentialCheckbox->SetValue( true );
@ -293,14 +293,14 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
}
}
}
else if( !GetFieldValue( &m_fields, SIM_DEVICE_FIELD ).empty()
|| !GetFieldValue( &m_fields, SIM_DEVICE_SUBTYPE_FIELD ).empty() )
else if( !GetFieldValue( &m_fields, SIM_DEVICE_FIELD, false, 0 ).empty()
|| !GetFieldValue( &m_fields, SIM_DEVICE_SUBTYPE_FIELD, false, 0 ).empty() )
{
// The model is sourced from the instance.
m_rbBuiltinModel->SetValue( true );
reporter.Clear();
m_curModelType = SIM_MODEL::ReadTypeFromFields( m_fields, reporter );
m_curModelType = SIM_MODEL::ReadTypeFromFields( m_fields, true, 0, reporter );
if( reporter.HasMessage() )
DisplayErrorMessage( this, reporter.GetMessages() );
@ -311,7 +311,7 @@ bool DIALOG_SIM_MODEL<T>::TransferDataToWindow()
if( m_rbBuiltinModel->GetValue() && type == m_curModelType )
{
reporter.Clear();
m_builtinModelsMgr.CreateModel( m_fields, m_sortedPartPins, false, reporter );
m_builtinModelsMgr.CreateModel( m_fields, true, 0, m_sortedPartPins, reporter );
if( reporter.HasMessage() )
{
@ -367,7 +367,7 @@ bool DIALOG_SIM_MODEL<T>::TransferDataFromWindow()
if( m_modelListBox->GetSelection() >= 0 )
name = m_modelListBox->GetStringSelection().ToStdString();
else if( dynamic_cast<SIM_MODEL_SPICE_FALLBACK*>( &model ) )
name = GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD, false );
name = GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD, false, 0 );
}
SetFieldValue( m_fields, SIM_LIBRARY::LIBRARY_FIELD, path, false );
@ -468,7 +468,7 @@ void DIALOG_SIM_MODEL<T>::updateWidgets()
updateModelCodeTab( model );
updatePinAssignments( model, model != m_prevModel );
std::string ref = GetFieldValue( &m_fields, SIM_REFERENCE_FIELD );
std::string ref = GetFieldValue( &m_fields, SIM_REFERENCE_FIELD, false, 0 );
m_modelPanel->Layout();
m_pinAssignmentsPanel->Layout();
@ -826,12 +826,12 @@ bool DIALOG_SIM_MODEL<T>::loadLibrary( const wxString& aLibraryPath, REPORTER& a
if( aReporter.HasMessageOfSeverity( RPT_SEVERITY_UNDEFINED | RPT_SEVERITY_ERROR ) )
return false;
std::string modelName = GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD );
std::string modelName = GetFieldValue( &m_fields, SIM_LIBRARY::NAME_FIELD, true, 0 );
for( const auto& [baseModelName, baseModel] : library()->GetModels() )
{
if( baseModelName == modelName )
m_libraryModelsMgr.CreateModel( &baseModel, m_sortedPartPins, m_fields, aReporter );
m_libraryModelsMgr.CreateModel( &baseModel, m_sortedPartPins, m_fields, true, 0, aReporter );
else
m_libraryModelsMgr.CreateModel( &baseModel, m_sortedPartPins, aReporter );
}
@ -1508,7 +1508,7 @@ void DIALOG_SIM_MODEL<T>::onWaveformChoice( wxCommandEvent& aEvent )
try
{
m_libraryModelsMgr.GetModels()[idx].get().ReadDataFields( &m_fields,
m_libraryModelsMgr.GetModels()[idx].get().ReadDataFields( &m_fields, true, 0,
m_sortedPartPins );
}
catch( IO_ERROR& err )

2
eeschema/erc/erc.cpp

@ -1761,7 +1761,7 @@ int ERC_TESTER::TestSimModelIssues()
// Reset for each symbol
reporter.Clear();
SIM_LIBRARY::MODEL model = libMgr.CreateModel( &sheet, *symbol, reporter );
SIM_LIBRARY::MODEL model = libMgr.CreateModel( &sheet, *symbol, true, 0, reporter );
if( reporter.HasMessage() )
{

4
eeschema/netlist_exporters/netlist_exporter_spice.cpp

@ -422,7 +422,7 @@ void NETLIST_EXPORTER_SPICE::readRefName( SCH_SHEET_PATH& aSheet, SCH_SYMBOL& aS
void NETLIST_EXPORTER_SPICE::readModel( SCH_SHEET_PATH& aSheet, SCH_SYMBOL& aSymbol,
SPICE_ITEM& aItem, REPORTER& aReporter )
{
const SIM_LIBRARY::MODEL& libModel = m_libMgr.CreateModel( &aSheet, aSymbol, aReporter );
const SIM_LIBRARY::MODEL& libModel = m_libMgr.CreateModel( &aSheet, aSymbol, true, 0, aReporter );
aItem.baseModelName = libModel.name;
aItem.model = &libModel.model;
@ -491,7 +491,7 @@ void NETLIST_EXPORTER_SPICE::readPinNetNames( SCH_SYMBOL& aSymbol, SPICE_ITEM& a
void NETLIST_EXPORTER_SPICE::getNodePattern( SPICE_ITEM& aItem,
std::vector<std::string>& aModifiers )
{
std::string input = GetFieldValue( &aItem.fields, SIM_NODES_FORMAT_FIELD, true );
std::string input = GetFieldValue( &aItem.fields, SIM_NODES_FORMAT_FIELD, true, 0 );
if( input == "" )
return;

2
eeschema/sch_edit_frame.cpp

@ -1631,7 +1631,7 @@ void SCH_EDIT_FRAME::RefreshOperatingPointDisplay()
simLibMgr.SetFilesStack( embeddedFilesStack );
SIM_MODEL& model = simLibMgr.CreateModel( &GetCurrentSheet(), *symbol, devnull ).model;
SIM_MODEL& model = simLibMgr.CreateModel( &GetCurrentSheet(), *symbol, true, 0, devnull ).model;
SPICE_ITEM spiceItem;
spiceItem.refName = ref;

2
eeschema/sch_field.cpp

@ -750,7 +750,7 @@ void SCH_FIELD::OnScintillaCharAdded( SCINTILLA_TRICKS* aScintillaTricks,
mgr.SetFilesStack( embeddedFilesStack );
SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, devnull ).model;
SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, devnull ).model;
for( wxString pin : model.GetPinNames() )
{

2
eeschema/sch_field.h

@ -407,7 +407,7 @@ inline wxString GetFieldValue( const std::vector<SCH_FIELD>* aFields, FIELD_T aF
inline std::string GetFieldValue( const std::vector<SCH_FIELD>* aFields,
const wxString& aFieldName, bool aResolve = false, int aDepth = 0 )
const wxString& aFieldName, bool aResolve, int aDepth )
{
if( !aFields )
return "";

2
eeschema/sch_symbol.cpp

@ -1323,7 +1323,7 @@ bool SCH_SYMBOL::ResolveTextVar( const SCH_SHEET_PATH* aPath, wxString* token, i
NULL_REPORTER devnull;
SIM_MODEL& model = simLibMgr.CreateModel( aPath, const_cast<SCH_SYMBOL&>( *this ),
devnull, aDepth + 1 ).model;
true, aDepth + 1, devnull ).model;
SPICE_ITEM spiceItem;
spiceItem.refName = GetRef( aPath );

28
eeschema/sim/sim_lib_mgr.cpp

@ -173,16 +173,16 @@ SIM_MODEL& SIM_LIB_MGR::CreateModel( const SIM_MODEL* aBaseModel,
}
SIM_MODEL& SIM_LIB_MGR::CreateModel( const SIM_MODEL* aBaseModel,
const std::vector<SCH_PIN*>& aPins,
const std::vector<SCH_FIELD>& aFields, REPORTER& aReporter )
SIM_MODEL& SIM_LIB_MGR::CreateModel( const SIM_MODEL* aBaseModel, const std::vector<SCH_PIN*>& aPins,
const std::vector<SCH_FIELD>& aFields, bool aResolve, int aDepth,
REPORTER& aReporter )
{
m_models.push_back( SIM_MODEL::Create( aBaseModel, aPins, aFields, aReporter ) );
m_models.push_back( SIM_MODEL::Create( aBaseModel, aPins, aFields, aResolve, aDepth, aReporter ) );
return *m_models.back();
}
SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const SCH_SHEET_PATH* aSheetPath, SCH_SYMBOL& aSymbol,
REPORTER& aReporter, int aDepth )
bool aResolve, int aDepth, REPORTER& aReporter )
{
// Note: currently this creates a resolved model (all Kicad variables references are resolved
// before building the model).
@ -227,7 +227,7 @@ SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const SCH_SHEET_PATH* aSheetPath, S
bool storeInValue = false;
// Infer RLC and VI models if they aren't specified
if( SIM_MODEL::InferSimModel( aSymbol, &fields, true, aDepth, SIM_VALUE_GRAMMAR::NOTATION::SI,
if( SIM_MODEL::InferSimModel( aSymbol, &fields, aResolve, aDepth, SIM_VALUE_GRAMMAR::NOTATION::SI,
&deviceType, &modelType, &modelParams, &pinMap ) )
{
getOrCreateField( SIM_DEVICE_FIELD )->SetText( deviceType );
@ -249,7 +249,7 @@ SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const SCH_SHEET_PATH* aSheetPath, S
return StrNumCmp( lhs->GetNumber(), rhs->GetNumber(), true ) < 0;
} );
SIM_LIBRARY::MODEL model = CreateModel( fields, sourcePins, true, aReporter );
SIM_LIBRARY::MODEL model = CreateModel( fields, aResolve, aDepth, sourcePins, aReporter );
model.model.SetIsStoredInValue( storeInValue );
@ -258,19 +258,20 @@ SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const SCH_SHEET_PATH* aSheetPath, S
SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const std::vector<SCH_FIELD>& aFields,
const std::vector<SCH_PIN*>& aPins, bool aResolved,
bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins,
REPORTER& aReporter )
{
std::string libraryPath = GetFieldValue( &aFields, SIM_LIBRARY::LIBRARY_FIELD );
std::string baseModelName = GetFieldValue( &aFields, SIM_LIBRARY::NAME_FIELD );
std::string libraryPath = GetFieldValue( &aFields, SIM_LIBRARY::LIBRARY_FIELD, aResolve, aDepth );
std::string baseModelName = GetFieldValue( &aFields, SIM_LIBRARY::NAME_FIELD, aResolve, aDepth );
if( libraryPath != "" )
{
return CreateModel( libraryPath, baseModelName, aFields, aPins, aReporter );
return CreateModel( libraryPath, baseModelName, aFields, aResolve, aDepth, aPins, aReporter );
}
else
{
m_models.push_back( SIM_MODEL::Create( aFields, aPins, aResolved, aReporter ) );
m_models.push_back( SIM_MODEL::Create( aFields, aResolve, aDepth, aPins, aReporter ) );
return { baseModelName, *m_models.back() };
}
}
@ -279,6 +280,7 @@ SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const std::vector<SCH_FIELD>& aFiel
SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const wxString& aLibraryPath,
const std::string& aBaseModelName,
const std::vector<SCH_FIELD>& aFields,
bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins,
REPORTER& aReporter )
{
@ -326,7 +328,7 @@ SIM_LIBRARY::MODEL SIM_LIB_MGR::CreateModel( const wxString& aLibraryPath,
}
}
m_models.push_back( SIM_MODEL::Create( baseModel, aPins, aFields, aReporter ) );
m_models.push_back( SIM_MODEL::Create( baseModel, aPins, aFields, aResolve, aDepth, aReporter ) );
return { modelName, *m_models.back() };
}

15
eeschema/sim/sim_lib_mgr.h

@ -58,19 +58,18 @@ public:
REPORTER& aReporter );
SIM_MODEL& CreateModel( const SIM_MODEL* aBaseModel, const std::vector<SCH_PIN*>& aPins,
const std::vector<SCH_FIELD>& aFields, REPORTER& aReporter );
const std::vector<SCH_FIELD>& aFields, bool aResolve, int aDepth,
REPORTER& aReporter );
// TODO: The argument can be made const.
SIM_LIBRARY::MODEL CreateModel( const SCH_SHEET_PATH* aSheetPath, SCH_SYMBOL& aSymbol,
REPORTER& aReporter, int aDepth = 0 );
bool aResolve, int aDepth, REPORTER& aReporter );
SIM_LIBRARY::MODEL CreateModel( const std::vector<SCH_FIELD>& aFields,
const std::vector<SCH_PIN*>& aPins, bool aResolved,
REPORTER& aReporter );
SIM_LIBRARY::MODEL CreateModel( const std::vector<SCH_FIELD>& aFields, bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins, REPORTER& aReporter );
SIM_LIBRARY::MODEL CreateModel( const wxString& aLibraryPath,
const std::string& aBaseModelName,
const std::vector<SCH_FIELD>& aFields,
SIM_LIBRARY::MODEL CreateModel( const wxString& aLibraryPath, const std::string& aBaseModelName,
const std::vector<SCH_FIELD>& aFields, bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins, REPORTER& aReporter );
void SetModel( int aIndex, std::unique_ptr<SIM_MODEL> aModel );

58
eeschema/sim/sim_model.cpp

@ -387,10 +387,11 @@ SIM_MODEL::SPICE_INFO SIM_MODEL::SpiceInfo( TYPE aType )
}
TYPE SIM_MODEL::ReadTypeFromFields( const std::vector<SCH_FIELD>& aFields, REPORTER& aReporter )
TYPE SIM_MODEL::ReadTypeFromFields( const std::vector<SCH_FIELD>& aFields, bool aResolve, int aDepth,
REPORTER& aReporter )
{
std::string deviceTypeFieldValue = GetFieldValue( &aFields, SIM_DEVICE_FIELD );
std::string typeFieldValue = GetFieldValue( &aFields, SIM_DEVICE_SUBTYPE_FIELD );
std::string deviceTypeFieldValue = GetFieldValue( &aFields, SIM_DEVICE_FIELD, aResolve, aDepth );
std::string typeFieldValue = GetFieldValue( &aFields, SIM_DEVICE_SUBTYPE_FIELD, aResolve, aDepth );
if( !deviceTypeFieldValue.empty() )
{
@ -426,21 +427,21 @@ TYPE SIM_MODEL::ReadTypeFromFields( const std::vector<SCH_FIELD>& aFields, REPOR
}
void SIM_MODEL::ReadDataFields( const std::vector<SCH_FIELD>* aFields,
void SIM_MODEL::ReadDataFields( const std::vector<SCH_FIELD>* aFields, bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins )
{
bool diffMode = GetFieldValue( aFields, SIM_LIBRARY_IBIS::DIFF_FIELD ) == "1";
bool diffMode = GetFieldValue( aFields, SIM_LIBRARY_IBIS::DIFF_FIELD, aResolve, aDepth ) == "1";
SwitchSingleEndedDiff( diffMode );
m_serializer->ParseEnable( GetFieldValue( aFields, SIM_LEGACY_ENABLE_FIELD_V7 ) );
m_serializer->ParseEnable( GetFieldValue( aFields, SIM_LEGACY_ENABLE_FIELD_V7, aResolve, aDepth ) );
createPins( aPins );
m_serializer->ParsePins( GetFieldValue( aFields, SIM_PINS_FIELD ) );
m_serializer->ParsePins( GetFieldValue( aFields, SIM_PINS_FIELD, aResolve, aDepth ) );
std::string paramsField = GetFieldValue( aFields, SIM_PARAMS_FIELD );
std::string paramsField = GetFieldValue( aFields, SIM_PARAMS_FIELD, aResolve, aDepth );
if( !m_serializer->ParseParams( paramsField ) )
m_serializer->ParseValue( GetFieldValue( aFields, SIM_VALUE_FIELD ) );
m_serializer->ParseValue( GetFieldValue( aFields, SIM_VALUE_FIELD, aResolve, aDepth ) );
}
@ -486,7 +487,8 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( TYPE aType, const std::vector<SCH_
try
{
// Passing nullptr to ReadDataFields will make it act as if all fields were empty.
model->ReadDataFields( static_cast<const std::vector<SCH_FIELD>*>( nullptr ), aPins );
model->ReadDataFields( static_cast<const std::vector<SCH_FIELD>*>( nullptr ),
false, 0, aPins );
}
catch( IO_ERROR& )
{
@ -523,7 +525,8 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const SIM_MODEL* aBaseModel,
try
{
model->ReadDataFields( static_cast<const std::vector<SCH_FIELD>*>( nullptr ), aPins );
model->ReadDataFields( static_cast<const std::vector<SCH_FIELD>*>( nullptr ),
false, 0, aPins );
}
catch( IO_ERROR& )
{
@ -537,7 +540,7 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const SIM_MODEL* aBaseModel,
std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const SIM_MODEL* aBaseModel,
const std::vector<SCH_PIN*>& aPins,
const std::vector<SCH_FIELD>& aFields,
REPORTER& aReporter )
bool aResolve, int aDepth, REPORTER& aReporter )
{
std::unique_ptr<SIM_MODEL> model;
@ -545,7 +548,7 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const SIM_MODEL* aBaseModel,
{
NULL_REPORTER devnull;
TYPE type = aBaseModel->GetType();
TYPE type_override = ReadTypeFromFields( aFields, devnull );
TYPE type_override = ReadTypeFromFields( aFields, aResolve, aDepth, devnull );
// Check for an override in the case of IBIS models.
// The other models require type to be set from the base model.
@ -566,18 +569,17 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const SIM_MODEL* aBaseModel,
}
else // No base model means the model wasn't found in the library, so create a fallback
{
TYPE type = ReadTypeFromFields( aFields, aReporter );
TYPE type = ReadTypeFromFields( aFields, aResolve, aDepth, aReporter );
model = std::make_unique<SIM_MODEL_SPICE_FALLBACK>( type );
}
try
{
model->ReadDataFields( &aFields, aPins );
model->ReadDataFields( &aFields, aResolve, aDepth, aPins );
}
catch( IO_ERROR& err )
{
aReporter.Report( wxString::Format( _( "Error reading simulation model from "
"symbol '%s':\n%s" ),
aReporter.Report( wxString::Format( _( "Error reading simulation model from symbol '%s':\n%s" ),
GetFieldValue( &aFields, FIELD_T::REFERENCE ),
err.Problem() ),
RPT_SEVERITY_ERROR );
@ -588,19 +590,19 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const SIM_MODEL* aBaseModel,
std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const std::vector<SCH_FIELD>& aFields,
const std::vector<SCH_PIN*>& aPins,
bool aResolved, REPORTER& aReporter )
bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins, REPORTER& aReporter )
{
TYPE type = ReadTypeFromFields( aFields, aReporter );
TYPE type = ReadTypeFromFields( aFields, aResolve, aDepth, aReporter );
std::unique_ptr<SIM_MODEL> model = SIM_MODEL::Create( type );
try
{
model->ReadDataFields( &aFields, aPins );
model->ReadDataFields( &aFields, aResolve, aDepth, aPins );
}
catch( const IO_ERROR& parse_err )
{
if( !aResolved )
if( !aResolve )
{
aReporter.Report( parse_err.What(), RPT_SEVERITY_ERROR );
return model;
@ -609,23 +611,22 @@ std::unique_ptr<SIM_MODEL> SIM_MODEL::Create( const std::vector<SCH_FIELD>& aFie
// Just because we can't parse it doesn't mean that a SPICE interpreter can't. Fall
// back to a raw spice code model.
std::string modelData = GetFieldValue( &aFields, SIM_PARAMS_FIELD );
std::string modelData = GetFieldValue( &aFields, SIM_PARAMS_FIELD, aResolve, aDepth );
if( modelData.empty() )
modelData = GetFieldValue( &aFields, SIM_VALUE_FIELD );
modelData = GetFieldValue( &aFields, SIM_VALUE_FIELD, aResolve, aDepth );
model = std::make_unique<SIM_MODEL_RAW_SPICE>( modelData );
try
{
model->createPins( aPins );
model->m_serializer->ParsePins( GetFieldValue( &aFields, SIM_PINS_FIELD ) );
model->m_serializer->ParsePins( GetFieldValue( &aFields, SIM_PINS_FIELD, aResolve, aDepth ) );
}
catch( const IO_ERROR& err )
{
// We own the pin syntax, so if we can't parse it then there's an error.
aReporter.Report( wxString::Format( _( "Error reading simulation model from "
"symbol '%s':\n%s" ),
aReporter.Report( wxString::Format( _( "Error reading simulation model from symbol '%s':\n%s" ),
GetFieldValue( &aFields, FIELD_T::REFERENCE ),
err.Problem() ),
RPT_SEVERITY_ERROR );
@ -1699,7 +1700,8 @@ void SIM_MODEL::MigrateSimModel( T& aSymbol, const PROJECT* aProject )
lazySortSourcePins();
SIM_LIBRARY::MODEL simModel = libMgr.CreateModel( lib, model.ToStdString(),
emptyFields, sourcePins, reporter );
emptyFields, false, 0,
sourcePins, reporter );
if( reporter.HasMessage() )
libraryModel = false; // Fall back to raw spice model

9
eeschema/sim/sim_model.h

@ -407,7 +407,8 @@ public:
static SPICE_INFO SpiceInfo( TYPE aType );
static TYPE ReadTypeFromFields( const std::vector<SCH_FIELD>& aFields, REPORTER& aReporter );
static TYPE ReadTypeFromFields( const std::vector<SCH_FIELD>& aFields,
bool aResolve, int aDepth, REPORTER& aReporter );
static std::unique_ptr<SIM_MODEL> Create( TYPE aType, const std::vector<SCH_PIN*>& aPins,
REPORTER& aReporter );
@ -419,11 +420,13 @@ public:
static std::unique_ptr<SIM_MODEL> Create( const SIM_MODEL* aBaseModel,
const std::vector<SCH_PIN*>& aPins,
const std::vector<SCH_FIELD>& aFields,
bool aResolve, int aDepth,
REPORTER& aReporter );
static std::unique_ptr<SIM_MODEL> Create( const std::vector<SCH_FIELD>& aFields,
bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins,
bool aResolved, REPORTER& aReporter );
REPORTER& aReporter );
const SPICE_GENERATOR& SpiceGenerator() const { return *m_spiceGenerator; }
const SIM_MODEL_SERIALIZER& Serializer() const { return *m_serializer; }
@ -437,7 +440,7 @@ public:
SIM_MODEL( SIM_MODEL&& aOther ) = default;
SIM_MODEL& operator=(SIM_MODEL&& aOther ) = delete;
void ReadDataFields( const std::vector<SCH_FIELD>* aFields,
void ReadDataFields( const std::vector<SCH_FIELD>* aFields, bool aResolve, int aDepth,
const std::vector<SCH_PIN*>& aPins );
void WriteFields( std::vector<SCH_FIELD>& aFields ) const;

10
eeschema/sim/sim_model_ibis.cpp

@ -55,11 +55,11 @@ std::vector<std::string> SPICE_GENERATOR_IBIS::CurrentNames( const SPICE_ITEM& a
std::string SPICE_GENERATOR_IBIS::IbisDevice( const SPICE_ITEM& aItem, SCHEMATIC* aSchematic,
const wxString& aCacheDir, REPORTER& aReporter ) const
{
std::string ibisLibFilename = GetFieldValue( &aItem.fields, SIM_LIBRARY::LIBRARY_FIELD );
std::string ibisCompName = GetFieldValue( &aItem.fields, SIM_LIBRARY::NAME_FIELD );
std::string ibisPinName = GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::PIN_FIELD );
std::string ibisModelName = GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::MODEL_FIELD );
bool diffMode = GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::DIFF_FIELD ) == "1";
std::string ibisLibFilename = GetFieldValue( &aItem.fields, SIM_LIBRARY::LIBRARY_FIELD, true, 0 );
std::string ibisCompName = GetFieldValue( &aItem.fields, SIM_LIBRARY::NAME_FIELD, true, 0 );
std::string ibisPinName = GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::PIN_FIELD, true, 0 );
std::string ibisModelName = GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::MODEL_FIELD, true, 0 );
bool diffMode = GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::DIFF_FIELD, true, 0 ) == "1";
WX_STRING_REPORTER reporter;
SIM_LIB_MGR mgr( &aSchematic->Prj() );

2
eeschema/sim/simulator_frame_ui.cpp

@ -1672,7 +1672,7 @@ void SIMULATOR_FRAME_UI::UpdateTunerValue( const SCH_SHEET_PATH& aSheetPath, con
mgr.SetFilesStack( embeddedFilesStack );
SIM_MODEL& model = mgr.CreateModel( &aSheetPath, *symbol, devnull ).model;
SIM_MODEL& model = mgr.CreateModel( &aSheetPath, *symbol, true, 0, devnull ).model;
const SIM_MODEL::PARAM* tunerParam = model.GetTunerParam();

2
eeschema/tools/sch_editor_control.cpp

@ -591,7 +591,7 @@ int SCH_EDITOR_CONTROL::SimProbe( const TOOL_EVENT& aEvent )
mgr.SetFilesStack( embeddedFilesStack );
SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, reporter ).model;
SIM_MODEL& model = mgr.CreateModel( &sheet, *symbol, true, 0, reporter ).model;
if( reporter.HasMessage() )
THROW_IO_ERROR( reporter.GetMessages() );

Loading…
Cancel
Save