anchor.diff:                  resLabelNode.Label.FontColor <- Color.White
                   newEdge resNode resLabelNode "" |> ignore
   
  +        /// adds manikin information
           member this.AddManikins (euId: int) (uExpr: UExprT) 
                                   (trgtManikins: Map<string, ArrayNDManikinT>) 
                                   (srcManikins: ArrayNDManikinT list) =
  +            match nodeForExpr.TryFind uExpr with
  +            | Some node -> nodeForEuId.[euId] <- node
  +            | None -> ()
   
               for KeyValue(ch, manikin) in trgtManikins do
                   arrayNDManikins.Add {Manikin=manikin; EuId=euId; UExpr=uExpr; Relation=Target ch} 
               for src, manikin in List.indexed srcManikins do
                   arrayNDManikins.Add {Manikin=manikin; EuId=euId; UExpr=uExpr; Relation=Src src}
   
  -//            match nodeForExpr.TryFind uExpr with
  -//            | Some exprNode ->
  -//                // add manikin info node
  -//                let manikinNode = newNode graph.RootSubgraph // TODO: fix subgraphs
  -//                manikinNode.LabelText <- manikins 
  -//                                         |> List.map (fun (_, manikinStr, _) -> manikinStr)
  -//                                         |> String.concat "\n"
  -//                manikinNode.Attr.FillColor <- Color.Beige
  -//                manikinNode.Label.FontColor <- Color.Black
  -//                let manikinEdge = newEdge manikinNode exprNode ""
  -//                manikinEdge.Attr.ArrowheadAtTarget <- ArrowStyle.None
  -//
  -//                // add storage nodes
  -//                for label, _, storageStr in manikins do
  -//                    let storageNode =
  -//                        match nodeForStorage.TryFind storageStr with
  -//                        | Some storageNode -> storageNode
  -//                        | None -> 
  -//                            let n = newNode graph.RootSubgraph // TODO: fix subgraphs
  -//                            n.LabelText <- storageStr
  -//                            n.Attr.FillColor <- Color.Bisque
  -//                            n.Label.FontColor <- Color.Black
  -//                            nodeForStorage.[storageStr] <- n
  -//                            n
  -//                    newEdge storageNode manikinNode label |> ignore                       
  -//
  -//            | None -> () // ignore manikin information for unknown nodes
  -
           /// shows the graph
           member this.Show () = 
  +            // add execution unit id to nodes
  +            for KeyValue(euId, node) in Map.ofDictionary nodeForEuId do
  +                node.LabelText <- sprintf "%d: %s" euId node.LabelText
  +
               // form
               let form = new System.Windows.Forms.Form(Text=graph.Label.Text, 
                                                        Width=1000, Height=600)
  
positive.code:                         nodeForExpr.[expr] <- opNode
  
                          for i, arg in List.indexed args do
                              match arg with
                              | UExpr (UExtraOp (Channel ch), [chSrc], _) ->
                                  let argNode = build chSrc
                                  let lbl = if args.Length > 1 then sprintf "%d=%s" i ch else ch
                                  newEdge argNode opNode lbl |> ignore
                              | _ -> 
                                  let argNode = build arg
                                  let lbl = if args.Length > 1 then sprintf "%d" i else ""
                                  newEdge argNode opNode lbl |> ignore
                          opNode
  
              exprs |> List.map build, Map.ofDictionary nodeForExpr
  
          /// nodes for storages
          //let nodeForStorage = Dictionary<string, Node> ()
  
          // build graph
          let resNodes, nodeForExpr = nodesForExprs graph.RootSubgraph rootExprs
  
negative.code:                 for visArrayNDManikin in visArrayNDManikins do
                      arrayNDManikinBinding.Add visArrayNDManikin |> ignore
                  arrayNDManikinView.AutoResizeColumns()
                  arrayNDManikinView.SelectAll()
  
              memManikinView.SelectionChanged.Add (fun _ -> 
                  match memManikinView.SelectedRows.Count with
                  | 0 -> arrayNDManikinBinding.Clear()
                  | 1 -> updateArrayNDManikinView (memManikinView.SelectedRows.[0].DataBoundItem :?> VisMemManikin)
                  | _ -> ())
  
              arrayNDManikinView.SelectionChanged.Add (fun _ ->
                  let edges = 
                      arrayNDManikinView.SelectedRows
                      |> Seq.cast<DataGridViewRow>
                      |> Seq.map (fun row -> row.DataBoundItem :?> VisArrayNDManikin)
                      |> Seq.choose (function | {UExpr=uExpr; Relation=Src src} -> Some (uExpr, src)
                                              | _ -> None)
                      |> Seq.choose (fun (uexpr, src) -> srcEdges.TryFind (uexpr, src))
                      |> List.ofSeq
                  blinkEdges <- edges)
  
              // blink timer
              let blinkTimer = new Timer(Interval=500)
              blinkTimer.Tick.Add (fun _ -> doBlinkUpdate())
              blinkTimer.Start()
  
              // show
              form.ResumeLayout()
              form.ShowDialog () |> ignore
  