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, see <https://www.gnu.org/licenses/>.
22 */
23
24#ifndef SIMULATOR_FRAME_UI_H
25#define SIMULATOR_FRAME_UI_H
26
27
29#include <sim/sim_types.h>
30#include <sim/sim_plot_tab.h>
31#include <sim/sim_preferences.h>
32
33#include <wx/event.h>
34
35class SCH_EDIT_FRAME;
36class SCH_SYMBOL;
37
38class SPICE_SIMULATOR;
39class SPICE_SETTINGS;
42
44class TUNER_SLIDER;
45
46
64
65
67{
68public:
69 SIMULATOR_FRAME_UI( SIMULATOR_FRAME* aSimulatorFrame, SCH_EDIT_FRAME* aSchematicFrame );
71
77 SIM_TAB* NewSimTab( const wxString& aSimCommand );
78
79 std::vector<wxString> SimPlotVectors() const;
80
81 std::vector<wxString> Signals() const;
82
83 const std::map<int, wxString>& UserDefinedSignals() { return m_userDefinedSignals; }
84 void SetUserDefinedSignals( const std::map<int, wxString>& aSignals );
85
92 void CreateNewCursor();
93
99 void DeleteCursor();
100
107 void AddTrace( const wxString& aName, SIM_TRACE_TYPE aType );
108
113 SPICE_VALUE_FORMAT GetCursorFormat( int aCursorId, int aValueCol ) const
114 {
115 return m_cursorFormatsDyn[aCursorId][aValueCol];
116 }
117
118 void SetCursorFormat( int aCursorId, int aValueCol, const SPICE_VALUE_FORMAT& aFormat )
119 {
120 m_cursorFormatsDyn[ aCursorId ][ aValueCol ] = aFormat;
121
122 wxCommandEvent dummy;
124 }
125
129 void AddTuner( const SCH_SHEET_PATH& aSheetPath, SCH_SYMBOL* aSymbol );
130
134 void RemoveTuner( TUNER_SLIDER* aTuner );
135
144 void UpdateTunerValue( const SCH_SHEET_PATH& aSheetPath, const KIID& aSymbol,
145 const wxString& aRef, const wxString& aValue );
146
150 void AddMeasurement( const wxString& aCmd );
151
155 void DeleteMeasurement( int aRow );
156
160 SPICE_VALUE_FORMAT GetMeasureFormat( int aRow ) const;
161 void SetMeasureFormat( int aRow, const SPICE_VALUE_FORMAT& aFormat );
162
166 void UpdateMeasurement( int aRow );
167
168 void DoFourier( const wxString& aSignal, const wxString& aFundamental );
169
173 const SPICE_CIRCUIT_MODEL* GetExporter() const;
174
175 bool IsSimConsoleShown();
176 void ToggleSimConsole();
177 bool IsSimSidePanelShown();
178 void ToggleSimSidePanel();
179
180 bool DarkModePlots() const { return m_darkMode; }
181 void ToggleDarkModePlots();
182
183 void ShowChangedLanguage();
184
189 void InitWorkbook();
190
194 bool LoadWorkbook( const wxString& aPath );
195
199 bool SaveWorkbook( const wxString& aPath );
200
201 void LoadSettings( EESCHEMA_SETTINGS* aCfg );
202
203 void SaveSettings( EESCHEMA_SETTINGS* aCfg );
204
208 void ApplyPreferences( const SIM_PREFERENCES& aPrefs );
209
217
222 {
223 return dynamic_cast<SIM_TAB*>( m_plotNotebook->GetCurrentPage() );
224 }
225
226 SIM_TAB* GetSimTab( SIM_TYPE aType ) const
227 {
228 for( int ii = 0; ii < (int) m_plotNotebook->GetPageCount(); ++ii )
229 {
230 SIM_TAB* candidate = dynamic_cast<SIM_TAB*>( m_plotNotebook->GetPage( ii ) );
231
232 if( candidate && candidate->GetSimType() == aType )
233 return candidate;
234 }
235
236 return nullptr;
237 }
238
239 int GetSimTabIndex( SIM_TAB* aPlot ) const
240 {
241 return m_plotNotebook->GetPageIndex( aPlot );
242 }
243
250 bool IsPlotOwnedByOtherTab( const SIM_TAB* aExcept, const wxString& aPlotName ) const
251 {
252 if( aPlotName.IsEmpty() )
253 return false;
254
255 for( int ii = 0; ii < (int) m_plotNotebook->GetPageCount(); ++ii )
256 {
257 SIM_TAB* candidate = dynamic_cast<SIM_TAB*>( m_plotNotebook->GetPage( ii ) );
258
259 if( candidate && candidate != aExcept && candidate->GetSpicePlotName() == aPlotName )
260 return true;
261 }
262
263 return false;
264 }
265
267
268 void OnSimUpdate();
269 void OnSimReport( const wxString& aMsg );
270 void OnSimRefresh( bool aFinal );
271
272 void OnModify();
273
274private:
278 wxString vectorNameFromSignalName( SIM_PLOT_TAB* aPlotTab, const wxString& aSignalName,
279 int* aTraceType );
280
289 void updateTrace( const wxString& aVectorName, int aTraceType, SIM_PLOT_TAB* aPlotTab,
290 std::vector<double>* aDataX = nullptr, bool aClearData = false );
291
295 void TogglePanel( wxPanel* aPanel, wxSplitterWindow* aSplitterWindow, int& aSashPosition );
296
302 void CustomCursorsInit();
303
309 void rebuildSignalsList();
310
314 void rebuildSignalsGrid( wxString aFilter );
315
319 void updateSignalsGrid();
320
324 void updatePlotCursors();
325
333 template <typename T, typename U, typename R>
334 void signalsGridCursorUpdate( T t, U u, R r );
335
340
345
347
351 void applyTuners();
352
356 SIM_TRACE_TYPE getXAxisType( SIM_TYPE aType ) const;
357
358 struct MULTI_RUN_STEP;
359
360 void clearMultiRunState( bool aClearTraces );
362 std::vector<MULTI_RUN_STEP> calculateMultiRunSteps( const std::vector<TUNER_SLIDER*>& aTuners ) const;
363 std::string multiRunTraceKey( const wxString& aVectorName, int aTraceType ) const;
364 void recordMultiRunData( const wxString& aVectorName, int aTraceType,
365 const std::vector<double>& aX, const std::vector<double>& aY );
366 bool hasMultiRunTrace( const wxString& aVectorName, int aTraceType ) const;
367
368 wxString getNoiseSource() const;
369
370 void parseTraceParams( SIM_PLOT_TAB* aPlotTab, TRACE* aTrace, const wxString& aSignalName,
371 const wxString& aParams );
372
373 std::shared_ptr<SPICE_SIMULATOR> simulator() const;
374 std::shared_ptr<SPICE_CIRCUIT_MODEL> circuitModel() const;
375
376 // Event handlers
377 void onPlotClose( wxAuiNotebookEvent& event ) override;
378 void onPlotClosed( wxAuiNotebookEvent& event ) override;
379 void onPlotChanging( wxAuiNotebookEvent& event ) override;
380 void onPlotChanged( wxAuiNotebookEvent& event ) override;
381 void onPlotDragged( wxAuiNotebookEvent& event ) override;
382
383 void OnFilterText( wxCommandEvent& aEvent ) override;
384 void OnFilterMouseMoved( wxMouseEvent& aEvent ) override;
385
386 void onSignalsGridCellChanged( wxGridEvent& aEvent ) override;
387 void onCursorsGridCellChanged( wxGridEvent& aEvent ) override;
388 void onMeasurementsGridCellChanged( wxGridEvent& aEvent ) override;
389
390 void OnUpdateUI( wxUpdateUIEvent& event ) override;
391
392 bool loadLegacyWorkbook( const wxString & aPath );
393 bool loadJsonWorkbook( const wxString & aPath );
394
395 void SaveCursorToWorkbook( nlohmann::json& aTraceJs, TRACE* aTrace, int aCursorId );
396
397 void onPlotCursorUpdate( wxCommandEvent& aEvent );
398
399public:
401
402private:
405
406 std::vector<wxString> m_signals;
407 std::map<int, wxString> m_userDefinedSignals;
408 std::list<TUNER_SLIDER*> m_tuners;
409 std::map<const TUNER_SLIDER*, double> m_tunerOverrides;
410
412 {
414 std::vector<double> xValues;
415 std::vector<std::vector<double>> yValues;
416 };
417
419 {
420 std::map<const TUNER_SLIDER*, double> overrides;
421 };
422
424 {
425 bool active = false;
426 std::vector<TUNER_SLIDER*> tuners;
427 std::vector<MULTI_RUN_STEP> steps;
428 size_t currentStep = 0;
429 size_t storedSteps = 0;
430 bool storePending = false;
431 std::map<std::string, MULTI_RUN_TRACE> traces;
432 };
433
435
438 std::vector<wxString> m_netnames;
439
441
442 // Holds cursor formating for m_cursorsGrid, includes m_cursorFormats[3][2], TODO: merge.
443 std::vector<std::vector<SPICE_VALUE_FORMAT>> m_cursorFormatsDyn;
444
445 // Variables for temporary storage:
452 unsigned int m_plotNumber;
455
456 // Count all available cursors in m_signalsGrid
457 int m_customCursorsCnt; // Defaults to 2 + 1
458};
459
460#endif // SIMULATOR_FRAME_UI_H
Definition kiid.h:44
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:69
SIMULATOR_FRAME_UI_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxTAB_TRAVERSAL, const wxString &name=wxEmptyString)
SIM_TAB * NewSimTab(const wxString &aSimCommand)
Create a new simulation tab for a given simulation type.
std::string multiRunTraceKey(const wxString &aVectorName, int aTraceType) const
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 recordMultiRunData(const wxString &aVectorName, int aTraceType, const std::vector< double > &aX, const std::vector< double > &aY)
std::vector< MULTI_RUN_STEP > calculateMultiRunSteps(const std::vector< TUNER_SLIDER * > &aTuners) const
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
bool IsPlotOwnedByOtherTab(const SIM_TAB *aExcept, const wxString &aPlotName) const
Return true if a tab other than aExcept records aPlotName as its ngspice plot.
void rebuildSignalsList()
Rebuild the list of signals available from the netlist.
bool loadLegacyWorkbook(const wxString &aPath)
MULTI_RUN_STATE m_multiRunState
SPICE expressions need quoted versions of the netnames since KiCad allows '-' and '/' in netnames.
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.
bool hasMultiRunTrace(const wxString &aVectorName, int aTraceType) const
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.
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 clearMultiRunState(bool aClearTraces)
void OnFilterMouseMoved(wxMouseEvent &aEvent) override
void AddMeasurement(const wxString &aCmd)
Add a measurement to the measurements grid.
void onPlotChanging(wxAuiNotebookEvent &event) override
std::map< const TUNER_SLIDER *, double > m_tunerOverrides
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.
SIMULATOR_FRAME_UI(SIMULATOR_FRAME *aSimulatorFrame, SCH_EDIT_FRAME *aSchematicFrame)
SPICE_VALUE_FORMAT m_cursorFormats[3][2]
void LoadSettings(EESCHEMA_SETTINGS *aCfg)
The SIMULATOR_FRAME holds the main user-interface for running simulations.
const wxString & GetSpicePlotName() const
Definition sim_tab.h:57
SIM_TYPE GetSimType() const
Definition sim_tab.cpp:71
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.
Contains preferences pertaining to the simulator.
SIM_TRACE_TYPE
Definition sim_types.h:46
@ SPT_UNKNOWN
Definition sim_types.h:63
SIM_TYPE
< Possible simulation types
Definition sim_types.h:28
std::vector< FAB_LAYER_COLOR > dummy
std::vector< TUNER_SLIDER * > tuners
std::map< std::string, MULTI_RUN_TRACE > traces
std::vector< MULTI_RUN_STEP > steps
std::map< const TUNER_SLIDER *, double > overrides
std::vector< std::vector< double > > yValues
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:39