HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
trigger_dialog.cpp
Go to the documentation of this file.
2 #include <QDialogButtonBox>
3 #include <QPushButton>
4 #include <QRadioButton>
5 #include <QGridLayout>
6 #include <QTableWidget>
7 #include <QComboBox>
8 #include <QFrame>
9 #include <QLabel>
10 #include <QVBoxLayout>
11 
12 namespace hal {
13  TriggerDialog::TriggerDialog(const QList<WaveData *> inputList, const QList<WaveData *> filterList, QWidget* parent)
14  : QDialog(parent), mFilterList(filterList), mHandleTableEdit(true)
15  {
16  if (inputList.isEmpty()) return;
17 
21 
22  setWindowTitle("Create Trigger Time Set");
23  setMinimumWidth(640);
24 
25  QGridLayout* layout = new QGridLayout(this);
26 
27  QFrame* fTable = new QFrame(this);
29  fTable->setLineWidth(2);
30  QVBoxLayout* layTable = new QVBoxLayout(fTable);
31  layTable->addWidget(new QLabel("Trigger only upon transiton to value VT (X = all values)", fTable));
32  mTableWidget = new QTableWidget(fTable);
33  mTableWidget->setRowCount(inputList.size());
34  mTableWidget->setColumnCount(3);
35  for (int irow=0; irow<inputList.size(); irow++)
36  {
37  WaveData* wd = inputList.at(irow);
38  mTableWidget->setItem(irow,0,new QTableWidgetItem(QString::number(wd->id())));
39  mTableWidget->setItem(irow,1,new QTableWidgetItem(wd->name()));
40  mTableWidget->setItem(irow,2,new QTableWidgetItem("X"));
41  for (int icol=0; icol<2; icol++)
42  mTableWidget->item(irow,icol)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
44  mTableWidget->setColumnWidth(0,60);
45  mTableWidget->setColumnWidth(1,360);
46  mTableWidget->setColumnWidth(2,36);
47  }
48  mTableWidget->setHorizontalHeaderLabels({"ID", "Name", "VT"});
49  connect(mTableWidget,&QTableWidget::cellChanged,this,&TriggerDialog::handleTableCellChanged);
50  layTable->addWidget(mTableWidget);
51  layout->addWidget(fTable,0,0,1,2);
52 
53  QFrame* fExpression = new QFrame(this);
55  fExpression->setLineWidth(2);
56  QVBoxLayout* layExpression = new QVBoxLayout(fExpression);
57  mEnterFilter = new QRadioButton("Select waveform as filter:");
58  connect(mEnterFilter,&QRadioButton::toggled,this,&TriggerDialog::handleFilterToggled);
59  layExpression->addWidget(mEnterFilter);
60  mSelectFilter = new QComboBox(fExpression);
61  for (WaveData* wd : filterList)
62  {
63  QString txt = QString("%1[%2%3]")
64  .arg(wd->name())
65  .arg(wd->netType()==WaveData::BooleanNet?"bool ":"")
66  .arg(wd->id());
67  mSelectFilter->addItem(txt,QVariant::fromValue<void*>(wd));
68  }
69  layExpression->addWidget(mSelectFilter);
70  layout->addWidget(fExpression,1,0,1,2);
71 
72  layout->addWidget(dbb,2,1);
73  mEnterFilter->setChecked(false);
74  }
75 
76  void TriggerDialog::handleTableCellChanged(int irow, int icol)
77  {
78  if (!mHandleTableEdit) return;
79  mHandleTableEdit = false;
80  QString txt = mTableWidget->item(irow,icol)->text().trimmed();
81  bool ok;
82  int val = txt.toInt(&ok);
83  if ((val < 0 || !ok) && txt != "X")
84  mTableWidget->item(irow,icol)->setText("X");
85  mHandleTableEdit = true;
86  }
87 
89  {
90  QList<int> retval;
91  for (int irow = 0; irow < mTableWidget->rowCount(); irow++)
92  {
93  QString txt = mTableWidget->item(irow,2)->text().trimmed();
94  if (txt=="X")
95  retval.append(-1);
96  else
97  retval.append(txt.toInt());
98  }
99  return retval;
100  }
101 
102  void TriggerDialog::handleFilterToggled(bool state)
103  {
104  mSelectFilter->setEnabled(state);
105  }
106 
108  {
109  if (!mEnterFilter->isChecked()) return nullptr;
110  QVariant sel = mSelectFilter->currentData();
111  if (!sel.isValid()) return nullptr;
112  return static_cast<WaveData*>(sel.value<void*>());
113  }
114 }
TriggerDialog(const QList< WaveData * > inputList, const QList< WaveData * > filterList, QWidget *parent=nullptr)
QList< int > transitionToValue() const
WaveData * filterWave() const
QString name() const
Definition: wave_data.h:104
u32 id() const
Definition: wave_data.h:103
Definition: defines.h:45
void setChecked(bool)
void toggled(bool checked)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void addItem(const QString &text, const QVariant &userData)
virtual void accept()
virtual void reject()
void setLineWidth(int)
void setFrameStyle(int style)
void addWidget(QWidget *w)
void append(const T &value)
const T & at(int i) const const
bool isEmpty() const const
int size() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString number(int n, int base)
int toInt(bool *ok, int base) const const
QString trimmed() const const
ItemIsSelectable
void setColumnWidth(int column, int width)
void cellChanged(int row, int column)
QTableWidgetItem * item(int row, int column) const const
void setColumnCount(int columns)
void setHorizontalHeaderLabels(const QStringList &labels)
void setItem(int row, int column, QTableWidgetItem *item)
void setRowCount(int rows)
void setFlags(Qt::ItemFlags flags)
void setText(const QString &text)
QString text() const const
bool isValid() const const
T value() const const
void setEnabled(bool)
QLayout * layout() const const
void setMinimumWidth(int minw)
void setWindowTitle(const QString &)