HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
wave_data.h
Go to the documentation of this file.
1 // MIT License
2 //
3 // Copyright (c) 2019 Ruhr University Bochum, Chair for Embedded Security. All Rights reserved.
4 // Copyright (c) 2019 Marc Fyrbiak, Sebastian Wallat, Max Hoffmann ("ORIGINAL AUTHORS"). All rights reserved.
5 // Copyright (c) 2021 Max Planck Institute for Security and Privacy. All Rights reserved.
6 // Copyright (c) 2021 Jörn Langheinrich, Julian Speith, Nils Albartus, René Walendy, Simon Klix ("ORIGINAL AUTHORS"). All Rights reserved.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to deal
10 // in the Software without restriction, including without limitation the rights
11 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 // copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 //
15 // The above copyright notice and this permission notice shall be included in all
16 // copies or substantial portions of the Software.
17 //
18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 // SOFTWARE.
25 
26 #pragma once
27 
28 #include <QMap>
29 #include <QString>
30 #include <QList>
31 #include <QSet>
32 #include <QObject>
33 #include "hal_core/defines.h"
37 #include <set>
38 
39 namespace hal {
40 
41  class WaveData;
42  class NetlistSimulator;
43  class SaleaeInputFile;
44  class Net;
45 
50  {
51  friend class WaveDataList;
52  u64 mSceneMaxTime;
53  u64 mSimulateMaxTime;
54  u64 mUserdefMaxTime;
55  u64 mUserdefMinTime;
56  static const int sMinSceneWidth = 1000;
57  public:
59  u64 sceneMaxTime() const;
60  u64 simulateMaxTime() const;
61  u64 sceneMinTime() const;
62  u64 sceneWidth() const;
63  bool hasUserTimeframe() const;
64  void setUserTimeframe(u64 t0=0, u64 t1=0);
65  void setSceneMaxTime(u64 t);
66  void setSimulateMaxTime(u64 t) { mSimulateMaxTime = t; }
67  };
68 
69  class WaveDataList;
70  class WaveDataTrigger;
71 
75  class WaveData
76  {
77  public:
80  private:
81  u32 mId;
82  int mFileIndex;
83  u64 mFileSize;
84  u64 mTimeframeSize;
85  QString mName;
86  NetType mNetType;
87  int mBits;
88  int mSubscriber;
89  protected:
92  bool mDirty;
94 
96  void resetWave();
97  public:
98  WaveData(const WaveData& other);
99  WaveData(u32 id_, const QString& nam, NetType tp = RegularNet,
100  const QMap<u64,int>& dat = QMap<u64,int>() );
101  WaveData(const Net* n, NetType tp = RegularNet);
102  virtual ~WaveData() {;}
103  u32 id() const { return mId; }
104  QString name() const { return mName; }
105  NetType netType() const { return mNetType; }
106  virtual int bits() const { return mBits; }
107  bool isDirty() const { return mDirty; }
108  const QMap<u64,int>& data() const { return mData; }
109  int fileIndex() const { return mFileIndex; }
110  u64 fileSize() const { return mFileSize; }
111  int valueBase() const { return mValueBase; }
112  std::string fileName() const;
114  void setId(u32 id_);
115  bool rename(const QString& nam);
116  void setBits(int bts);
117  void setDirty(bool dty) { mDirty = dty; }
118  void setFileIndex(int saleaIndex) { mFileIndex = saleaIndex; }
119  void setFileSize(u64 siz);
120  void setTimeframeSize(u64 siz) { mTimeframeSize = siz; }
121  void setWaveDataList(WaveDataList* wdList) { mWaveDataList = wdList; }
122  virtual LoadPolicy loadPolicy() const;
123  int dataIndex() const;
124 
125  virtual u64 neighborTransition(double t, bool next) const;
127  bool loadSaleae(const WaveDataTimeframe& tframe = WaveDataTimeframe());
128  void saveSaleae();
129  void setData(const QMap<u64,int>& dat);
130  virtual int intValue(double t) const;
131  int get_value_at(u64 t);
132  std::string get_name() const { return mName.toStdString(); }
133  std::vector<std::pair<u64,int>> get_events(u64 t0 = 0) const;
134  std::vector<std::pair<u64,int>> get_triggered_events(const WaveDataTrigger* wdTrig, u64 t0 = 0);
135  u64 maxTime() const;
136  void clear() { mData.clear(); }
137  void insert(u64 t, int val) { mData.insert(t,val); }
139  QString strValue(int val) const;
140  QString strValue(double t) const;
142  void setValueBase(int bas) { mValueBase = bas; }
143  bool isEqual(const WaveData& other, int tolerance=0) const;
144  static QString stringValue(int val, int bits, int base);
145  bool hasSubscriber() const { return mSubscriber > 0; }
146  void addSubscriber() { ++mSubscriber; }
147  void removeSubscriber() { if (mSubscriber) -- mSubscriber; }
148  };
149 
153  class WaveDataClock : public WaveData
154  {
155  SimulationInput::Clock mClock;
156  u64 mMaxTime;
157  void dataFactory();
158  public:
159  WaveDataClock(const Net* n, const SimulationInput::Clock& clk, u64 tmax);
160  WaveDataClock(const Net* n, int start, u64 period, u64 tmax);
161  void setMaxTime(u64 tmax);
162  SimulationInput::Clock clock() const { return mClock; }
163  };
164 
165  class WaveDataGroup;
166  class WaveDataBoolean;
167 
171  class WaveDataList : public QObject, public QList<WaveData*>
172  {
173  friend class WaveDataGroup;
174  friend class WaveDataBoolean;
175  friend class WaveDataTrigger;
176  Q_OBJECT
177 
178  QMap<u32,int> mIds;
179  WaveDataTimeframe mTimeframe;
180  SaleaeDirectory mSaleaeDirectory;
181  u32 mMaxGroupId;
182  u32 mMaxBooleanId;
183  u32 mMaxTriggerid;
184  QList<WaveData*> mTrashCan;
185  QSet<QString> mNotInNetlist;
186  void testDoubleCount();
187  void restoreIndex();
188  void updateMaxTime();
189  void setMaxTime(u64 tmax);
190 
193 
194  void replaceWaveData(int inx, WaveData *wdNew);
195  void registerGroup(WaveDataGroup* grp);
196  void registerBoolean(WaveDataBoolean* wdBool);
197  void registerTrigger(WaveDataTrigger* wdTrig);
198  public:
206  WaveDataList(const QString& sdFilename, QObject* parent = nullptr);
207  ~WaveDataList();
208 
209  u32 nextGroupId() { return ++mMaxGroupId; }
210  u32 maxGroupId() const { return mMaxGroupId; }
211  u32 nextBooleanId() { return ++ mMaxBooleanId; }
212  u32 nextTriggerId() { return ++ mMaxTriggerid; }
213  void addWavesToGroup(u32 grpId, const QVector<WaveData*>& wds);
214  void removeGroup(u32 grpId);
215 
216  void addOrReplace(WaveData* wd);
217  void add(WaveData* wd, bool updateSaleae);
218  void remove(u32 id);
219  void incrementSimulTime(u64 deltaT);
220  void clearAll();
221  void updateClocks();
222  void updateWaveData(int inx);
223 
224  WaveData* waveDataByNet(const Net* n);
225  WaveData* waveDataByName(const std::string& nam) const;
226  WaveData* waveDataById(const int id);
227  int waveIndexByNetId(u32 id) const { return mIds.value(id,-1); }
228  void triggerAddToView(u32 id) const;
229  bool hasNet(u32 id) const { return mIds.contains(id); }
230  QSet<u32> toSet() const;
231  void updateWaveName(int iwave, const QString& nam);
232  void updateGroupName(u32 grpId, const QString& nam);
233  const WaveDataTimeframe& timeFrame() const { return mTimeframe; }
234  void setValueForEmpty(int val);
235  void dump() const;
236  void emitWaveAdded(int inx);
237  void emitWaveUpdated(int inx);
238  void emitGroupUpdated(int grpId);
239  void emitWaveRemovedFromGroup(int iwave, int grpId);
240  void emitTimeframeChanged();
241  void updateFromSaleae();
242  SaleaeDirectory& saleaeDirectory() { return mSaleaeDirectory; }
244  void setUserTimeframe(u64 t0=0, u64 t1=0);
245  void emptyTrash();
246  Q_SIGNALS:
247  void waveAdded(int inx);
248  void groupAdded(int grpId);
249  void booleanAdded(int boolId);
250  void triggerAdded(int trigId);
253  void waveUpdated(int inx, int grpId);
254  void groupUpdated(int grpId);
255  void waveRenamed(int iwave);
256  void groupRenamed(int grpId);
257  void waveRemoved(int inx);
258  void waveAddedToGroup(const QVector<u32>& netIds, int grpId);
259  void waveRemovedFromGroup(int iwave, int grpId);
263  };
264 
269  friend uint qHash(const WaveDataGroupIndex& wdgi);
270  uint mCode;
271  void construct(u32 id, bool isNet);
272  public:
273  WaveDataGroupIndex(const WaveData* wd);
274  WaveDataGroupIndex(u32 id, bool isNet) { construct(id, isNet); }
275  bool operator==(const WaveDataGroupIndex& other) const { return mCode == other.mCode; }
276  };
277 
278  uint qHash(const WaveDataGroupIndex& wdgi);
279 
283  class WaveDataBoolean : public WaveData
284  {
285  int mInputCount;
286  WaveData** mInputWaves;
288  char* mTruthTable;
289  public:
290  WaveDataBoolean(WaveDataList* wdList, QString boolFunc);
291  WaveDataBoolean(WaveDataList* wdList, const QList<WaveData*>& boolInput, const QList<int>& acceptMask);
293  void recalcData();
294  virtual LoadPolicy loadPolicy() const override;
295  QList<WaveData*> children() const;
296  const char* truthTable() const { return mTruthTable; }
297  virtual int intValue(double t) const override;
298  };
299 
303  class WaveDataTrigger : public WaveData
304  {
305  int mTriggerCount;
306  WaveData** mTriggerWaves;
307  WaveData* mFilterWave;
309  int* mToValue;
310  public:
311  WaveDataTrigger(WaveDataList* wdList, const QList<WaveData*>& wdTrigger, const QList<int>& toVal = QList<int>());
313  void recalcData();
314  virtual LoadPolicy loadPolicy() const override;
315  QList<WaveData*> children() const;
316  virtual u64 neighborTransition(double t, bool next) const override;
317  virtual int intValue(double t) const override;
318  void set_filter_wave(WaveData* wd);
319  QList<int> toValueList() const;
320  WaveData* get_filter_wave() const { return mFilterWave; }
321  };
322 
326  class WaveDataGroup : public WaveData
327  {
328 
329  protected:
331 
333  public:
334  WaveDataGroup(WaveDataList* wdList, int grpId, const QString& nam);
335  WaveDataGroup(WaveDataList* wdList, const QString& nam = QString());
336  WaveDataGroup(WaveDataList* wdList, const WaveData* wdGrp);
337  virtual ~WaveDataGroup();
338  virtual int bits() const override;
339  virtual int size() const { return mGroupList.size(); }
340  void addNet(const Net* n);
341  virtual void insert(int inx, WaveData* wd);
342  virtual void addWaves(const QVector<WaveData*>& wds);
343  void restoreIndex();
344  virtual void recalcData();
345  virtual bool hasNetId(u32 id) const;
346  virtual QList<WaveData*> children() const;
348  virtual WaveData* childAt(int inx) const;
349  virtual WaveData* removeAt(int inx);
350  virtual bool isEmpty() const { return mGroupList.isEmpty(); }
351  virtual void updateWaveData(WaveData* wd);
352  virtual int childIndex(WaveData* wd) const;
353  virtual int netIndex(u32 id) const;
354  virtual void replaceChild(WaveData* wd);
355  virtual LoadPolicy loadPolicy() const override;
356  void add_waveform(WaveData* wd);
357  void remove_waveform(WaveData* wd);
358  std::vector<WaveData*> get_waveforms() const;
359  virtual int intValue(double t) const override;
360  };
361 }
Value
represents the type of the node
Definition: net.h:58
The SaleaeDirectory class provides the API for the SALEAE directory file. The SALEAE directory file w...
Type
WaveDataBoolean(WaveDataList *wdList, QString boolFunc)
Definition: wave_data.cpp:585
QList< WaveData * > children() const
Definition: wave_data.cpp:738
const char * truthTable() const
Definition: wave_data.h:296
virtual int intValue(double t) const override
Definition: wave_data.cpp:766
virtual LoadPolicy loadPolicy() const override
Definition: wave_data.cpp:746
WaveDataClock(const Net *n, const SimulationInput::Clock &clk, u64 tmax)
Definition: wave_data.cpp:17
SimulationInput::Clock clock() const
Definition: wave_data.h:162
void setMaxTime(u64 tmax)
Definition: wave_data.cpp:31
virtual void replaceChild(WaveData *wd)
Definition: wave_data.cpp:1011
QList< int > childrenWaveIndex() const
Definition: wave_data.cpp:1052
virtual void updateWaveData(WaveData *wd)
Definition: wave_data.cpp:1117
virtual bool isEmpty() const
Definition: wave_data.h:350
virtual void recalcData()
Definition: wave_data.cpp:1144
virtual WaveData * childAt(int inx) const
Definition: wave_data.cpp:1062
std::vector< WaveData * > get_waveforms() const
Definition: wave_data.cpp:1004
virtual int bits() const override
Definition: wave_data.cpp:1083
void remove_waveform(WaveData *wd)
Definition: wave_data.cpp:993
void addNet(const Net *n)
Definition: wave_data.cpp:1033
virtual LoadPolicy loadPolicy() const override
Definition: wave_data.cpp:1125
virtual void addWaves(const QVector< WaveData * > &wds)
Definition: wave_data.cpp:1110
virtual QList< WaveData * > children() const
Definition: wave_data.cpp:1047
virtual int intValue(double t) const override
Definition: wave_data.cpp:1205
virtual int size() const
Definition: wave_data.h:339
virtual void insert(int inx, WaveData *wd)
Definition: wave_data.cpp:1100
virtual ~WaveDataGroup()
Definition: wave_data.cpp:979
virtual int childIndex(WaveData *wd) const
Definition: wave_data.cpp:1068
WaveDataGroup(WaveDataList *wdList, int grpId, const QString &nam)
Definition: wave_data.cpp:925
void add_waveform(WaveData *wd)
Definition: wave_data.cpp:986
virtual WaveData * removeAt(int inx)
Definition: wave_data.cpp:1090
QList< WaveData * > mGroupList
Definition: wave_data.h:330
virtual int netIndex(u32 id) const
Definition: wave_data.cpp:1073
QHash< WaveDataGroupIndex, int > mIndex
Definition: wave_data.h:332
virtual bool hasNetId(u32 id) const
Definition: wave_data.cpp:1078
friend uint qHash(const WaveDataGroupIndex &wdgi)
Definition: wave_data.cpp:550
WaveDataGroupIndex(const WaveData *wd)
Definition: wave_data.cpp:532
bool operator==(const WaveDataGroupIndex &other) const
Definition: wave_data.h:275
WaveDataGroupIndex(u32 id, bool isNet)
Definition: wave_data.h:274
void setData(const QMap< u64, int > &dat)
Definition: wave_data.cpp:119
void clear()
Definition: wave_data.h:136
int get_value_at(u64 t)
Definition: wave_data.cpp:125
SaleaeDirectoryNetEntry::Type composedType() const
Definition: wave_data.cpp:132
virtual u64 neighborTransition(double t, bool next) const
Definition: wave_data.cpp:360
bool hasSubscriber() const
Definition: wave_data.h:145
bool loadSaleae(const WaveDataTimeframe &tframe=WaveDataTimeframe())
Definition: wave_data.cpp:270
bool isEqual(const WaveData &other, int tolerance=0) const
Definition: wave_data.cpp:144
std::string get_name() const
Definition: wave_data.h:132
std::vector< std::pair< u64, int > > get_events(u64 t0=0) const
Definition: wave_data.cpp:194
void setDirty(bool dty)
Definition: wave_data.h:117
void resetWave()
Definition: wave_data.cpp:64
void setFileSize(u64 siz)
Definition: wave_data.cpp:69
static QString stringValue(int val, int bits, int base)
Definition: wave_data.cpp:489
bool rename(const QString &nam)
Definition: wave_data.cpp:89
virtual int intValue(double t) const
Definition: wave_data.cpp:454
void setBits(int bts)
Definition: wave_data.cpp:97
std::vector< std::pair< u64, int > > get_triggered_events(const WaveDataTrigger *wdTrig, u64 t0=0)
Definition: wave_data.cpp:183
void saveSaleae()
Definition: wave_data.cpp:320
virtual LoadPolicy loadPolicy() const
Definition: wave_data.cpp:75
void removeSubscriber()
Definition: wave_data.h:147
WaveData(const WaveData &other)
Definition: wave_data.cpp:48
QMap< u64, int > mData
Definition: wave_data.h:91
void addSubscriber()
Definition: wave_data.h:146
void setValueBase(int bas)
Definition: wave_data.h:142
int fileIndex() const
Definition: wave_data.h:109
void insert(u64 t, int val)
Definition: wave_data.h:137
u64 fileSize() const
Definition: wave_data.h:110
void setWaveDataList(WaveDataList *wdList)
Definition: wave_data.h:121
virtual ~WaveData()
Definition: wave_data.h:102
int valueBase() const
Definition: wave_data.h:111
void loadDataUnlessAlreadyLoaded()
Definition: wave_data.cpp:264
void setId(u32 id_)
Definition: wave_data.cpp:83
const QMap< u64, int > & data() const
Definition: wave_data.h:108
QMap< u64, int >::const_iterator timeIterator(double t) const
Definition: wave_data.cpp:352
int mValueBase
Definition: wave_data.h:90
NetType netType() const
Definition: wave_data.h:105
int dataIndex() const
Definition: wave_data.cpp:178
void setTimeframeSize(u64 siz)
Definition: wave_data.h:120
WaveDataList * mWaveDataList
Definition: wave_data.h:93
std::string fileName() const
Definition: wave_data.cpp:519
QString name() const
Definition: wave_data.h:104
void insertBooleanValueWithoutSync(u64 t, BooleanFunction::Value bval)
Definition: wave_data.cpp:103
virtual int bits() const
Definition: wave_data.h:106
void setFileIndex(int saleaIndex)
Definition: wave_data.h:118
bool isDirty() const
Definition: wave_data.h:107
QString strValue(int val) const
Definition: wave_data.cpp:484
u32 id() const
Definition: wave_data.h:103
u64 maxTime() const
Definition: wave_data.cpp:525
void updateWaveName(int iwave, const QString &nam)
Definition: wave_data.cpp:1347
QMap< u32, WaveDataGroup * > mDataGroups
Definition: wave_data.h:203
void waveUpdated(int inx, int grpId)
WaveData * waveDataByName(const std::string &nam) const
Definition: wave_data.cpp:1661
void emitWaveRemovedFromGroup(int iwave, int grpId)
Definition: wave_data.cpp:1367
void booleanAdded(int boolId)
void addWavesToGroup(u32 grpId, const QVector< WaveData * > &wds)
Definition: wave_data.cpp:1529
void waveRemovedFromGroup(int iwave, int grpId)
QMap< u32, WaveDataBoolean * > mDataBooleans
Definition: wave_data.h:204
void emitWaveUpdated(int inx)
Definition: wave_data.cpp:1377
void add(WaveData *wd, bool updateSaleae)
Definition: wave_data.cpp:1444
void waveDataAboutToBeChanged(int inx)
void updateGroupName(u32 grpId, const QString &nam)
Definition: wave_data.cpp:1357
void triggerEndResetModel()
int waveIndexByNetId(u32 id) const
Definition: wave_data.h:227
bool hasNet(u32 id) const
Definition: wave_data.h:229
SaleaeDirectory & saleaeDirectory()
Definition: wave_data.h:242
void addOrReplace(WaveData *wd)
Definition: wave_data.cpp:1630
void groupAdded(int grpId)
void waveRemoved(int inx)
void waveRenamed(int iwave)
void setValueForEmpty(int val)
Definition: wave_data.cpp:1744
WaveData * waveDataById(const int id)
Definition: wave_data.cpp:1673
void dump() const
Definition: wave_data.cpp:1333
void timeframeChanged(const hal::WaveDataTimeframe *tframe)
void remove(u32 id)
Definition: wave_data.cpp:1732
void waveAdded(int inx)
const WaveDataTimeframe & timeFrame() const
Definition: wave_data.h:233
void emitTimeframeChanged()
Definition: wave_data.cpp:1290
WaveData * waveDataByNet(const Net *n)
Definition: wave_data.cpp:1640
void incrementSimulTime(u64 deltaT)
Definition: wave_data.cpp:1295
void setUserTimeframe(u64 t0=0, u64 t1=0)
Definition: wave_data.cpp:1302
void triggerAdded(int trigId)
void groupRenamed(int grpId)
WaveDataList(const QString &sdFilename, QObject *parent=nullptr)
Definition: wave_data.cpp:1268
QSet< u32 > toSet() const
Definition: wave_data.cpp:1725
void triggerAddToView(u32 id) const
Definition: wave_data.cpp:1457
void removeGroup(u32 grpId)
Definition: wave_data.cpp:1553
void emitWaveAdded(int inx)
Definition: wave_data.cpp:1372
void emitGroupUpdated(int grpId)
Definition: wave_data.cpp:1388
void groupAboutToBeRemoved(hal::WaveDataGroup *grp)
void insertBooleanValue(WaveData *wd, u64 t, BooleanFunction::Value bval)
Definition: wave_data.cpp:1547
void triggerBeginResetModel()
void groupUpdated(int grpId)
void waveAddedToGroup(const QVector< u32 > &netIds, int grpId)
void updateWaveData(int inx)
Definition: wave_data.cpp:1408
QMap< u32, WaveDataTrigger * > mDataTrigger
Definition: wave_data.h:205
u32 maxGroupId() const
Definition: wave_data.h:210
u64 sceneMaxTime() const
Definition: wave_data.cpp:1228
bool hasUserTimeframe() const
Definition: wave_data.cpp:1256
void setSimulateMaxTime(u64 t)
Definition: wave_data.h:66
u64 sceneMinTime() const
Definition: wave_data.cpp:1242
void setSceneMaxTime(u64 t)
Definition: wave_data.cpp:1234
u64 simulateMaxTime() const
Definition: wave_data.cpp:1223
void setUserTimeframe(u64 t0=0, u64 t1=0)
Definition: wave_data.cpp:1261
virtual u64 neighborTransition(double t, bool next) const override
Definition: wave_data.cpp:897
void set_filter_wave(WaveData *wd)
Definition: wave_data.cpp:805
virtual int intValue(double t) const override
Definition: wave_data.cpp:820
QList< int > toValueList() const
Definition: wave_data.cpp:916
QList< WaveData * > children() const
Definition: wave_data.cpp:889
WaveData * get_filter_wave() const
Definition: wave_data.h:320
virtual LoadPolicy loadPolicy() const override
Definition: wave_data.cpp:864
WaveDataTrigger(WaveDataList *wdList, const QList< WaveData * > &wdTrigger, const QList< int > &toVal=QList< int >())
Definition: wave_data.cpp:781
uint64_t u64
Definition: defines.h:42
uint32_t u32
Definition: defines.h:41
Definition: defines.h:45
uint qHash(const LaneIndex &ri)
bool isEmpty() const const
int size() const const
void clear()
QMap::iterator insert(const Key &key, const T &value)
Q_OBJECTQ_OBJECT
Q_SIGNALSQ_SIGNALS
QObject * parent() const const
std::string toStdString() const const