digraph T { /* Make sure our payloads are always drawn below the driver node */ subgraph cluster_driver { fillcolor = grey; style = filled; driver -> {payload1, payload2} [dir=none]; } /* Driver malloc references */ edge [style=dashed]; driver -> port1; driver -> port2; driver -> port3:e; driver -> port4 [color=red]; payload1:s -> port1:e; payload2:s -> port3:e; edge [style=""]; subgraph cluster_topology { label="Topology Manager"; labelloc=bottom; /* Topology references */ mstb1 -> {port1, port2}; port1 -> mstb2; edge [color=red]; port2 -> mstb3 -> {port3, port4}; port3 -> mstb4; edge [color=""]; /* Malloc references */ edge [style=dashed;dir=back]; mstb1 -> {port1, port2}; port1 -> mstb2; port2 -> mstb3 -> port3; edge [color=red]; mstb3 -> port4; port3 -> mstb4; } mstb1 [label="MSTB #1";style=filled;fillcolor=palegreen]; mstb2 [label="MSTB #2";style=filled;fillcolor=palegreen]; mstb3 [label="MSTB #3";style=filled;fillcolor=palegreen]; mstb4 [label="MSTB #4";style=filled;fillcolor=grey]; port1 [label="Port #1"]; port2 [label="Port #2"]; port3 [label="Port #3"]; port4 [label="Port #4";style=filled;fillcolor=grey]; driver [label="DRM driver";style=filled;shape=box;fillcolor=lightblue]; payload1 [label="Payload #1";style=filled;shape=box;fillcolor=lightblue]; payload2 [label="Payload #2";style=filled;shape=box;fillcolor=lightblue]; }