Changed drawmodules to highlight NetEmu modules
[senf.git] / tools / drawmodules.py
1 #!/usr/bin/python
2
3 import sys
4
5 COLOR_SCHEME = 'pastel19'  # see http://www.graphviz.org/doc/info/colors.html
6 SOURCE_SINK = ["ActiveSocketSource", "PassiveSocketSource", "ActiveSocketSink", "PassiveSocketSink"]
7 NETEMU = ["InterfaceAnnotater" , "PacketMonitor" , "PacketTypeChecker"]
8 mode = "MODULE"
9
10 sys.stdout.write("""
11 digraph Modules {
12 node [shape=Mrecord, fontsize=8, fontname="Helvetica"];
13 """)
14
15 modules = {}
16 connectors = {}
17 p = 0
18
19 for opt in sys.argv:
20    if opt in ("-p","--packet"):
21         p = 1
22
23 for line in sys.stdin:
24     line = line.strip()
25     if line == "":
26         mode = "MODULE"
27     elif mode == "MODULE":
28         moduleid, module = line.split(' ',1);
29         moduleid = moduleid[1:]
30         connectorid = type = peerid = None
31         modules[moduleid] = (module, []);
32         mode = "CONNECTOR"
33     else:
34         connectorid, type = line.split(' ',1);
35         connectorid = connectorid[1:]
36         
37         packet = type.rsplit('<',1)[1];
38         packet = packet.rsplit('::',1)[-1];
39         packet = packet.split('>',1)[0];
40                 
41         elts = type.rsplit(' ',1);
42         if elts[-1].startswith('0x'):
43             type, peerid = elts
44             peerid = peerid[1:]
45         else:
46             peerid = None
47         modules[moduleid][1].append((connectorid, type, peerid, packet))
48         connectors[connectorid] = moduleid
49
50 for moduleid, (module, cs) in modules.iteritems():
51     module = module.split('<',1)[0]
52     if "senf" not in module.split('::',1)[0]:
53         if module.rsplit('::',1)[-1] in NETEMU:
54            color = 5
55         else:
56            color = 6
57     elif module.rsplit('::',1)[-1] in SOURCE_SINK:
58         color = 1
59     else:
60         color = 3
61     module = module.rsplit('::',1)[-1]
62     inputs = []
63     outputs = []
64     for connectorid, type, peerid,packet in cs:
65         if 'Input' in type: inputs.append("<%s>%s" % (connectorid,connectorid))
66         else:               outputs.append("<%s>%s" % (connectorid,connectorid))
67     rows = []
68     if inputs: rows.append("{%s}" % "|".join(inputs))
69     rows.append("%s (%s)" % (module, moduleid))
70     if outputs: rows.append("{%s}" % "|".join(outputs))
71     sys.stdout.write('%s [label="{%s}" style="filled" fillcolor="/%s/%s"  ]\n'
72                              % (moduleid, "|".join(rows),COLOR_SCHEME, color ))
73
74 anonid = 0
75
76 for moduleid, (type, cs) in modules.iteritems():
77     for connectorid, type, peerid, packet in cs:
78         opts = []
79         if "Passive" in type: opts.append("arrowtail=odot");
80         opts = ",".join(opts)
81         if opts: opts = " [%s]" % opts
82         if "Output" in type and peerid is not None:
83             if "Packet" in packet and p is 1:
84                 sys.stdout.write('%s:%s -> %s:%s%s [label=" %s", fontsize=8, fontname="Helvetica"]\n' 
85                              % (moduleid, connectorid, connectors[peerid], peerid, opts,packet))
86             else:
87                 sys.stdout.write('%s:%s -> %s:%s%s\n' 
88                              % (moduleid, connectorid, connectors[peerid], peerid, opts))
89         elif peerid is None:
90             sys.stdout.write('anon%d [label="", shape=point, height=.05];\n' % anonid)
91             if "Output" in type:
92                 sys.stdout.write('%s:%s -> anon%d%s;\n' % (moduleid, connectorid, anonid, opts))
93             else:
94                 sys.stdout.write('anon%d -> %s:%s%s;\n' % (anonid, moduleid, connectorid, opts))
95             anonid += 1
96
97 sys.stdout.write("}\n")
98