ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
Dot.h
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2//
3// This file is part of ETISS. It is licensed under the BSD 3-Clause License; you may not use this file except in
4// compliance with the License. You should have received a copy of the license along with this project. If not, see the
5// LICENSE file.
14#ifndef ETISS_INTERFACES_DOT_H
15#define ETISS_INTERFACES_DOT_H
16
18#include "etiss/Misc.h"
19#include "etiss/ObjectPool.h"
21
22#include <fstream>
23#include <functional>
24#include <limits>
25#include <list>
26#include <unordered_map>
27#include <unordered_set>
28#include <vector>
29
30namespace std
31{
32template <>
33struct hash<std::pair<void const *, void const *>>
34{
35 std::hash<intptr_t> mh;
36 inline size_t operator()(const std::pair<void const *, void const *> &x) const
37 {
39 // create a pseudo pointer
40 intptr_t ret = ((intptr_t)x.first * 13) ^ ((intptr_t)x.second * 23) ^ (((intptr_t)x.first >> 15) * 19) ^
41 (((intptr_t)x.second >> 15) * 29);
42
43 return ret;
44 }
45};
46} // namespace std
47
48namespace etiss
49{
50namespace interfaces
51{
52
57class Dot
58{
59 public:
61 {
63
64 public:
65 std::string label_;
66 std::string color_;
67
68 public:
69 void print(std::ostream &out, const std::string &appendedattr);
70 };
71 class Link;
72 class Graph;
73 class Node : public AttrList
74 {
76
77 private:
78 inline Node(Dot *dot, Graph *parent, const std::string &id)
79 : dot_(dot), parent_(parent), id_(id.empty() ? (std::string("p_") + etiss::toString((size_t)this)) : id)
80 {
81 if (parent)
82 parent->nodes_.insert(this);
83 if (dot)
84 dot->idmap_.insert(std::make_pair(id_, this));
85 }
86
87 public:
88 virtual inline ~Node()
89 {
90 while (!links_.empty())
91 delete *links_.begin();
92 if (parent_)
93 parent_->nodes_.erase(this);
94 if (dot_)
95 dot_->idmap_.erase(id_);
96 }
97
98 public:
99 Dot *const dot_;
101 const std::string id_;
102
103 private:
104 std::unordered_set<Link *> links_;
105
106 public:
107 inline const std::unordered_set<Link *> &links() { return links_; }
108
109 public:
110 virtual inline Graph *asGraph() { return nullptr; }
111
112 public:
113 virtual void print(std::ostream &out, std::unordered_set<Link *> &icl);
114 };
115 class Link : public AttrList
116 {
118
119 private:
120 Link(Node *src, Node *dst) : src_(src), dst_(dst)
121 {
122 if (src)
123 src->links_.insert(this);
124 if (dst)
125 dst->links_.insert(this);
126 }
127
128 public:
129 virtual inline ~Link()
130 {
131 if (src_)
132 src_->links_.erase(this);
133 if (dst_)
134 dst_->links_.erase(this);
135 }
136
137 public:
138 Node *const src_;
139 Node *const dst_;
140
141 public:
142 void print(std::ostream &out);
143 };
144 class Graph : public Node
145 {
147
148 private:
149 inline Graph(Dot *dot, Graph *parent) : Node(dot, parent, "") {}
150
151 public:
152 virtual inline ~Graph()
153 {
154 while (!nodes_.empty())
155 delete (*nodes_.begin());
156 for (auto iter = dot_->graphs_.begin(); iter != dot_->graphs_.end(); ++iter)
157 {
158 if (*iter == this)
159 {
160 dot_->graphs_.erase(iter);
161 break;
162 }
163 }
164 }
165
166 public:
167 inline Graph *asGraph() override { return this; }
168
169 private:
170 std::unordered_set<Node *> nodes_;
171
172 public:
173 inline const std::unordered_set<Node *> &nodes() { return nodes_; }
174
175 public:
176 void print(std::ostream &out, std::unordered_set<Link *> &icl) override;
177 };
178
179 private:
180 std::list<Graph *> graphs_;
181 std::unordered_map<std::string, Node *> idmap_;
182
183 public:
184 ~Dot();
185 inline const std::list<Graph *> graphs() { return graphs_; }
186
187 Graph *createG(std::string name = "");
188 Graph *createG(Graph *parent, std::string name = "");
189 Node *createN(Graph *, const std::string &id, std::string name = "");
190 inline Node *pcreateN(Graph *g, const void *id, std::string name = "")
191 {
192 return createN(g, id ? (std::string("p_") + etiss::toString((size_t)this)) : "", name);
193 }
194 Link *createE(Node *src, Node *dst, std::string name = "");
195
196 Node *find(const std::string &id);
197
203 Node *lopenN(const std::list<std::string> &labelpath);
204
205 public:
206 virtual void print(std::ostream &out);
207};
208
209namespace dot
210{
211
213{
214 public:
215 class Link;
216 class Node
217 {
218 public:
219 inline Node() : id(0) {}
220 const void *id;
221 std::list<Link *> links;
222 };
223 class Link
224 {
225 public:
226 inline Link() : dst(0) {}
227 std::string color;
228 std::string label;
230 };
231
232 public:
233 void defineNode(const void *id, const std::string &name);
234 void undefineNode(const void *id);
235
236 Link *link(const void *src, const void *dst);
237
238 void flush(std::ofstream &out, const std::string &graph);
239
240 private:
241 void filterTmp(Node *start, Node *tmp, bool hideedge, const std::string &alabels, std::ofstream &out,
242 std::unordered_set<Node *> &nnl,
243 std::unordered_set<std::pair<const void *, const void *>> &dependencies,
244 std::unordered_set<Node *> &declared);
245
247 std::unordered_map<const void *, Node *> currentnodes_;
248 std::unordered_map<const void *, Node *> currentdstnodes_;
249 std::unordered_map<const void *, std::string> nodes_;
250};
251
253{
254 public:
255 class Link;
256 class Node //: public etiss::RefCountedObject<etiss::ObjectPool<Node> >
257 {
258 friend class Link;
260
261 public:
262 static const double Nan;
263
264 public:
265 inline Node(const void *id)
266 : id(id)
267 , color(0)
268 , cluster(0)
269 , time(Nan)
270 , weight(Nan)
273 , attrMap(0)
274 {
275 }
276 ~Node();
277 const void *const id;
278 const char *color;
279 const char *cluster;
280 double time;
281 double weight;
282 // std::name name; // name is stored in nodes_ map to prevent unneccessary copies;
283 void attrToString(std::ostream &out);
284 const std::unordered_set<Link *> &links_in_;
285 const std::unordered_set<Link *> &links_out_;
286 void setAttr(const std::string &name, const std::string &value);
287
288 private:
289 std::unordered_set<Link *> links_in;
290 std::unordered_set<Link *> links_out;
291 std::map<std::string, std::string> *attrMap;
292 };
293 class Link
294 {
295 public:
296 static const size_t label_size = 256;
297 inline Link(Node *src, Node *dst) : color(""), taken(true), src(src), dst(dst)
298 {
299 if ((src == 0) || (dst == 0))
300 throw "error";
301 if (src == dst)
302 throw "loop error";
303 label[0] = 0;
304 }
305 const char *color;
307 void setLabel(const char *);
308 bool taken;
309 void attrToString(std::ostream &out);
310 Node *const src;
311 Node *const dst;
312 };
313
314 public:
315 ValueOperationTraceGraphStreamer(const std::string &file, const std::string &depfile);
317 void defineNode(const void *id, const std::string &name);
318 void undefineNode(const void *id);
319
320 void link(const void *dst, std::initializer_list<const void *> sources, const char *label = 0);
321
322 void close();
323
324 void flush();
325
326 const std::unordered_set<std::pair<const void *, const void *>> &staticDependencies() const;
327
331
332 private:
333 void writePath();
334 void traverse(Node *n); //,std::unordered_set<Node*> & nodes); // debug loop detection
336
337 Node *openDestNode(const void *const dst, Node *&cleanup);
338 Node *openSourceNode(const void *const src);
339
343 // std::unordered_map<const void*,Node*,std::hash<const void*>, std::equal_to<const
344 // void*>,etiss::ObjectPool<std::pair<const void * const,Node*> > > currentnodes_;
346
347 std::unordered_set<std::pair<const void *, const void *>> dependencies_;
348
349 std::ofstream out;
350 std::ofstream depout;
351
352 public:
353 std::function<void(Node *)> setCurrentNodeAttr;
354 std::function<void(Link *, Node * /*dst*/, Node *const * /*sources*/, size_t /*sources_count*/,
355 std::initializer_list<const void *> & /*raw sources*/, const char * /*op*/)>
360
361 private:
364
365 char out_buf[256 * 256];
366 char depout_buf[256 * 256];
367
369};
370
372{
373 private:
374 std::unordered_map<const void *, std::unordered_set<const void *>, std::hash<const void *>,
375 std::equal_to<const void *>,
378
379 std::unordered_map<const void *, std::string, std::hash<const void *>, std::equal_to<const void *>,
382
383 std::unordered_set<std::pair<const void *, const void *>, std::hash<std::pair<const void *, const void *>>,
384 std::equal_to<std::pair<const void *, const void *>>,
387
388 public:
390 inline void declare(const void *const id, const std::string &name)
391 {
392 names_.insert(std::make_pair(id, name));
393 tmp_.erase(id);
394 }
395 inline void deleted(const void *const id)
396 {
397 tmp_.erase(id);
398 names_.erase(id);
399 }
400 void link(const void *dst, const std::initializer_list<const void *> &sources);
401
402 void write(
403 std::ostream &out, const std::string &graphname,
404 std::function<bool(const void * /*src*/, const void * /*dst*/, std::string & /*color*/)> filterOutCon =
405 [](const void *, const void *, std::string &) { return false; },
406 std::function<void(const void * /*id*/, std::string & /*color*/)> nodeattr = [](const void *,
407 std::string &) {});
408
409 public:
410#ifdef TRACEABLEFIED_H_
412 void tf_write(const std::string &filename);
413#endif
414};
415
416} // namespace dot
417
418} // namespace interfaces
419} // namespace etiss
420
421#endif // ETISS_INTERFACES_DOT_H
general configuration and logging
static __inline__ uint64_t
Definition arm_cde.h:31
implements a stack that may only grow (if needed) and can only contain native types since no destruct...
Definition ObjectPool.h:204
prealloc_inc defines the number of objects that is availabe within ObjectPools memory; default: 100
Definition ObjectPool.h:60
void print(std::ostream &out, const std::string &appendedattr)
Definition Dot.cpp:822
Graph * asGraph() override
Definition Dot.h:167
std::unordered_set< Node * > nodes_
Definition Dot.h:170
const std::unordered_set< Node * > & nodes()
Definition Dot.h:173
void print(std::ostream &out, std::unordered_set< Link * > &icl) override
Definition Dot.cpp:898
Graph(Dot *dot, Graph *parent)
Definition Dot.h:149
std::unordered_set< Link * > links_
Definition Dot.h:104
virtual void print(std::ostream &out, std::unordered_set< Link * > &icl)
Definition Dot.cpp:863
virtual Graph * asGraph()
Definition Dot.h:110
Graph *const parent_
Definition Dot.h:100
const std::unordered_set< Link * > & links()
Definition Dot.h:107
Node(Dot *dot, Graph *parent, const std::string &id)
Definition Dot.h:78
const std::string id_
Definition Dot.h:101
Node * createN(Graph *, const std::string &id, std::string name="")
Definition Dot.cpp:978
const std::list< Graph * > graphs()
Definition Dot.h:185
std::unordered_map< std::string, Node * > idmap_
Definition Dot.h:181
Node * pcreateN(Graph *g, const void *id, std::string name="")
Definition Dot.h:190
virtual void print(std::ostream &out)
Definition Dot.cpp:942
Graph * createG(std::string name="")
Definition Dot.cpp:963
Node * lopenN(const std::list< std::string > &labelpath)
travel/creates sub graphs with the given labels until i find/creates a node for the lase label.
Definition Dot.cpp:1005
std::list< Graph * > graphs_
Definition Dot.h:180
Link * createE(Node *src, Node *dst, std::string name="")
Definition Dot.cpp:988
Node * find(const std::string &id)
Definition Dot.cpp:997
const std::unordered_set< Link * > & links_out_
Definition Dot.h:285
const std::unordered_set< Link * > & links_in_
Definition Dot.h:284
void setAttr(const std::string &name, const std::string &value)
Definition Dot.cpp:272
std::map< std::string, std::string > * attrMap
Definition Dot.h:291
const std::unordered_set< std::pair< const void *, const void * > > & staticDependencies() const
Definition Dot.cpp:682
bool enable_default_graph_streaming_
set to false to disable the streaming of variable dependencies over time.
Definition Dot.h:328
std::function< void(Link *, const etiss::ExpandingNativeStack< Link *, 1000 > &)> setMetaLinkAttr
Definition Dot.h:357
etiss::FixedSizeHashMap< const void *, Node *, etiss::pointerHash< const void > > currentnodes_
Definition Dot.h:342
std::function< void(Node *)> setCurrentNodeAttr
Definition Dot.h:353
std::function< void(const etiss::ExpandingNativeStack< Link *, 1000 > &)> custWritePath
Definition Dot.h:358
std::unordered_set< std::pair< const void *, const void * > > dependencies_
Definition Dot.h:347
void link(const void *dst, std::initializer_list< const void * > sources, const char *label=0)
Definition Dot.cpp:408
etiss::ExpandingNativeStack< Link *, 1000 > path
Definition Dot.h:335
std::function< bool(const etiss::ExpandingNativeStack< Link *, 1000 > &)> hidePath
Definition Dot.h:359
std::function< void(Link *, Node *, Node *const *, size_t, std::initializer_list< const void * > &, const char *)> setCurrentLinkAttr
Definition Dot.h:356
Node * openDestNode(const void *const dst, Node *&cleanup)
Definition Dot.cpp:374
etiss::FixedSizeHashMap< Node *, uint64_t, etiss::pointerHash< const void > > nodeToTmpId_
Definition Dot.h:341
void defineNode(const void *id, const std::string &name)
Definition Dot.cpp:327
etiss::FixedSizeHashMap< const void *, std::string, etiss::pointerHash< const void > > nodes_
Definition Dot.h:345
Link * link(const void *src, const void *dst)
Definition Dot.cpp:35
std::unordered_map< const void *, Node * > currentdstnodes_
Definition Dot.h:248
void defineNode(const void *id, const std::string &name)
Definition Dot.cpp:23
void filterTmp(Node *start, Node *tmp, bool hideedge, const std::string &alabels, std::ofstream &out, std::unordered_set< Node * > &nnl, std::unordered_set< std::pair< const void *, const void * > > &dependencies, std::unordered_set< Node * > &declared)
Definition Dot.cpp:93
std::unordered_map< const void *, Node * > currentnodes_
Definition Dot.h:247
std::unordered_map< const void *, std::string > nodes_
Definition Dot.h:249
void flush(std::ofstream &out, const std::string &graph)
Definition Dot.cpp:151
std::unordered_map< const void *, std::unordered_set< const void * >, std::hash< const void * >, std::equal_to< const void * >, etiss::ObjectPool< std::pair< const void *const, std::unordered_set< const void * > > > > tmp_
Definition Dot.h:377
void link(const void *dst, const std::initializer_list< const void * > &sources)
Definition Dot.cpp:696
void declare(const void *const id, const std::string &name)
Definition Dot.h:390
std::unordered_set< std::pair< const void *, const void * >, std::hash< std::pair< const void *, const void * > >, std::equal_to< std::pair< const void *, const void * > >, etiss::ObjectPool< std::pair< const void *, const void * > > > deps_
Definition Dot.h:386
void deleted(const void *const id)
Definition Dot.h:395
std::unordered_map< const void *, std::string, std::hash< const void * >, std::equal_to< const void * >, etiss::ObjectPool< std::pair< const void *const, std::string > > > names_
Definition Dot.h:381
void write(std::ostream &out, const std::string &graphname, std::function< bool(const void *, const void *, std::string &)> filterOutCon=[](const void *, const void *, std::string &) { return false;}, std::function< void(const void *, std::string &)> nodeattr=[](const void *, std::string &) {})
Definition Dot.cpp:740
forwards: include/jit/*
Definition Benchmark.h:17
std::string toString(const T &val)
conversion of type T to std::string.
Definition Misc.h:133
STL namespace.
__INTPTR_TYPE__ intptr_t
A signed integer type with the property that any valid pointer to void can be converted to this type,...
__SIZE_TYPE__ size_t
The unsigned integer type of the result of the sizeof operator.
float __ovld __cnfn dot(float p0, float p1)
Compute dot product.
#define true
Definition stdbool.h:16
#define bool
Definition stdbool.h:15
size_t operator()(const std::pair< void const *, void const * > &x) const
Definition Dot.h:36