let vertex_attributes v =
let n = V.label v in
let label = match !n with
| Vstart _ -> "Start" | Vexit _ -> "Exit"
| VfctIn _ -> "FctIn" | VfctOut _ -> "FctOut"
| VblkOut s -> Format.sprintf "BLOCKout <%d>" s.sid
| _ ->
let s = VL.stmt n in
(match s.skind with
| Instr _ -> Format.sprintf "INSTR <%d>\n%s" s.sid (pretty_raw_stmt s)
| 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
| If(e, _, _, _) -> Pretty_utils.sfprintf
"IF <%d>\n%a" s.sid !Ast_printer.d_exp e
| Switch _ -> Format.sprintf "SWITCH <%d>" s.sid
| Loop _ -> Format.sprintf "WHILE(1) <%d>" s.sid
| Block _ -> Format.sprintf "BLOCKin <%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)
in
let attr = match !n with
| Vstart _ | Vexit _ -> [`Color 0x0000FF; `Shape `Doublecircle]
| VfctIn _ | VfctOut _ -> [`Color 0x0000FF; `Shape `Box]
| VblkIn _ | VblkOut _ -> [`Shape `Box]
| Vloop _ -> [`Color 0xFF0000; `Style `Filled]
| Vtest _ -> [`Color 0x00FF00; `Style `Filled; `Shape `Diamond]
| Vstmt _ -> []
in (`Label (String.escaped label))::attr