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; 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; port2 -> mstb3 -> {port3, port4}; port3 -> mstb4; /* Malloc references */ edge [style=dashed;dir=back]; mstb1 -> {port1, port2}; port1 -> mstb2; port2 -> mstb3 -> {port3, port4}; port3 -> mstb4; } 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]; mstb1 [label="MSTB #1";style=filled;fillcolor=palegreen;shape=oval]; mstb2 [label="MSTB #2";style=filled;fillcolor=palegreen;shape=oval]; mstb3 [label="MSTB #3";style=filled;fillcolor=palegreen;shape=oval]; mstb4 [label="MSTB #4";style=filled;fillcolor=palegreen;shape=oval]; port1 [label="Port #1";shape=oval]; port2 [label="Port #2";shape=oval]; port3 [label="Port #3";shape=oval]; port4 [label="Port #4";shape=oval]; }