KiCad PCB EDA Suite
Loading...
Searching...
No Matches
simulator_frame_ui.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2016-2023 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * @author Tomasz Wlostowski <[email protected]>
8 * @author Maciej Suminski <[email protected]>
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 3
13 * of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, you may find one here:
22 * https://www.gnu.org/licenses/gpl-3.0.html
23 * or you may search the http://www.gnu.org website for the version 3 license,
24 * or you may write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26 */
27
28#ifndef SIMULATOR_FRAME_UI_H
29#define SIMULATOR_FRAME_UI_H
30
31
33#include <sim/sim_types.h>
34#include <sim/sim_plot_tab.h>
35#include <sim/sim_preferences.h>
36
37#include <wx/event.h>
38
39class SCH_EDIT_FRAME;
40class SCH_SYMBOL;
41
42class SPICE_SIMULATOR;
43class SPICE_SETTINGS;
46
48class TUNER_SLIDER;
49
50
71{
72public:
73 SIMULATOR_FRAME_UI( SIMULATOR_FRAME* aSimulatorFrame, SCH_EDIT_FRAME* aSchematicFrame );
75
81 SIM_TAB* NewSimTab( const wxString& aSimCommand );
82
83 std::vector<wxString> SimPlotVectors() const;
84
85 std::vector<wxString> Signals() const;
86
87 const std::map<int, wxString>& UserDefinedSignals() { return m_userDefinedSignals; }
88 void SetUserDefinedSignals( const std::map<int, wxString>& aSignals );
89
96 void CreateNewCursor();
97
103 void DeleteCursor();
104
111 void AddTrace( const wxString& aName, SIM_TRACE_TYPE aType );
112
117 SPICE_VALUE_FORMAT GetCursorFormat( int aCursorId, int aValueCol ) const
118 {
119 return m_cursorFormatsDyn[aCursorId][aValueCol];
120 }
121
122 void SetCursorFormat( int aCursorId, int aValueCol, const SPICE_VALUE_FORMAT& aFormat )
123 {
124 m_cursorFormatsDyn[ aCursorId ][ aValueCol ] = aFormat;
125
126 wxCommandEvent dummy;
128 }
129
133 void AddTuner( const SCH_SHEET_PATH& aSheetPath, SCH_SYMBOL* aSymbol );
134
138 void RemoveTuner( TUNER_SLIDER* aTuner );
139
148 void UpdateTunerValue( const SCH_SHEET_PATH& aSheetPath, const KIID& aSymbol,
149 const wxString& aRef, const wxString& aValue );
150
154 void AddMeasurement( const wxString& aCmd );
155
159 void DeleteMeasurement( int aRow );
160
164 SPICE_VALUE_FORMAT GetMeasureFormat( int aRow ) const;
165 void SetMeasureFormat( int aRow, const SPICE_VALUE_FORMAT& aFormat );
166
170 void UpdateMeasurement( int aRow );
171
172 void DoFourier( const wxString& aSignal, const wxString& aFundamental );
173
177 const SPICE_CIRCUIT_MODEL* GetExporter() const;
178
179 bool IsConsoleShown();
180 void ToggleConsole();
181 bool IsSidePanelShown();
183
184 bool DarkModePlots() const { return m_darkMode; }
185 void ToggleDarkModePlots();
186
187 void ShowChangedLanguage();
188
193 void InitWorkbook();
194
198 bool LoadWorkbook( const wxString& aPath );
199
203 bool SaveWorkbook( const wxString& aPath );
204
205 void LoadSettings( EESCHEMA_SETTINGS* aCfg );
206
207 void SaveSettings( EESCHEMA_SETTINGS* aCfg );
208
212 void ApplyPreferences( const SIM_PREFERENCES& aPrefs );
213
221
226 {
227 return dynamic_cast<SIM_TAB*>( m_plotNotebook->GetCurrentPage() );
228 }
229
230 SIM_TAB* GetSimTab( SIM_TYPE aType ) const
231 {
232 for( int ii = 0; ii < (int) m_plotNotebook->GetPageCount(); ++ii )
233 {
234 SIM_TAB* candidate = dynamic_cast<SIM_TAB*>( m_plotNotebook->GetPage( ii ) );
235
236 if( candidate && candidate->GetSimType() == aType )
237 return candidate;
238 }
239
240 return nullptr;
241 }
242
243 int GetSimTabIndex( SIM_TAB* aPlot ) const
244 {
245 return m_plotNotebook->GetPageIndex( aPlot );
246 }
247
249
250 void OnSimUpdate();
251 void OnSimReport( const wxString& aMsg );
252 void OnSimRefresh( bool aFinal );
253
254 void OnModify();
255
256private:
260 wxString vectorNameFromSignalName( SIM_PLOT_TAB* aPlotTab, const wxString& aSignalName,
261 int* aTraceType );
262
271 void updateTrace( const wxString& aVectorName, int aTraceType, SIM_PLOT_TAB* aPlotTab,
272 std::vector<double>* aDataX = nullptr, bool aClearData = false );
273
277 void TogglePanel( wxPanel* aPanel, wxSplitterWindow* aSplitterWindow, int& aSashPosition );
278
284 void CustomCursorsInit();
285
291 void rebuildSignalsList();
292
296 void rebuildSignalsGrid( wxString aFilter );
297
301 void updateSignalsGrid();
302
306 void updatePlotCursors();
307
315 template <typename T, typename U, typename R>
316 void signalsGridCursorUpdate( T t, U u, R r );
317
322
327
329
333 void applyTuners();
334
338 SIM_TRACE_TYPE getXAxisType( SIM_TYPE aType ) const;
339
340 wxString getNoiseSource() const;
341
342 void parseTraceParams( SIM_PLOT_TAB* aPlotTab, TRACE* aTrace, const wxString& aSignalName,
343 const wxString& aParams );
344
345 std::shared_ptr<SPICE_SIMULATOR> simulator() const;
346 std::shared_ptr<SPICE_CIRCUIT_MODEL> circuitModel() const;
347
348 // Event handlers
349 void onPlotClose( wxAuiNotebookEvent& event ) override;
350 void onPlotClosed( wxAuiNotebookEvent& event ) override;
351 void onPlotChanging( wxAuiNotebookEvent& event ) override;
352 void onPlotChanged( wxAuiNotebookEvent& event ) override;
353 void onPlotDragged( wxAuiNotebookEvent& event ) override;
354
355 void OnFilterText( wxCommandEvent& aEvent ) override;
356 void OnFilterMouseMoved( wxMouseEvent& aEvent ) override;
357
358 void onSignalsGridCellChanged( wxGridEvent& aEvent ) override;
359 void onCursorsGridCellChanged( wxGridEvent& aEvent ) override;
360 void onMeasurementsGridCellChanged( wxGridEvent& aEvent ) override;
361
362 void OnUpdateUI( wxUpdateUIEvent& event ) override;
363
364 bool loadLegacyWorkbook( const wxString & aPath );
365 bool loadJsonWorkbook( const wxString & aPath );
366
367 void SaveCursorToWorkbook( nlohmann::json& aTraceJs, TRACE* aTrace, int aCursorId );
368
369 void onPlotCursorUpdate( wxCommandEvent& aEvent );
370
371public:
373
374private:
377
378 std::vector<wxString> m_signals;
379 std::map<int, wxString> m_userDefinedSignals;
380 std::list<TUNER_SLIDER*> m_tuners;
381
384 std::vector<wxString> m_netnames;
385
387
388 // Holds cursor formating for m_cursorsGrid, includes m_cursorFormats[3][2], TODO: merge.
389 std::vector<std::vector<SPICE_VALUE_FORMAT>> m_cursorFormatsDyn;
390
391 // Variables for temporary storage:
398 unsigned int m_plotNumber;
401
402 // Count all available cursors in m_signalsGrid
403 int m_customCursorsCnt; // Defaults to 2 + 1
404};
405
406#endif // SIMULATOR_FRAME_UI_H
Definition: kiid.h:49
Schematic editor (Eeschema) main window.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Schematic symbol object.
Definition: sch_symbol.h:75
Class SIMULATOR_FRAME_UI_BASE.
The SIMULATOR_FRAME_UI holds the main user-interface for running simulations.
SIM_TAB * NewSimTab(const wxString &aSimCommand)
Create a new simulation tab for a given simulation type.
void SetUserDefinedSignals(const std::map< int, wxString > &aSignals)
void updatePlotCursors()
Update the cursor values (in the grid) and graphics (in the plot window).
void OnSimRefresh(bool aFinal)
void onPlotClose(wxAuiNotebookEvent &event) override
void CustomCursorsInit()
Init handler for custom cursors.
void TogglePanel(wxPanel *aPanel, wxSplitterWindow *aSplitterWindow, int &aSashPosition)
A common toggler for the two main wxSplitterWindow s.
void onPlotChanged(wxAuiNotebookEvent &event) override
void rebuildSignalsGrid(wxString aFilter)
Rebuild the filtered list of signals in the signals grid.
SIM_TAB * GetSimTab(SIM_TYPE aType) const
std::vector< std::vector< SPICE_VALUE_FORMAT > > m_cursorFormatsDyn
void DoFourier(const wxString &aSignal, const wxString &aFundamental)
void rebuildMeasurementsGrid()
Rebuild the measurements grid for the current plot.
std::list< TUNER_SLIDER * > m_tuners
SPICE expressions need quoted versions of the netnames since KiCad allows '-' and '/' in netnames.
void rebuildSignalsList()
Rebuild the list of signals available from the netlist.
bool loadLegacyWorkbook(const wxString &aPath)
void UpdateMeasurement(int aRow)
Update a measurement in the measurements grid.
wxString getNoiseSource() const
std::vector< wxString > SimPlotVectors() const
void SetSubWindowsSashSize()
Adjust the sash dimension of splitter windows after reading the config settings must be called after ...
void applyUserDefinedSignals()
Apply user-defined signals to the SPICE session.
SIM_PREFERENCES m_preferences
void DeleteMeasurement(int aRow)
Delete a row from the measurements grid.
SCH_EDIT_FRAME * m_schematicFrame
wxString vectorNameFromSignalName(SIM_PLOT_TAB *aPlotTab, const wxString &aSignalName, int *aTraceType)
Get the simulator output vector name for a given signal name and type.
void updateSignalsGrid()
Update the values in the signals grid.
void onCursorsGridCellChanged(wxGridEvent &aEvent) override
void onPlotDragged(wxAuiNotebookEvent &event) override
std::vector< wxString > Signals() const
bool SaveWorkbook(const wxString &aPath)
Save plot, signal, cursor, measurement, etc.
std::vector< wxString > m_signals
SIM_TAB * GetCurrentSimTab() const
Return the currently opened plot panel (or NULL if there is none).
void SaveCursorToWorkbook(nlohmann::json &aTraceJs, TRACE *aTrace, int aCursorId)
bool LoadWorkbook(const wxString &aPath)
Load plot, signal, cursor, measurement, etc.
SPICE_VALUE_FORMAT GetMeasureFormat(int aRow) const
Get/Set the format of a value in the measurements grid.
std::map< int, wxString > m_userDefinedSignals
void UpdateTunerValue(const SCH_SHEET_PATH &aSheetPath, const KIID &aSymbol, const wxString &aRef, const wxString &aValue)
Safely update a field of the associated symbol without dereferencing the symbol.
bool DarkModePlots() const
const std::map< int, wxString > & UserDefinedSignals()
std::vector< wxString > m_netnames
void AddTrace(const wxString &aName, SIM_TRACE_TYPE aType)
Add a new trace to the current plot.
void onPlotClosed(wxAuiNotebookEvent &event) override
void RemoveTuner(TUNER_SLIDER *aTuner)
Remove an existing tuner.
void SaveSettings(EESCHEMA_SETTINGS *aCfg)
std::shared_ptr< SPICE_CIRCUIT_MODEL > circuitModel() const
void OnFilterText(wxCommandEvent &aEvent) override
void onMeasurementsGridCellChanged(wxGridEvent &aEvent) override
void DeleteCursor()
Deletes last m_signalsGrid "Cursor n" column, removes vector's m_cursorFormatsDyn last entry,...
void CreateNewCursor()
Creates a column at the end of m_signalsGrid named "Cursor n" ( n = m_customCursorsCnt ),...
void applyTuners()
Apply component values specified using tuner sliders to the current netlist.
bool loadJsonWorkbook(const wxString &aPath)
void OnFilterMouseMoved(wxMouseEvent &aEvent) override
void AddMeasurement(const wxString &aCmd)
Add a measurement to the measurements grid.
void onPlotChanging(wxAuiNotebookEvent &event) override
std::shared_ptr< SPICE_SIMULATOR > simulator() const
int GetSimTabIndex(SIM_TAB *aPlot) const
void onPlotCursorUpdate(wxCommandEvent &aEvent)
void onSignalsGridCellChanged(wxGridEvent &aEvent) override
void SetCursorFormat(int aCursorId, int aValueCol, const SPICE_VALUE_FORMAT &aFormat)
void InitWorkbook()
Load the currently active workbook stored in the project settings.
SIM_TRACE_TYPE getXAxisType(SIM_TYPE aType) const
Return X axis for a given simulation type.
void signalsGridCursorUpdate(T t, U u, R r)
Updates m_signalsGrid cursor widget, column rendering and attributes.
void SetMeasureFormat(int aRow, const SPICE_VALUE_FORMAT &aFormat)
void OnSimReport(const wxString &aMsg)
void ApplyPreferences(const SIM_PREFERENCES &aPrefs)
Called when settings are changed via the common Preferences dialog.
const SPICE_CIRCUIT_MODEL * GetExporter() const
Return the netlist exporter object used for simulations.
SIMULATOR_FRAME * m_simulatorFrame
void AddTuner(const SCH_SHEET_PATH &aSheetPath, SCH_SYMBOL *aSymbol)
Add a tuner for a symbol.
void parseTraceParams(SIM_PLOT_TAB *aPlotTab, TRACE *aTrace, const wxString &aSignalName, const wxString &aParams)
SPICE_VALUE_FORMAT GetCursorFormat(int aCursorId, int aValueCol) const
Get/Set the number of significant digits and the range for formatting a cursor value.
void OnUpdateUI(wxUpdateUIEvent &event) override
void updateTrace(const wxString &aVectorName, int aTraceType, SIM_PLOT_TAB *aPlotTab, std::vector< double > *aDataX=nullptr, bool aClearData=false)
Update a trace in a particular SIM_PLOT_TAB.
SPICE_VALUE_FORMAT m_cursorFormats[3][2]
void LoadSettings(EESCHEMA_SETTINGS *aCfg)
The SIMULATOR_FRAME holds the main user-interface for running simulations.
SIM_TYPE GetSimType() const
Definition: sim_tab.cpp:75
Special netlist exporter flavor that allows one to override simulation commands.
Storage for simulator specific settings.
Custom widget to handle quick component values modification and simulation on the fly.
Definition: tuner_slider.h:44
Contains preferences pertaining to the simulator.
SIM_TRACE_TYPE
Definition: sim_types.h:50
SIM_TYPE
< Possible simulation types
Definition: sim_types.h:32
std::vector< FAB_LAYER_COLOR > dummy
Contains preferences pertaining to the simulator.
A SPICE_VALUE_FORMAT holds precision and range info for formatting values.Helper class to handle Spic...
Definition: spice_value.h:43