00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef traceval_h
00026 #define traceval_h
00027
00028 #include <stdint.h>
00029 #include <iostream>
00030 #include <sstream>
00031 #include <map>
00032 #include <vector>
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 class Dumper;
00086
00102 class TraceValue {
00103
00104 public:
00106 TraceValue(size_t bits,
00107 const std::string &_name,
00108 const int __index=-1,
00109 void* shadow=0);
00110
00112 size_t bits() const;
00113
00115
00118 unsigned value() const;
00119
00121 std::string name() const;
00122
00124 std::string barename() const;
00125
00127 int index() const;
00128
00130 enum Atype {
00131 READ=1,
00132 WRITE=2,
00133 CHANGE=4
00134 };
00135
00138 bool enabled() const;
00139
00141 void enable();
00142
00143
00145 void change(unsigned val);
00146 void change(unsigned val, unsigned mask);
00148 void write(unsigned val);
00150 void read();
00151
00152
00155 bool written() const;
00156
00159 void set_written();
00160
00166 void set_written(unsigned val);
00167
00169 Atype flags() const;
00170
00172
00174 virtual void cycle();
00175
00178 virtual void dump(Dumper &d);
00179
00180 protected:
00182 void clear_flags();
00183 friend class TraceKeeper;
00184
00185 private:
00186 std::string _name;
00187
00188 int _index;
00189
00191 const unsigned b;
00192
00194 void *shadow;
00195
00197 unsigned v;
00199 int f;
00202 bool _written;
00203
00205
00207 bool _enabled;
00208 };
00209
00210 class AvrDevice;
00211 class TraceValueRegister;
00212
00213 typedef std::vector<TraceValue*> TraceSet;
00214
00216 class Dumper {
00217
00218 public:
00221 virtual void setActiveSignals(const TraceSet &act) {}
00222
00224 virtual void start() {}
00226 virtual void stop() {}
00227
00229 virtual void cycle() {}
00230
00233 virtual void markRead(const TraceValue *t) {}
00235 virtual void markReadUnknown(const TraceValue *t) {}
00236
00239 virtual void markWrite(const TraceValue *t) {}
00243 virtual void markChange(const TraceValue *t) {}
00244
00246
00247 virtual ~Dumper() {}
00248
00250
00253 virtual bool enabled(const TraceValue *t) const=0;
00254 };
00255
00258 class WarnUnknown : public Dumper {
00259
00260 public:
00261 WarnUnknown(AvrDevice *core);
00262 void markReadUnknown(const TraceValue *t);
00263 bool enabled(const TraceValue *t) const;
00264
00265 private:
00266 AvrDevice *core;
00267 };
00268
00270 class DumpVCD : public Dumper {
00271
00272 public:
00274 DumpVCD(std::ostream *os, const std::string &tscale = "ns",
00275 const bool rstrobes = false, const bool wstrobes = false);
00276
00278 DumpVCD(const std::string &name, const std::string &tscale = "ns",
00279 const bool rstrobes = false, const bool wstrobes = false);
00280
00281 void setActiveSignals(const TraceSet &act);
00282
00284 void start();
00285
00287 void stop();
00288
00290 void cycle();
00291
00294 void markRead(const TraceValue *t);
00295
00298 void markWrite(const TraceValue *t);
00299
00301 void markChange(const TraceValue *t);
00302
00303 bool enabled(const TraceValue *t) const;
00304 ~DumpVCD();
00305
00306 private:
00307 TraceSet tv;
00308 std::map<const TraceValue*, size_t> id2num;
00309 const std::string tscale;
00310 const bool rs, ws;
00311 bool changesWritten;
00312
00313
00314 std::vector<int> marked;
00315 std::ostream *os;
00316
00317
00318 std::stringstream osbuffer;
00319
00320 void valout(const TraceValue *v);
00321
00323 void flushbuffer(void);
00324 };
00325
00329 class DumpManager {
00330
00331 public:
00333 static DumpManager* Instance(void);
00334
00336
00343 void SetSingleDeviceApp(void);
00344
00347 void addDumper(Dumper *dump, const TraceSet &vals);
00348
00351 void start();
00352
00354 void stopApplication(void);
00355
00358 void cycle();
00359
00361 ~DumpManager() { stopApplication(); }
00362
00365 void save(std::ostream &os) const;
00366
00371 TraceSet load(std::istream &is);
00372
00377 TraceSet load(const std::string &istr);
00378
00380 const TraceSet& all();
00381
00382 private:
00383 friend class TraceValueRegister;
00384 friend class AvrDevice;
00385
00387 DumpManager();
00388
00390 void appendDeviceName(std::string &s);
00391
00393 void registerAvrDevice(AvrDevice* dev);
00394
00396 void unregisterAvrDevice(AvrDevice* dev);
00397
00399 TraceValue* seekValueByName(const std::string &name);
00400
00402 bool singleDeviceApp;
00403
00405 TraceSet active;
00407 TraceSet _all;
00408
00410 std::vector<Dumper*> dumps;
00411
00413 std::vector<AvrDevice*> devices;
00414 };
00415
00417
00418 class TraceValueRegister {
00419
00420 private:
00421 typedef std::map<std::string*, TraceValue*> valmap_t;
00422 typedef std::map<std::string*, TraceValueRegister*> regmap_t;
00423
00424 std::string _tvr_scopename;
00425 std::string _tvr_scopeprefix;
00426 valmap_t _tvr_values;
00427 regmap_t _tvr_registers;
00428
00430 void _tvr_registerTraceValues(TraceValueRegister *r);
00431
00432 protected:
00434 virtual size_t _tvr_getValuesCount(void);
00435
00437 virtual void _tvr_insertTraceValuesToSet(TraceSet &t);
00438
00439 public:
00441 TraceValueRegister(TraceValueRegister *parent, const std::string &name):
00442 _tvr_scopename(name),
00443 _tvr_scopeprefix(parent->GetTraceValuePrefix() + name + ".")
00444 {
00445 parent->_tvr_registerTraceValues(this);
00446 }
00448 TraceValueRegister():
00449 _tvr_scopename(""),
00450 _tvr_scopeprefix("")
00451 {
00452 DumpManager::Instance()->appendDeviceName(_tvr_scopename);
00453 if(_tvr_scopename.length() > 0)
00454 _tvr_scopeprefix += _tvr_scopename + ".";
00455 }
00456 ~TraceValueRegister();
00457
00459 const std::string GetTraceValuePrefix(void) { return _tvr_scopeprefix; }
00461 const std::string GetScopeName(void) { return _tvr_scopename; }
00463 void RegisterTraceValue(TraceValue *t);
00465 void UnregisterTraceValue(TraceValue *t);
00467 TraceValueRegister* GetScopeGroupByName(const std::string &name);
00469 virtual TraceValue* GetTraceValueByName(const std::string &name);
00471 TraceValueRegister* FindScopeGroupByName(const std::string &name);
00473 TraceValue* FindTraceValueByName(const std::string &name);
00475 TraceSet* GetAllTraceValues(void);
00477 TraceSet* GetAllTraceValuesRecursive(void);
00478 };
00479
00481 class TraceValueCoreRegister: public TraceValueRegister {
00482
00483 private:
00484 typedef std::map<std::string*, TraceSet*> setmap_t;
00485
00486 setmap_t _tvr_valset;
00487
00489 int _tvr_numberindex(const std::string &str);
00490
00491 protected:
00493
00494 virtual size_t _tvr_getValuesCount(void);
00495
00497
00498 virtual void _tvr_insertTraceValuesToSet(TraceSet &t);
00499
00500 public:
00502 TraceValueCoreRegister(TraceValueRegister *parent);
00503
00504 ~TraceValueCoreRegister();
00505
00507 void RegisterTraceSetValue(TraceValue *t, const std::string &name, const size_t size);
00509 virtual TraceValue* GetTraceValueByName(const std::string &name);
00510 };
00511
00513
00514 TraceValue *trace_direct(TraceValueRegister *t, const std::string &name, bool *val);
00515
00517
00518 TraceValue* trace_direct(TraceValueRegister *t, const std::string &name, uint8_t *val);
00519
00521
00522 TraceValue* trace_direct(TraceValueRegister *t, const std::string &name, uint16_t *val);
00523
00525
00526 TraceValue* trace_direct(TraceValueRegister *t, const std::string &name, uint32_t *val);
00527
00528 #endif