HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
wave_edit_dialog.cpp
Go to the documentation of this file.
5 #include <QTableView>
6 #include <QGridLayout>
7 #include <QDialogButtonBox>
8 #include <QPushButton>
9 #include <QIcon>
10 #include <QPixmap>
11 #include <QPainter>
12 #include <QHeaderView>
13 
14 namespace hal {
15 
16  WaveEditDialog::WaveEditDialog(WaveData *wd, double tCursor, QWidget *parent)
17  : QDialog(parent)
18  {
19  QGridLayout* layout = new QGridLayout(this);
20  QTableView* tv = new QTableView(this);
21  mWaveModel = new WaveEditTable(wd,tCursor,tv);
22  if (wd->bits() <= 1)
23  tv->setItemDelegateForColumn(2, new WaveDeleteDelegate(mWaveModel));
24  tv->setModel(mWaveModel);
25  QHeaderView* hv = tv->horizontalHeader();
29  tv->setColumnWidth(1,24);
30  tv->setColumnWidth(2,16);
31  layout->addWidget(tv,0,0,1,2);
34  if (wd->netType() != WaveData::RegularNet)
36  else
38  layout->addWidget(dbb,1,1);
39  setWindowTitle(wd->name());
40  }
41 
43  {
44  return mWaveModel->mEditData;
45  }
46 
47  //-------------------------------------------
48 
49  QPixmap* WaveDeleteDelegate::sXdelete = nullptr;
50 
52  const QModelIndex &index) const
53  {
54  Q_UNUSED(option);
55  Q_UNUSED(parent);
56  mTable->removeRow(index.row());
57  return nullptr;
58  }
59 
61  const QModelIndex &index) const
62  {
63  if (!index.row() || index.row() >= mTable->rowCount()-1) return;
64  QPixmap* pix = piXdelete();
65  QRect rPlace(option.rect.x(),option.rect.y(),option.rect.height()/2,option.rect.height()/2);
66  painter->drawPixmap(rPlace ,QPixmap(*pix));
67  }
68 
70  const QModelIndex &index) const
71  {
72  Q_UNUSED(option);
73  Q_UNUSED(index);
74  return piXdelete()->size();
75  }
76 
77  void WaveDeleteDelegate::deleteClicked()
78  {
79  QPushButton* but = static_cast<QPushButton*>(sender());
80  if (!but) return;
81  }
82 
83  QPixmap* WaveDeleteDelegate::piXdelete()
84  {
85  if (!sXdelete) sXdelete = new QPixmap(":/icons/x_delete", "PNG");
86  return sXdelete;
87  }
88 
89  //-------------------------------------------
90  WaveEditTable::WaveEditTable(WaveData *wd, double tCursor, QObject* parent)
91  : QAbstractTableModel(parent), mWaveDataInput(wd)
92  {
93  uint64_t wsize = mWaveDataInput->fileSize();
94  if (!wsize)
95  {
96  if (mWaveDataInput->data().isEmpty())
97  mEditData.insert(0,0);
98  else
99  {
100  mEditData = mWaveDataInput->data();
101  truncateData(tCursor);
102  }
103  }
104  else if (wsize <= (uint64_t) NetlistSimulatorControllerPlugin::sSimulationSettings->maxSizeLoadable())
105  {
106  if (mWaveDataInput->data().size() < (int) wsize)
107  mWaveDataInput->loadSaleae();
108  mEditData = mWaveDataInput->data();
109  truncateData(tCursor);
110  }
111  else
112  {
114  SaleaeInputFile sif(mWaveDataInput->fileName());
115  sif.get_file_position(tCursor);
116  sif.skip_transitions(-n/2);
117  SaleaeDataBuffer* sdb = sif.get_buffered_data(n);
118  for (u64 i=0; i<sdb->mCount; i++)
119  {
120  mEditData.insert(sdb->mTimeArray[i],sdb->mValueArray[i]);
121  }
122  delete sdb;
123  }
124  }
125 
126  void WaveEditTable::truncateData(double tCursor)
127  {
129  if (mEditData.size() <= n) return; // nothing to do
130  auto it = mEditData.upperBound(tCursor);
131  for (int i=0; i<n/2; i++)
132  if (it != mEditData.begin())
133  --it;
134  for (auto itDel = mEditData.begin(); itDel != it; itDel = mEditData.erase(itDel)) {;}
135  for (int i=0; i<n; i++)
136  if (it != mEditData.end())
137  ++it;
138  for (auto itDel = it; itDel != mEditData.end(); itDel = mEditData.erase(itDel)) {;}
139  }
140 
141  int WaveEditTable::rowCount(const QModelIndex &parent) const
142  {
143  Q_UNUSED(parent);
144  return mEditData.size() + 1;
145  }
146 
147  int WaveEditTable::columnCount(const QModelIndex &parent) const
148  {
149  Q_UNUSED(parent);
150  return 3;
151  }
152 
154  {
155  if (role != Qt::DisplayRole) return QVariant();
156  if (index.row() >= mEditData.size()) return QString();
157  auto it = mEditData.constBegin() + index.row();
158  if (it != mEditData.constEnd())
159  {
160  switch (index.column())
161  {
162  case 0: return QVariant::fromValue(it.key());
163  case 1: return mWaveDataInput->strValue(it);
164  case 2: return QString();
165  default: return QVariant();
166  }
167  }
168  return QString();
169  }
170 
171  void WaveEditTable::recalcTransitions()
172  {
173  int val = 0; // determine start value on begin
174  for (auto it = mEditData.begin(); it != mEditData.end(); ++it)
175  {
176  if (it == mEditData.begin())
177  val = it.value();
178  else
179  {
180  val = val ? 0 : 1;
181  *it = val;
182  }
183  }
184  }
185 
186  bool WaveEditTable::setData(const QModelIndex &index, const QVariant &value, int role)
187  {
188  if (role != Qt::EditRole) return false;
189  bool numberOk;
190  int iValue = value.toInt(&numberOk);
191  if (!numberOk || iValue < 0) return false;
192 
193  beginResetModel();
194  if (!index.row() && index.column()==1)
195  {
196  if (iValue <= 1)
197  {
198  if (mEditData.isEmpty())
199  mEditData.insert(0,iValue);
200  else
201  *(mEditData.begin()) = iValue;
202  }
203  }
204  else
205  {
206  if (index.row() < mEditData.size())
207  {
208  auto it = mEditData.begin() + index.row();
209  mEditData.erase(it);
210  }
211  mEditData[iValue] = 0;
212  }
213  recalcTransitions();
214  endResetModel();
215  return true;
216  }
217 
218  QVariant WaveEditTable::headerData(int section, Qt::Orientation orientation, int role) const
219  {
220  if (orientation != Qt::Horizontal || role != Qt::DisplayRole)
221  return QAbstractTableModel::headerData(section, orientation, role);
222  switch (section)
223  {
224  case 0: return "Time [µs]";
225  case 1: return "New Value";
226  }
227  return QVariant();
228  }
229 
231  {
232  if (mWaveDataInput->bits() > 1)
233  {
234  if (index.column()==2) return Qt::NoItemFlags;
236  }
237  if (index.column()==1)
238  {
241  }
242  if (index.column()==2 && (!index.row() || index.row() >= rowCount() - 1)) return Qt::NoItemFlags;
244  }
245 
247  {
248  int key = data(index(irow,0)).toInt();
249  if (!key) return;
250 
251  beginResetModel();
252  auto it = mEditData.begin() + irow;
253  mEditData.erase(it);
254  recalcTransitions();
255  endResetModel();
256  }
257 }
uint64_t mCount
Number of elements in buffer.
Definition: saleae_file.h:137
uint64_t * mTimeArray
Buffer for mCount transition time values.
Definition: saleae_file.h:140
int * mValueArray
Buffer for mCount data values.
Definition: saleae_file.h:143
int64_t get_file_position(double t, bool successor=false)
void skip_transitions(int64_t delta)
Goto position for next read access, skip number of transitions indicated by 'delta',...
SaleaeDataBuffer * get_buffered_data(uint64_t nread)
Returns pointer to data buffer reading from current file position up to nread events....
bool loadSaleae(const WaveDataTimeframe &tframe=WaveDataTimeframe())
Definition: wave_data.cpp:270
u64 fileSize() const
Definition: wave_data.h:110
const QMap< u64, int > & data() const
Definition: wave_data.h:108
NetType netType() const
Definition: wave_data.h:105
std::string fileName() const
Definition: wave_data.cpp:519
QString name() const
Definition: wave_data.h:104
virtual int bits() const
Definition: wave_data.h:106
QString strValue(int val) const
Definition: wave_data.cpp:484
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
const QMap< u64, int > & dataMap() const
WaveEditDialog(WaveData *wd, double tCursor, QWidget *parent=nullptr)
WaveEditTable(WaveData *wd, double tCursor, QObject *parent=nullptr)
int columnCount(const QModelIndex &parent=QModelIndex()) const override
void removeRow(int irow)
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
uint64_t u64
Definition: defines.h:42
Definition: defines.h:45
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const const
void setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate)
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const const override
virtual void accept()
virtual void reject()
QPushButton * button(QDialogButtonBox::StandardButton which) const const
void setSectionResizeMode(QHeaderView::ResizeMode mode)
void addWidget(QWidget *w)
QMap::iterator begin()
QMap::const_iterator constBegin() const const
QMap::const_iterator constEnd() const const
QMap::iterator end()
QMap::iterator erase(QMap::iterator pos)
QMap::iterator insert(const Key &key, const T &value)
bool isEmpty() const const
int size() const const
QMap::iterator upperBound(const Key &key)
int column() const const
int row() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject * parent() const const
QObject * sender() const const
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QSize size() const const
DisplayRole
typedef ItemFlags
Orientation
QHeaderView * horizontalHeader() const const
void setColumnWidth(int column, int width)
virtual void setModel(QAbstractItemModel *model) override
QVariant fromValue(const T &value)
int toInt(bool *ok) const const
QLayout * layout() const const
void setDisabled(bool disable)
void setWindowTitle(const QString &)