let vertex_attributes v =
    let n = V.label v in
    let label = match node_type n with
      | Vstart -> "Start" | Vend -> "End" | Vexit -> "Exit"
      | VfctIn -> "FctIn" | VfctOut -> "FctOut"
      | VblkIn (bk,_) -> Pretty_utils.sfprintf "BLOCKin <%a>" pp_bkind bk
      | VblkOut (bk,_) -> Pretty_utils.sfprintf "BLOCKout <%a>" pp_bkind bk
      | Vcall _ -> Format.sprintf "CALL"
      | Vtest (true, s, e) ->
           Pretty_utils.sfprintf "IF <%d>\n%a" s.sid !Ast_printer.d_exp e
      | Vtest (false, s, _e) -> Pretty_utils.sfprintf "IFout <%d>" s.sid
      | Vstmt s | Vloop (_, s) | Vswitch (s, _) ->
          begin match s.skind with
       | Instr _ -> Format.sprintf "INSTR <%d>\n%s" s.sid (pretty_raw_stmt s)
       | If _ -> "invalid IF ?"
       | Return _ -> Format.sprintf "RETURN <%d>" s.sid
       | Goto _ -> Format.sprintf "%s <%d>" (pretty_raw_stmt s) s.sid
       | Break _ -> Format.sprintf "BREAK <%d>" s.sid
       | Continue _ -> Format.sprintf "CONTINUE <%d>" s.sid
       | Switch _ ->  Format.sprintf "SWITCH <%d>" s.sid
       | Loop _ ->  Format.sprintf "WHILE(1) <%d>" s.sid
       | Block _ ->  Format.sprintf "BLOCK??? <%d>" s.sid
       | TryExcept _ ->  Format.sprintf "TRY EXCEPT <%d>" s.sid
       | TryFinally _ ->  Format.sprintf "TRY FINALLY <%d>" s.sid
       | UnspecifiedSequence _ ->  Format.sprintf "UnspecifiedSeq <%d>" s.sid
          end
      | Vloop2 (_, n) -> Format.sprintf "Loop-%d" n
    in
    let attr = match node_type n with
      | Vstart | Vend | Vexit -> [`Color 0x0000FF; `Shape `Doublecircle]
      | VfctIn | VfctOut -> [`Color 0x0000FF; `Shape `Box]
      | VblkIn _ | VblkOut _ -> [`Shape `Box]
      | Vloop _ | Vloop2 _ -> [`Color 0xFF0000; `Style `Filled]
      | Vtest _ | Vswitch _ -> [`Color 0x00FF00; `Style `Filled`Shape `Diamond]
      | Vcall _ | Vstmt _ -> []
    in (`Label (String.escaped label))::attr