27 #include <QFileDialog>
32 #include <QApplication>
34 #include <QVBoxLayout>
35 #include <QProgressBar>
36 #include <QInputDialog>
57 if (!ctrlRef)
continue;
58 takeControllerOwnership(ctrlRef,
false);
64 mVisualizeNetState(false), mOwnershipRequired(false), mCurrentWaveWidget(nullptr)
67 mCreateControlAction =
new QAction(
this);
68 mSimulSettingsAction =
new QAction(
this);
69 mOpenInputfileAction =
new QAction(
this);
70 mSaveWaveformsAction =
new QAction(
this);
71 mInvokeSWizardAction =
new QAction(
this);
72 mAddResultWaveAction =
new QAction(
this);
73 mToggleMaxZoomAction =
new QAction(
this);
74 mUndoZoomShiftAction =
new QAction(
this);
77 mAddResultWaveAction->
setIcon(
QIcon(
":/icons/add_waveform"));
78 mToggleMaxZoomAction->
setIcon(
QIcon(
":/icons/zoom_waveform"));
81 mCreateControlAction->
setToolTip(
"Create simulation controller");
82 mSimulSettingsAction->
setToolTip(
"Simulation settings");
83 mOpenInputfileAction->
setToolTip(
"Open input file");
84 mSaveWaveformsAction->
setToolTip(
"Save waveform data to file");
85 mInvokeSWizardAction->
setToolTip(
"Invoke simulation wizard");
86 mAddResultWaveAction->
setToolTip(
"Add waveform net");
87 mToggleMaxZoomAction->
setToolTip(
"Toggle max/min zoom");
88 mUndoZoomShiftAction->
setToolTip(
"Undo last zoom or horizontal scroll");
107 mProgress->
setFormat(
"Import waveform data : %p%");
146 else if (percent != mProgress->
value())
235 mStatusBar->
showMessage(
"Create new simulation controller");
243 toolbar->
addAction(mCreateControlAction);
244 toolbar->
addAction(mInvokeSWizardAction);
245 toolbar->
addAction(mSimulSettingsAction);
246 toolbar->
addAction(mOpenInputfileAction);
247 toolbar->
addAction(mSaveWaveformsAction);
248 toolbar->
addAction(mAddResultWaveAction);
249 toolbar->
addAction(mToggleMaxZoomAction);
250 toolbar->
addAction(mUndoZoomShiftAction);
253 void WaveformViewer::handleTabClosed(
int inx)
260 void WaveformViewer::handleCreateControl()
265 log_warning(
"waveform_viewer",
"Plugin 'netlist_simulator_controller' not found");
268 std::unique_ptr<NetlistSimulatorController> ctrlRef = ctrlPlug->create_simulator_controller();
270 takeControllerOwnership(ctrlRef,
false);
273 void WaveformViewer::handleSimulSettings()
278 act =
new QAction(
"Show output of engine");
283 act =
new QAction(
"Refresh net names", settingMenu);
287 act =
new QAction(
"Visualize net state by color", settingMenu);
293 act =
new QAction(
"Settings ...");
300 void WaveformViewer::handleOpenSettingsDialog()
306 void WaveformViewer::handleShowEngineOutput()
321 void WaveformViewer::handleRefreshNetNames()
323 for (
int inx=0; inx<mTabWidget->
count(); inx++)
325 WaveWidget* ww =
static_cast<WaveWidget*
>(mTabWidget->
widget(inx));
330 void WaveformViewer::setVisualizeNetState(
bool state)
332 if (state == mVisualizeNetState)
return;
333 mVisualizeNetState =
state;
334 for (
int inx=0; inx < mTabWidget->
count(); inx++)
336 WaveWidget* ww =
static_cast<WaveWidget*
>(mTabWidget->
widget(inx));
337 ww->setVisualizeNetState(mVisualizeNetState, inx==mTabWidget->
currentIndex());
344 if (mOwnershipRequired)
return;
347 for (
int inx=0; inx<mTabWidget->
count(); inx++)
361 for (
int inx=0; inx<mTabWidget->
count(); inx++)
372 void WaveformViewer::handleOpenInputFile()
376 filter +=
";; VCD files (*.vcd);; CSV files (*.csv)";
380 if (filename.
isEmpty())
return;
386 mOwnershipRequired =
true;
388 takeControllerOwnership(ctrlRef,
true);
389 mOwnershipRequired =
false;
402 void WaveformViewer::showCloseButton()
404 for (
int i=0; i<mTabWidget->
count(); i++)
406 bool own =
static_cast<const WaveWidget*
>(mTabWidget->
widget(i))->hasOwnership();
407 for (
int j=0; j<2; j++)
427 void WaveformViewer::takeControllerOwnership(std::unique_ptr<NetlistSimulatorController> &ctrlRef,
bool create)
429 NetlistSimulatorController* nsc = ctrlRef.get();
431 WaveWidget* ww =
nullptr;
434 ww =
new WaveWidget(nsc, mTabWidget);
435 mTabWidget->
addTab(ww,nsc->name());
439 for (
int inx=0; inx<mTabWidget->
count(); inx++)
441 WaveWidget* wwTest =
static_cast<WaveWidget*
>(mTabWidget->
widget(inx));
442 if (ctrlRef.get()->get_id() == wwTest->controllerId())
451 ww->takeOwnership(ctrlRef);
455 void WaveformViewer::handleSaveWaveforms()
461 if (filename.
isEmpty())
return;
465 void WaveformViewer::handleInvokeWizzard()
472 void WaveformViewer::handleToggleMaxZoom()
478 void WaveformViewer::handleUndoZoomShift()
484 void WaveformViewer::handleAddResultWave()
497 void WaveformViewer::handleSelectionChanged(
void* sender)
QVBoxLayout * mContentLayout
std::shared_ptr< spdlog::logger > add_channel(const std::string &channel_name, const std::vector< std::shared_ptr< log_sink >> &sinks, const std::string &level="info")
static std::shared_ptr< log_sink > create_gui_sink()
static std::shared_ptr< log_sink > create_file_sink(const std::filesystem::path &file_name="", const bool truncate=false)
static std::shared_ptr< log_sink > create_stdout_sink(const bool colored=true)
static LogManager * get_instance(const std::filesystem::path &file_name="")
bool import_vcd(const std::string &filename, FilterInputFlag filter)
bool generate_vcd(const std::filesystem::path &path, u32 start_time=0, u32 end_time=0, std::set< const Net * > nets={}) const
std::string get_working_directory() const
void import_csv(const std::string &filename, FilterInputFlag filter, u64 timescale=1000000000)
static const char * sPersistFile
bool can_import_data() const
std::string get_name() const
NetlistSimulatorController * controller(u32 id) const
void controllerRemoved(u32 id)
static NetlistSimulatorControllerMap * instance()
void controllerAdded(u32 id)
static SimulationSettings * sSimulationSettings
static SimulatorSerializer * sSimulatorSerializer
std::unique_ptr< NetlistSimulatorController > restore_simulator_controller(Netlist *nl, const std::string &filename) const
void selectionChanged(void *sender)
static QString sLogFilename
std::vector< std::unique_ptr< NetlistSimulatorController > > restore()
#define log_warning(channel,...)
QIcon getStyledSvgIcon(const QString &from_to_colors_enabled, const QString &svg_path, QString from_to_colors_disabled=QString())
BasePluginInterface * get_plugin_instance(const std::string &plugin_name, bool initialize=true, bool silent=false)
SelectionRelay * gSelectionRelay
void setIcon(const QIcon &icon)
void triggered(bool checked)
QString absoluteFilePath(const QString &fileName) const const
QString getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QObject * sender() const const
void setRange(int minimum, int maximum)
void setTextVisible(bool visible)
void showMessage(const QString &message, int timeout)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const const
QString fromStdString(const std::string &str)
QString fromUtf8(const char *str, int size)
bool isEmpty() const const
QString toLower() const const
std::string toStdString() const const
void setHtml(const QString &text)
void setReadOnly(bool ro)