From 2475a703d67e8d132f28ea6c519a9450b74c9cc7 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sun, 16 Oct 2022 05:10:57 +0200 Subject: [PATCH] Sim Model Editor: Checkbox for toggling inference --- eeschema/dialogs/dialog_sim_model.cpp | 20 +++ eeschema/dialogs/dialog_sim_model.h | 1 + eeschema/dialogs/dialog_sim_model_base.cpp | 13 +- eeschema/dialogs/dialog_sim_model_base.fbp | 197 +++++++++++++++------ eeschema/dialogs/dialog_sim_model_base.h | 2 + eeschema/sim/sim_model.cpp | 37 ++-- eeschema/sim/sim_model.h | 5 + eeschema/sim/sim_model_ideal.cpp | 7 +- eeschema/sim/sim_model_ideal.h | 2 - eeschema/sim/sim_model_source.cpp | 16 +- eeschema/sim/sim_model_source.h | 3 - 11 files changed, 213 insertions(+), 90 deletions(-) diff --git a/eeschema/dialogs/dialog_sim_model.cpp b/eeschema/dialogs/dialog_sim_model.cpp index 8eac1bef87..07d7cda5f9 100644 --- a/eeschema/dialogs/dialog_sim_model.cpp +++ b/eeschema/dialogs/dialog_sim_model.cpp @@ -189,6 +189,11 @@ bool DIALOG_SIM_MODEL::TransferDataToWindow() m_overrideCheckbox->SetValue( curModel().HasNonInstanceOverrides() ); m_excludeCheckbox->SetValue( !curModel().IsEnabled() ); + m_inferCheckbox->SetValue( curModel().IsInferred() ); + + std::string ref = SIM_MODEL::GetFieldValue( &m_fields, SIM_MODEL::REFERENCE_FIELD ); + m_inferCheckbox->Show( + SIM_MODEL::InferDeviceTypeFromRef( ref ) != SIM_MODEL::DEVICE_TYPE_::NONE ); updateWidgets(); @@ -248,10 +253,18 @@ bool DIALOG_SIM_MODEL::TransferDataFromWindow() template void DIALOG_SIM_MODEL::updateWidgets() { + m_overrideCheckbox->SetValue( curModel().HasNonInstanceOverrides() ); + updateIbisWidgets(); updateModelParamsTab(); updateModelCodeTab(); updatePinAssignments(); + + m_excludeCheckbox->SetValue( !curModel().IsEnabled() ); + + std::string ref = SIM_MODEL::GetFieldValue( &m_fields, SIM_MODEL::REFERENCE_FIELD ); + m_inferCheckbox->Enable( SIM_MODEL::InferDeviceTypeFromRef( ref ) == curModel().GetDeviceType() ); + m_inferCheckbox->SetValue( curModel().IsInferred() ); m_modelPanel->Layout(); m_pinAssignmentsPanel->Layout(); @@ -1135,6 +1148,13 @@ void DIALOG_SIM_MODEL::onExcludeCheckbox( wxCommandEvent& aEvent ) } +template +void DIALOG_SIM_MODEL::onInferCheckbox( wxCommandEvent& aEvent ) +{ + curModel().SetIsInferred( m_inferCheckbox->GetValue() ); +} + + template void DIALOG_SIM_MODEL::onLibraryPathUpdate( wxUpdateUIEvent& aEvent ) { diff --git a/eeschema/dialogs/dialog_sim_model.h b/eeschema/dialogs/dialog_sim_model.h index c3f1ea39c2..64f14efdea 100644 --- a/eeschema/dialogs/dialog_sim_model.h +++ b/eeschema/dialogs/dialog_sim_model.h @@ -115,6 +115,7 @@ private: void onPinAssignmentsGridCellChange( wxGridEvent& aEvent ) override; void onPinAssignmentsGridSize( wxSizeEvent& aEvent ) override; void onExcludeCheckbox( wxCommandEvent& aEvent ) override; + void onInferCheckbox( wxCommandEvent& aEvent ) override; void onLibraryPathUpdate( wxUpdateUIEvent& aEvent ) override; void onBrowseButtonUpdate( wxUpdateUIEvent& aEvent ) override; diff --git a/eeschema/dialogs/dialog_sim_model_base.cpp b/eeschema/dialogs/dialog_sim_model_base.cpp index fa25e535d9..8d1d6f7c42 100644 --- a/eeschema/dialogs/dialog_sim_model_base.cpp +++ b/eeschema/dialogs/dialog_sim_model_base.cpp @@ -236,8 +236,17 @@ DIALOG_SIM_MODEL_BASE::DIALOG_SIM_MODEL_BASE( wxWindow* parent, wxWindowID id, c m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bSizer8->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); + wxGridSizer* gSizer1; + gSizer1 = new wxGridSizer( 0, 2, 0, 0 ); + m_excludeCheckbox = new wxCheckBox( this, wxID_ANY, _("Exclude from simulation"), wxDefaultPosition, wxDefaultSize, 0 ); - bSizer8->Add( m_excludeCheckbox, 0, wxALL, 5 ); + gSizer1->Add( m_excludeCheckbox, 0, wxALL, 5 ); + + m_inferCheckbox = new wxCheckBox( this, wxID_ANY, _("Store in Reference and Value"), wxDefaultPosition, wxDefaultSize, 0 ); + gSizer1->Add( m_inferCheckbox, 0, wxALIGN_RIGHT|wxALL, 5 ); + + + bSizer8->Add( gSizer1, 0, wxEXPAND, 5 ); m_sdbSizer1 = new wxStdDialogButtonSizer(); m_sdbSizer1OK = new wxButton( this, wxID_OK ); @@ -283,6 +292,7 @@ DIALOG_SIM_MODEL_BASE::DIALOG_SIM_MODEL_BASE( wxWindow* parent, wxWindowID id, c m_pinAssignmentsGrid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_SIM_MODEL_BASE::onPinAssignmentsGridCellChange ), NULL, this ); m_pinAssignmentsGrid->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_SIM_MODEL_BASE::onPinAssignmentsGridSize ), NULL, this ); m_excludeCheckbox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onExcludeCheckbox ), NULL, this ); + m_inferCheckbox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onInferCheckbox ), NULL, this ); } DIALOG_SIM_MODEL_BASE::~DIALOG_SIM_MODEL_BASE() @@ -316,5 +326,6 @@ DIALOG_SIM_MODEL_BASE::~DIALOG_SIM_MODEL_BASE() m_pinAssignmentsGrid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_SIM_MODEL_BASE::onPinAssignmentsGridCellChange ), NULL, this ); m_pinAssignmentsGrid->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_SIM_MODEL_BASE::onPinAssignmentsGridSize ), NULL, this ); m_excludeCheckbox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onExcludeCheckbox ), NULL, this ); + m_inferCheckbox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_SIM_MODEL_BASE::onInferCheckbox ), NULL, this ); } diff --git a/eeschema/dialogs/dialog_sim_model_base.fbp b/eeschema/dialogs/dialog_sim_model_base.fbp index 9fe5acfb16..1055126e3c 100644 --- a/eeschema/dialogs/dialog_sim_model_base.fbp +++ b/eeschema/dialogs/dialog_sim_model_base.fbp @@ -1800,67 +1800,146 @@ 5 - wxALL + wxEXPAND 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Exclude from simulation - - 0 - - - 0 + + 2 + 0 - 1 - m_excludeCheckbox - 1 - - - protected - 1 - - Resizable - 1 - - - ; ; forward_declare - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - onExcludeCheckbox + gSizer1 + none + 0 + 0 + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Exclude from simulation + + 0 + + + 0 + + 1 + m_excludeCheckbox + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onExcludeCheckbox + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Store in Reference and Value + + 0 + + + 0 + + 1 + m_inferCheckbox + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + onInferCheckbox + + diff --git a/eeschema/dialogs/dialog_sim_model_base.h b/eeschema/dialogs/dialog_sim_model_base.h index a608ef5e67..168601c9bd 100644 --- a/eeschema/dialogs/dialog_sim_model_base.h +++ b/eeschema/dialogs/dialog_sim_model_base.h @@ -79,6 +79,7 @@ class DIALOG_SIM_MODEL_BASE : public DIALOG_SHIM WX_GRID* m_pinAssignmentsGrid; wxStaticLine* m_staticline1; wxCheckBox* m_excludeCheckbox; + wxCheckBox* m_inferCheckbox; wxStdDialogButtonSizer* m_sdbSizer1; wxButton* m_sdbSizer1OK; wxButton* m_sdbSizer1Cancel; @@ -107,6 +108,7 @@ class DIALOG_SIM_MODEL_BASE : public DIALOG_SHIM virtual void onPinAssignmentsGridCellChange( wxGridEvent& event ) { event.Skip(); } virtual void onPinAssignmentsGridSize( wxSizeEvent& event ) { event.Skip(); } virtual void onExcludeCheckbox( wxCommandEvent& event ) { event.Skip(); } + virtual void onInferCheckbox( wxCommandEvent& event ) { event.Skip(); } public: diff --git a/eeschema/sim/sim_model.cpp b/eeschema/sim/sim_model.cpp index f861ac57b9..fdab171fba 100644 --- a/eeschema/sim/sim_model.cpp +++ b/eeschema/sim/sim_model.cpp @@ -432,6 +432,26 @@ TYPE SIM_MODEL::ReadTypeFromFields( const std::vector& aFields ) } +DEVICE_TYPE SIM_MODEL::InferDeviceTypeFromRef( const std::string& aRef ) +{ + + if( boost::starts_with( aRef, "R" ) ) + return DEVICE_TYPE::R; + else if( boost::starts_with( aRef, "C" ) ) + return DEVICE_TYPE::C; + else if( boost::starts_with( aRef, "L" ) ) + return DEVICE_TYPE::L; + else if( boost::starts_with( aRef, "V" ) ) + return DEVICE_TYPE::V; + else if( boost::starts_with( aRef, "I" ) ) + return DEVICE_TYPE::I; + else if( boost::starts_with( aRef, "TL" ) ) + return DEVICE_TYPE::TLINE; + + return DEVICE_TYPE::NONE; +} + + TYPE SIM_MODEL::InferTypeFromRefAndValue( const std::string& aRef, const std::string& aValue ) { std::string prefix; @@ -454,22 +474,7 @@ TYPE SIM_MODEL::InferTypeFromRefAndValue( const std::string& aRef, const std::st { } - DEVICE_TYPE_ deviceType = DEVICE_TYPE_::NONE; - - if( boost::starts_with( aRef, "R" ) ) - deviceType = DEVICE_TYPE_::R; - else if( boost::starts_with( aRef, "C" ) ) - deviceType = DEVICE_TYPE_::C; - else if( boost::starts_with( aRef, "L" ) ) - deviceType = DEVICE_TYPE_::L; - else if( boost::starts_with( aRef, "V" ) ) - deviceType = DEVICE_TYPE_::V; - else if( boost::starts_with( aRef, "I" ) ) - deviceType = DEVICE_TYPE_::I; - else if( boost::starts_with( aRef, "TL" ) ) - deviceType = DEVICE_TYPE_::TLINE; - else - return TYPE::NONE; + DEVICE_TYPE deviceType = InferDeviceTypeFromRef( aRef ); for( TYPE type : TYPE_ITERATOR() ) { diff --git a/eeschema/sim/sim_model.h b/eeschema/sim/sim_model.h index 1444de18f9..993acc14cb 100644 --- a/eeschema/sim/sim_model.h +++ b/eeschema/sim/sim_model.h @@ -484,6 +484,8 @@ public: template static TYPE ReadTypeFromFields( const std::vector& aFields ); + static DEVICE_TYPE_ InferDeviceTypeFromRef( const std::string& aRef ); + static TYPE InferTypeFromRefAndValue( const std::string& aRef, const std::string& aValue ); template @@ -603,6 +605,9 @@ public: void SetIsEnabled( bool aIsEnabled ) { m_isEnabled = aIsEnabled; } bool IsEnabled() const { return m_isEnabled; } + void SetIsInferred( bool aIsInferred ) { m_isInferred = aIsInferred; } + bool IsInferred() const { return m_isInferred; } + protected: static std::unique_ptr Create( TYPE aType ); diff --git a/eeschema/sim/sim_model_ideal.cpp b/eeschema/sim/sim_model_ideal.cpp index 3ae3675553..516dfc00c4 100644 --- a/eeschema/sim/sim_model_ideal.cpp +++ b/eeschema/sim/sim_model_ideal.cpp @@ -46,8 +46,7 @@ std::string SPICE_GENERATOR_IDEAL::ItemLine( const SPICE_ITEM& aItem ) const SIM_MODEL_IDEAL::SIM_MODEL_IDEAL( TYPE aType ) : - SIM_MODEL( aType, std::make_unique( *this ) ), - m_isInferred( false ) + SIM_MODEL( aType, std::make_unique( *this ) ) { static PARAM::INFO resistor = makeParamInfo( "r", "Resistance", "Ω" ); static PARAM::INFO capacitor = makeParamInfo( "c", "Capacitance", "F" ); @@ -68,7 +67,7 @@ void SIM_MODEL_IDEAL::WriteDataSchFields( std::vector& aFields ) cons { SIM_MODEL::WriteDataSchFields( aFields ); - if( m_isInferred ) + if( IsInferred() ) inferredWriteDataFields( aFields ); } @@ -77,7 +76,7 @@ void SIM_MODEL_IDEAL::WriteDataLibFields( std::vector& aFields ) cons { SIM_MODEL::WriteDataLibFields( aFields ); - if( m_isInferred ) + if( IsInferred() ) inferredWriteDataFields( aFields ); } diff --git a/eeschema/sim/sim_model_ideal.h b/eeschema/sim/sim_model_ideal.h index 0fea01c44e..a0e029db82 100644 --- a/eeschema/sim/sim_model_ideal.h +++ b/eeschema/sim/sim_model_ideal.h @@ -54,8 +54,6 @@ private: std::vector getPinNames() const override { return { "+", "-" }; } static PARAM::INFO makeParamInfo( std::string aName, std::string aDescription, std::string aUnit ); - - bool m_isInferred; }; #endif // SIM_MODEL_IDEAL_H diff --git a/eeschema/sim/sim_model_source.cpp b/eeschema/sim/sim_model_source.cpp index 2d2f0bad5a..97ceaa098f 100644 --- a/eeschema/sim/sim_model_source.cpp +++ b/eeschema/sim/sim_model_source.cpp @@ -199,8 +199,7 @@ std::string SPICE_GENERATOR_SOURCE::getParamValueString( const std::string& aPar SIM_MODEL_SOURCE::SIM_MODEL_SOURCE( TYPE aType ) - : SIM_MODEL( aType, std::make_unique( *this ) ), - m_isInferred( false ) + : SIM_MODEL( aType, std::make_unique( *this ) ) { for( const SIM_MODEL::PARAM::INFO& paramInfo : makeParamInfos( aType ) ) AddParam( paramInfo ); @@ -211,7 +210,7 @@ void SIM_MODEL_SOURCE::WriteDataSchFields( std::vector& aFields ) con { SIM_MODEL::WriteDataSchFields( aFields ); - if( m_isInferred ) + if( IsInferred() ) inferredWriteDataFields( aFields ); } @@ -220,7 +219,7 @@ void SIM_MODEL_SOURCE::WriteDataLibFields( std::vector& aFields ) con { SIM_MODEL::WriteDataLibFields( aFields ); - if( m_isInferred ) + if( IsInferred() ) inferredWriteDataFields( aFields ); } @@ -266,7 +265,14 @@ std::string SIM_MODEL_SOURCE::GenerateParamValuePair( const PARAM& aParam, bool& template void SIM_MODEL_SOURCE::inferredWriteDataFields( std::vector& aFields ) const { - std::string value = GetFieldValue( &aFields, PARAMS_FIELD ); + std::string value; + + if( GetTypeInfo().fieldValue != "" ) + value = fmt::format( "{} {}", + GetTypeInfo().fieldValue, + GetFieldValue( &aFields, PARAMS_FIELD ) ); + else + value = fmt::format( "{}", GetFieldValue( &aFields, PARAMS_FIELD ) ); if( value == "" ) value = GetDeviceTypeInfo().fieldValue; diff --git a/eeschema/sim/sim_model_source.h b/eeschema/sim/sim_model_source.h index 2ad415c553..ddc08ca122 100644 --- a/eeschema/sim/sim_model_source.h +++ b/eeschema/sim/sim_model_source.h @@ -98,9 +98,6 @@ private: static std::vector makeRandomPoissonParamInfos( std::string aPrefix, std::string aUnit ); static void appendAcParamInfos( std::vector& aParamInfos, std::string aUnit ); - - - bool m_isInferred; }; #endif // SIM_MODEL_SOURCE_H