Toplevel directory cleanup
[senf.git] / tools / drawmodules.py
1 #!/usr/bin/python
2
3 import sys
4
5 mode = "MODULE"
6
7 sys.stdout.write("""
8 digraph Modules {
9 node [shape=Mrecord, fontsize=8, fontname="Helvetica"];
10 """)
11
12 modules = {}
13 connectors = {}
14
15 for line in sys.stdin:
16     line = line.strip()
17     if line == "":
18         mode = "MODULE"
19     elif mode == "MODULE":
20         moduleid, module = line.split(' ',1);
21         moduleid = moduleid[1:]
22         connectorid = type = peerid = None
23         modules[moduleid] = (module, []);
24         mode = "CONNECTOR"
25     else:
26         connectorid, type = line.split(' ',1);
27         connectorid = connectorid[1:]
28         elts = type.rsplit(' ',1);
29         if elts[-1].startswith('0x'):
30             type, peerid = elts
31             peerid = peerid[1:]
32         else:
33             peerid = None
34         modules[moduleid][1].append((connectorid, type, peerid))
35         connectors[connectorid] = moduleid
36
37 for moduleid, (module, cs) in modules.iteritems():
38     module = module.split('<',1)[0]
39     module = module.rsplit('::',1)[-1]
40     inputs = []
41     outputs = []
42     for connectorid, type, peerid in cs:
43         if 'Input' in type: inputs.append("<%s>%s" % (connectorid,connectorid))
44         else:               outputs.append("<%s>%s" % (connectorid,connectorid))
45     rows = []
46     if inputs: rows.append("{%s}" % "|".join(inputs))
47     rows.append("%s (%s)" % (module, moduleid))
48     if outputs: rows.append("{%s}" % "|".join(outputs))
49     sys.stdout.write('%s [label="{%s}"]\n' % (moduleid, "|".join(rows) ))
50
51 anonid = 0
52
53 for moduleid, (type, cs) in modules.iteritems():
54     for connectorid, type, peerid in cs:
55         opts = []
56         if "Passive" in type: opts.append("arrowtail=odot");
57         opts = ",".join(opts)
58         if opts: opts = " [%s]" % opts
59         if "Output" in type and peerid is not None:
60             sys.stdout.write('%s:%s -> %s:%s%s\n' 
61                              % (moduleid, connectorid, connectors[peerid], peerid, opts))
62         elif peerid is None:
63             sys.stdout.write('anon%d [label="", shape=point, height=.05];\n' % anonid)
64             if "Output" in type:
65                 sys.stdout.write('%s:%s -> anon%d%s;\n' % (moduleid, connectorid, anonid, opts))
66             else:
67                 sys.stdout.write('anon%d -> %s:%s%s;\n' % (anonid, moduleid, connectorid, opts))
68             anonid += 1
69
70 sys.stdout.write("}\n")