anchor.diff:                          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
  +                            let edge = 
  +                                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 
  +                                | _ -> 
  +                                    let argNode = build arg
  +                                    let lbl = if args.Length > 1 then sprintf "%d" i else ""
  +                                    newEdge argNode opNode lbl 
  +                            srcEdges.[(expr, i)] <- edge
                           opNode
   
               exprs |> List.map build, Map.ofDictionary nodeForExpr
  +
  +        // edge blinking
  +        let mutable blinkEdges : List<Edge> = []
  +        let mutable blinkOriginalEdgeColor : List<Edge * Color> = []
  +        let doBlinkUpdate () =
  +            if blinkOriginalEdgeColor.IsEmpty then
  +                blinkOriginalEdgeColor <- blinkEdges
  +                                          |> List.map (fun e -> 
  +                                                let origColor = e.Attr.Color
  +                                                e.Attr.Color <- Color.Blue
  +                                                e, origColor)
  +            else
  +                for e, origColor in blinkOriginalEdgeColor do
  +                    e.Attr.Color <- origColor
  +                blinkOriginalEdgeColor <- []
  +            viewer.Refresh()
   
           /// nodes for storages
           //let nodeForStorage = Dictionary<string, Node> ()
  +
  +        /// nodes for execution units
  +        let nodeForEuId = Dictionary<int, Node> ()
   
           // build graph
           let resNodes, nodeForExpr = nodesForExprs graph.RootSubgraph rootExprs
  
positive.code:             form.WindowState <- System.Windows.Forms.FormWindowState.Maximized
  
              // graph viewer
              let viewer = new GViewer(Graph=graph, Dock=DockStyle.Fill)
              viewer.PanButtonPressed <- true
              viewer.ToolBarIsVisible <- false
              form.Controls.Add viewer
  
              // splitter ArrayNDManikins / MemManikins
  
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
  