digraph {
  rankdir=TD;

  node [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.5, fontname="Arial"];

  edge [weight = 100];
  "DEFINED" -> "STARTED" [label="height >= start_height"];
  "STARTED" -> "MUST_SIGNAL" [label="height + 2016 >= timeoutheight AND lockinontimeout"];
  "STARTED" -> "FAILED" [label="height >= timeoutheight\nAND\nNOT lockinontimeout"];
  "LOCKED_IN" -> "ACTIVE" [label="height >= minimum_activation_height"];
  "LOCKED_IN":se -> "LOCKED_IN":ne [label="height < minimum_activation_height"];
  "MUST_SIGNAL" -> "LOCKED_IN" [label="always"];

  edge [weight = 1];
  "STARTED" -> "LOCKED_IN" [label="height < timeoutheight\nAND\nthreshold reached"];

  "FAILED" -> "LOCKED_IN" [style=invis];

  "DEFINED":sw -> "DEFINED":nw;
  "STARTED":sw -> "STARTED":nw;
  "ACTIVE":sw -> "ACTIVE":nw;
  "FAILED":sw -> "FAILED":nw;

  "STARTED" [fillcolor="#a0a0ff"];
  "MUST_SIGNAL" [fillcolor="#a0a0ff"];
  "LOCKED_IN" [fillcolor="#ffffa0"];
  "ACTIVE" [fillcolor="#a0ffa0"];
  "FAILED" [fillcolor="#ffa0a0"];

  { rank=same; "STARTED" "MUST_SIGNAL" }
  { rank=same; "FAILED" "LOCKED_IN" }
  { rank=sink; "ACTIVE" }
}


