38 const std::string &__name,
40 const void *_shadow) :
78 if (((
v & mask) != (val & mask)) || !
_written) {
80 v = (
v & ~mask) | (val & mask);
115 nv = *(
const bool*)
shadow;
break;
117 nv = *(
const uint8_t*)
shadow;
break;
119 nv = *(
const uint16_t*)
shadow;
break;
121 nv = *(
const uint32_t*)
shadow;
break;
123 avr_error(
"Internal error: Unsupported number of bits in TraceValue::cycle().");
151 return (
v & (1 << bitNo)) ?
'1' :
'0';
157 unsigned val =
value();
170 for (valmap_t::iterator i = _tvr_values.begin(); i != _tvr_values.end(); i++) {
175 for (regmap_t::iterator i = _tvr_registers.begin(); i != _tvr_registers.end(); i++)
177 _tvr_registers.clear();
178 if(_tvr_parent != NULL)
179 _tvr_parent->_tvr_unregisterTraceValues(
this);
184 if(GetScopeGroupByName(n) == NULL) {
185 string *s =
new string(n);
186 pair<string*, TraceValueRegister*>
v(s, r);
187 _tvr_registers.insert(v);
189 avr_error(
"duplicate name '%s', another TraceValueRegister child is already registered", n.c_str());
194 for (regmap_t::iterator i = _tvr_registers.begin(); i != _tvr_registers.end(); i++) {
195 if(n == *(i->first)) {
197 _tvr_registers.erase(i);
204 size_t cnt = _tvr_values.size();
205 for (regmap_t::iterator i = _tvr_registers.begin(); i != _tvr_registers.end(); i++)
206 cnt += (i->second)->_tvr_getValuesCount();
211 for (valmap_t::iterator i = _tvr_values.begin(); i != _tvr_values.end(); i++)
212 t.push_back(i->second);
213 for (regmap_t::iterator i = _tvr_registers.begin(); i != _tvr_registers.end(); i++)
214 (i->second)->_tvr_insertTraceValuesToSet(t);
219 string p = t->
name();
220 unsigned int idx = _tvr_scopeprefix.length();
221 if((p.length() <= idx) || (p.substr(0, idx) != _tvr_scopeprefix))
222 avr_error(
"add TraceValue denied: wrong prefix: '%s', scope is '%s'",
223 p.c_str(), _tvr_scopeprefix.c_str());
224 string n = p.substr(idx);
225 if(n.find(
'.') != string::npos)
226 avr_error(
"add TraceValue denied: wrong name: '%s', scope is '%s'",
227 n.c_str(), _tvr_scopeprefix.c_str());
229 if(GetTraceValueByName(n) == NULL) {
230 string *s =
new string(n);
231 pair<string*, TraceValue*>
v(s, t);
232 _tvr_values.insert(v);
234 avr_error(
"add TraceValue denied: name found: '%s'", n.c_str());
238 int idx = _tvr_scopeprefix.length();
239 string n = t->
name().substr(idx);
240 for (valmap_t::iterator i = _tvr_values.begin(); i != _tvr_values.end(); i++) {
241 if(n == *(i->first)) {
244 _tvr_values.erase(i);
251 for (regmap_t::iterator i = _tvr_registers.begin(); i != _tvr_registers.end(); i++) {
252 if(name == *(i->first))
259 for (valmap_t::iterator i = _tvr_values.begin(); i != _tvr_values.end(); i++) {
260 if(name == *(i->first))
267 int idx = name.find(
'.');
275 return GetScopeGroupByName(name);
279 int idx = name.find(
'.');
287 return GetTraceValueByName(name);
292 result->reserve(_tvr_values.size());
293 for (valmap_t::iterator i = _tvr_values.begin(); i != _tvr_values.end(); i++)
294 result->push_back(i->second);
300 result->reserve(_tvr_getValuesCount());
301 _tvr_insertTraceValuesToSet(*result);
312 if(name == *(i->first)) {
320 string *s =
new string(name);
321 pair<string*, TraceSet*> v(s,
set);
325 (*set)[t->
index()] = t;
334 string n = name.substr(0, idx);
335 int v = atoi(name.substr(idx).c_str());
337 if(n == *(i->first)) {
339 if(v < (
int)
set->size())
352 for(
int j = s.size() - 1; j >= 0; j--)
363 cnt += i->second->size();
372 for(TraceSet::iterator j = s->begin(); j != s->end(); j++)
384 if(c < '0' || c >
'9') {
397 cerr <<
"READ-before-WRITE for value " << t->
name()
399 <<
", PC=0x" << hex << 2*
core->
PC << dec << endl;
407 for (
int i = v->
bits()-1; i >= 0; i--)
414 *os << osbuffer.str();
415 changesWritten =
false;
421 const std::string &_tscale,
423 const bool wstrobes) :
427 changesWritten(false),
432 const std::string &_tscale,
434 const bool wstrobes) :
439 os(new ofstream(_name.c_str()))
445 for (TraceSet::const_iterator i=act.begin();
448 avr_error(
"Trace value would be twice in VCD list.");
456 "\tSimulavr VCD dump file generator\n" 459 *
os <<
"$timescale 1" <<
tscale <<
" $end\n";
460 typedef TraceSet::iterator iter;
462 for (iter i=
tv.begin();
464 string s=(*i)->name();
469 for (ld=s.size()-1; ld>0; ld--)
470 if (s[ld]==
'.')
break;
472 *
os <<
"$scope module " << s.substr(0, ld) <<
" $end\n";
473 *
os <<
"$var wire " << (*i)->bits() <<
' ' << n*(1+
rs+
ws) <<
' ' << s.substr(ld+1, s.size()-1) <<
" $end\n";
475 *
os <<
"$var wire 1 " << n*(1+
rs+
ws)+1 <<
' ' << s.substr(ld+1, s.size()-1)+
"_R" <<
" $end\n";
477 *
os <<
"$var wire 1 " << n*(1+
rs+
ws)+1+
rs <<
' ' << s.substr(ld+1, s.size()-1)+
"_W" <<
" $end\n";
478 *
os <<
"$upscope $end\n";
481 *
os <<
"$enddefinitions $end\n";
487 for (iter i=
tv.begin();
516 for (
size_t i=0; i<
marked.size(); i++)
529 *
os <<
"#" << clock <<
'\n';
568 if(_instance == NULL)
575 _instance->detachAvrDevices();
583 singleDeviceApp =
false;
588 if(singleDeviceApp && _devidx > 1)
589 avr_error(
"Can't create device name twice, because it's a single device application");
599 vector<AvrDevice*> dl;
600 for(vector<AvrDevice*>::iterator i =
devices.begin(); i !=
devices.end(); i++) {
609 vector<AvrDevice*> dl;
611 for(vector<AvrDevice*>::iterator i =
devices.begin(); i !=
devices.end(); i++) {
618 if(singleDeviceApp) {
621 return devices[0]->FindTraceValueByName(name);
623 int idx = name.find(
'.');
626 for(vector<AvrDevice*>::iterator i =
devices.begin(); i !=
devices.end(); i++) {
627 if((*i)->GetScopeName() == name.substr(0, idx)) {
628 return (*i)->FindTraceValueByName(name.substr(idx + 1));
637 avr_error(
"method SetSingleDeviceApp must be called before devices are added to DumpManager");
638 singleDeviceApp =
true;
643 for(TraceSet::const_iterator i = vals.begin(); i != vals.end(); i++) {
645 if(find(active.begin(), active.end(), *i) == active.end())
646 active.push_back(*i);
650 if(find(dumps.begin(), dumps.end(), dump) != dumps.end())
651 avr_error(
"Internal error: Dumper already registered.");
655 dumps.push_back(dump);
665 for(vector<AvrDevice*>::const_iterator d =
devices.begin(); d !=
devices.end(); d++) {
667 s = (*d)->GetAllTraceValuesRecursive();
669 _all.reserve(_all.size() + s->size());
671 for(TraceSet::const_iterator i = s->begin(); i != s->end(); i++)
681 for (
size_t i=0; i< dumps.size(); i++)
688 for (
size_t i=0; i<dumps.size(); i++)
692 for (TraceSet::iterator i=active.begin();
693 i!=active.end(); i++) {
695 for (
size_t j=0; j<dumps.size(); j++)
697 (*i)->dump(*dumps[j]);
702 for(
size_t i = 0; i < dumps.size(); i++) {
711 for(vector<AvrDevice*>::const_iterator d =
devices.begin(); d !=
devices.end(); d++) {
712 s = (*d)->GetAllTraceValuesRecursive();
713 for(TraceSet::const_iterator i = s->begin(); i != s->end(); i++) {
715 if (tv.
index() >= 0) {
718 while(((*i)->barename() == tv.
barename()) &&
719 (c == (*i)->index())) {
727 << tv.
index() <<
" .. " 728 << (*i)->index() <<
'\n';
730 os <<
"+ " << (*i)->name() <<
'\n';
733 os <<
"+ " << (*i)->name() <<
'\n';
745 vector<string> ls =
split(l);
748 if(ls.size() < 2)
continue;
756 avr_error(
"TraceValue '%s' is not known.", n.c_str());
759 }
else if(ls[0] ==
"|") {
762 avr_error(
"'..' expected between range limits.");
765 size_t min = atoi(ls[2].c_str());
766 size_t max = atoi(ls[4].c_str());
768 for(
size_t i = min; i <= max; i++) {
772 avr_error(
"While constructing range with '%s', TraceValue is not known.", n.c_str());
776 }
else if(ls[0][0] !=
'#')
778 avr_error(
"Invalid trace value specifier '%s'.", ls[0].c_str());
784 istringstream is(istr.c_str());
static std::vector< AvrDevice * > devices
virtual char VcdBit(int bitNo) const
Basic AVR device, contains the core functionality.
void read()
Log a read access.
setmap_t _tvr_valset
the registered TraceValue's
void markWrite(const TraceValue *t)
void flushbuffer(void)
writes content of osbuffer to os and empty osbuffer afterwards
SystemClockOffset GetCurrentTime() const
Returns the current simulation time.
WarnUnknown(AvrDevice *core)
TraceSet * GetAllTraceValuesRecursive(void)
Get all here registered TraceValue's with descending values.
TraceSet * GetAllTraceValues(void)
Get all here registered TraceValue's only (not with descending values)
~TraceValueCoreRegister()
int index() const
Gives the index of this member in a memory field (or -1)
void unregisterAvrDevice(AvrDevice *dev)
Remove a device from devicelist.
void registerAvrDevice(AvrDevice *dev)
Add a device to devicelist.
void valout(const TraceValue *v)
unsigned value() const
Gives the saved shadow value for this trace value.
std::string readline(istream &is)
Reads one line from a stream.
virtual TraceValue * GetTraceValueByName(const std::string &name)
Get a here registered TraceValue by it's name.
void markReadUnknown(const TraceValue *t)
TraceValue * FindTraceValueByName(const std::string &name)
Seek for a TraceValue by it's name.
std::string barename() const
Gives the name without the index.
vector< std::string > split(const std::string &inp, std::string splitc)
Splits a string into a vector of strings at delimiters splitc.
void setActiveSignals(const TraceSet &act)
virtual char VcdBit(int bitNo) const
virtual void _tvr_insertTraceValuesToSet(TraceSet &t)
Insert all TraceValues into TraceSet, that registered here and descending.
DumpManager()
Private instance constructor.
TraceSet load(std::istream &is)
std::stringstream osbuffer
virtual void markRead(const TraceValue *t)
void save(std::ostream &os) const
static DumpManager * _instance
int _tvr_numberindex(const std::string &str)
helper function to split up into name an number tail
Atype flags() const
Gives the current set of flag readings.
void stopApplication(void)
Stop processing on all dumpers and removes it from dumpers list.
virtual ~TraceValueRegister()
static void Reset(void)
Reset DumpManager instance (e.g. delete available instance)
size_t bits() const
Give number of bits for this value. Max 32.
const unsigned b
number of bits
Build a register for TraceValue's.
virtual size_t _tvr_getValuesCount(void)
Get the count of all TraceValues, that are registered here and descending.
std::map< const TraceValue *, size_t > id2num
void RegisterTraceSetValue(TraceValue *t, const std::string &name, const size_t size)
Registers a TraceValue for this register.
void RegisterTraceValue(TraceValue *t)
Registers a TraceValue for this register.
static SystemClock & Instance()
Returns the central SystemClock instance for the application.
virtual void markWrite(const TraceValue *t)
TraceValue(size_t bits, const std::string &_name, const int __index=-1, const void *shadow=NULL)
Generate a new unitialized trace value of width bits.
std::string name() const
Give name (fully qualified), including the index appended if it is >=0.
TraceValueRegister * FindScopeGroupByName(const std::string &name)
Seek for a TraceValueRegister by it's name.
void write(unsigned val)
Log a write access on this value.
TraceValueRegister * GetScopeGroupByName(const std::string &name)
Get a here registered TraceValueRegister by it's name.
long long SystemClockOffset
std::string int2str(int i)
Convert an int into a string.
const void * shadow
shadow reg, if used
virtual void setActiveSignals(const TraceSet &act)
void SetSingleDeviceApp(void)
Tell DumpManager, that we have only one device.
void cycle()
Writes next clock cycle and resets all RS and WS states.
void _tvr_unregisterTraceValues(TraceValueRegister *r)
virtual size_t _tvr_getValuesCount(void)
Get the count of all TraceValues, that are registered here and descending.
TraceValueCoreRegister(TraceValueRegister *parent)
Create a TraceValueCoreRegister instance.
virtual TraceValue * GetTraceValueByName(const std::string &name)
Get a here registered TraceValue by it's name.
DumpVCD(std::ostream *os, const std::string &tscale="ns", const bool rstrobes=false, const bool wstrobes=false)
Create tracer with time scale tscale and output os.
void markRead(const TraceValue *t)
unsigned v
The value itself.
void detachAvrDevices()
detach all devices
const std::string GetTraceValuePrefix(void)
Returns the scope prefix.
void UnregisterTraceValue(TraceValue *t)
Unregisters a TraceValue, remove it from register.
void start()
Writes header stuff and the initial state.
void markChange(const TraceValue *t)
virtual void markChange(const TraceValue *t)
bool _enabled
Tracing of this value enabled at all?
void stop()
Writes a last time marker.
void _tvr_registerTraceValues(TraceValueRegister *r)
std::vector< int > marked
void enable()
Enable tracing.
static DumpManager * Instance(void)
Singleton class access.
void change(unsigned val)
Log a change on this value.
bool enabled(const TraceValue *t) const
Returns true iff tracing a particular value is enabled.
std::vector< TraceValue * > TraceSet
virtual void _tvr_insertTraceValuesToSet(TraceSet &t)
Insert all TraceValues into TraceSet, that registered here and descending.
void appendDeviceName(std::string &s)
append a unique device name to a string
TraceValue * seekValueByName(const std::string &name)
Seek value by name in all devices.
virtual void markReadUnknown(const TraceValue *t)
TraceValue * trace_direct(TraceValueRegister *t, const std::string &name, const bool *val)
Register a directly traced bool value.
const std::string GetScopeName(void)
Returns the scope name.
bool enabled(const TraceValue *t) const
Returns true iff tracing a particular value is enabled.
int f
accesses since last dump/clearflagsd
virtual void cycle()
Called at least once for each cycle if this trace value is activated.
virtual void dump(Dumper &d)
void addDumper(Dumper *dump, const TraceSet &vals)
Atype
Possible access types for a trace value.