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