digraph { start [label="Wormhole Code\nMachine" style="dotted"] {rank=same; start S0} {rank=same; P_list_nameplates P_allocate} {rank=same; S1 S2} {rank=same; S3 P_allocate_generate} start -> S0 [style="invis"] S0 [label="S0:\nunknown"] S0 -> P_set_code [label="set"] P_set_code [shape="box" label="W.set_code"] P_set_code -> S_known S_known [label="known" color="green"] S0 -> P_list_nameplates [label="input"] S2 [label="S2: typing\nnameplate"] S2 -> P_nameplate_completion [label=""] P_nameplate_completion [shape="box" label="do completion"] P_nameplate_completion -> P_list_nameplates P_list_nameplates [shape="box" label="NL.refresh_nameplates"] P_list_nameplates -> S2 S2 -> P_got_nameplates [label="got_nameplates"] P_got_nameplates [shape="box" label="stash nameplates\nfor completion"] P_got_nameplates -> S2 S2 -> P_finish_nameplate [label="" color="orange" fontcolor="orange"] P_finish_nameplate [shape="box" label="lookup wordlist\nfor completion"] P_finish_nameplate -> S3 S3 [label="S3: typing\ncode"] S3 -> P_code_completion [label=""] P_code_completion [shape="box" label="do completion"] P_code_completion -> S3 S3 -> P_set_code [label="" color="orange" fontcolor="orange"] S0 -> P_allocate [label="allocate"] P_allocate [shape="box" label="C.tx_allocate"] P_allocate -> S1 S1 [label="S1:\nallocating"] S1 -> P_allocate_generate [label="rx_allocated"] P_allocate_generate [shape="box" label="generate\nrandom code"] P_allocate_generate -> P_set_code }