digraph {

        start [label="Wormhole Code\nMachine" style="dotted"]
        {rank=same; start S0}
        {rank=same; P0_list_nameplates P0_allocate}
        {rank=same; S1 S2}
        {rank=same; S3 P1_generate}
        start -> S0 [style="invis"]
        S0 [label="S0:\nunknown"]
        S0 -> P0_set_code [label="set"]
        P0_set_code [shape="box" label="W.set_code"]
        P0_set_code -> S4
        S4 [label="S4: known" color="green"]

        S0 -> P0_list_nameplates [label="input"]
        S2 [label="S2: typing\nnameplate"]

        S2 -> P2_completion [label="<tab>"]
        P2_completion [shape="box" label="do completion"]
        P2_completion -> P0_list_nameplates
        P0_list_nameplates [shape="box" label="NL.refresh_nameplates"]
        P0_list_nameplates -> S2

        S2 -> P2_got_nameplates [label="got_nameplates"]
        P2_got_nameplates [shape="box" label="stash nameplates\nfor completion"]
        P2_got_nameplates -> S2
        S2 -> P2_finish [label="<hyphen>" color="orange" fontcolor="orange"]
        P2_finish [shape="box" label="lookup wordlist\nfor completion"]
        P2_finish -> S3
        S3 [label="S3: typing\ncode"]
        S3 -> P3_completion [label="<tab>"]
        P3_completion [shape="box" label="do completion"]
        P3_completion -> S3

        S3 -> P0_set_code [label="<return>"
                           color="orange" fontcolor="orange"]

        S0 -> P0_allocate [label="allocate"]
        P0_allocate [shape="box" label="RC.tx_allocate"]
        P0_allocate -> S1
        S1 [label="S1:\nallocating"]
        S1 -> P1_generate [label="rx_allocated"]
        P1_generate [shape="box" label="generate\nrandom code"]
        P1_generate -> P0_set_code
        
}