如何通过消除蛇行和更好的边缘交叉来影响 Graphviz/dot 来制作更好的控制流图?

2024-04-14

我正在为 Python 程序绘制控制流图,并希望影响哪种边缘不​​应交叉。有没有办法做到这一点?

考虑这个简单的 Python 程序:

try:
    a += 1
except:
    a += 2
else:
    a = 3

以及一个点程序来表示通过生成的控制流https://github.com/rocky/python-control-flow/ https://github.com/rocky/python-control-flow/

digraph G {
  mclimit=1.5;
  rankdir=TD; ordering=out;
  graph[fontsize=10 fontname="Verdana"];
  color="#efefef";
  node[shape=box style=filled fontsize=8 fontname="Verdana" fillcolor="#efefef"];
  edge[fontsize=8 fontname="Verdana"];

  node_0 [shape = "oval"][label="Basic Block 0\loffsets: 0..12\lflags=entry, block, unconditional, try\ljumps=[34]\l"];
  node_1 [label="Basic Block 1\loffsets: 14..30\lflags=except, unconditional\ljumps=[38]\l"];
  node_2 [label="Basic Block 2\loffsets: 32..32\lflags=end finally\l"];
  node_3 [label="Basic Block 3\loffsets: 34..36\l"];
  node_4 [label="Basic Block 4\loffsets: 38..40\lflags=no fallthrough\l"];

  node_0 -> node_2 [weight=1][color="red"];
  node_3 -> node_4 [weight=10];
  node_0 -> node_1 [weight=1][color="red"];
  node_2 -> node_3 [weight=10];
  node_0 -> node_1 [weight=10][style="invis"];
  node_1 -> node_2 [weight=10][style="invis"];
  node_1 -> node_4 [weight=1];
  node_0 -> node_3 [weight=1];
}

The image that dot produces for the above is enter image description here

注意一条线如何蜿蜒并与向下的直箭头交叉。相反,我更希望没有一个直接向下的箭头会被交叉。带花键的边缘可以提供更好的交叉位置。

如果你看一下这个点,我有两个看不见的向下边缘,我用它们来对齐。 (在字节码中,它们遵循指令的线性序列)。

因此,如果需要跨越向下的直线(这里不需要),则不可见的边缘将优于可见的边缘。

想法?

Edit

到目前为止,一个很好的答案建议更改边缘定义的顺序,并在某些情况下指定应进行边缘附件的位置。

在此应用程序中,我确实拥有来自支配树的分层嵌套信息,并且可以对边进行分类:循环的边、跳转到复合结构末尾的边、打破循环的边等。

所以现在问题就变成了how人们使用此信息来避免那些蜿蜒的箭头,并确保跳出循环优先于跨越“if”/“else”跳转边缘。

这感觉就像 VLSI 设计:提出一组适用于每种(控制流)结构的模式,然后这些模式将正确嵌套和排序。

我已经尝试过边缘排序和放置,但我只是没有直觉地知道何时提前或推迟放置某些内容。

对于结构化控制流边缘的指导,或者更好的设计规则,我们将不胜感激。


您需要做两件事来改善这种情况:

  • 绘制您想要比其他边缘更早控制的边缘(其中之一),
  • 告诉 graphviz 你想让它们附着在哪里(北、东......)

我已经相应地编辑了你的代码

digraph G {
  mclimit=1.5;
  rankdir=TD; ordering=out;
  graph[fontsize=10 fontname="Verdana"];
  color="#efefef";
  node[shape=box style=filled fontsize=8 fontname="Verdana" fillcolor="#efefef"];
  edge[fontsize=8 fontname="Verdana"];

  node_0 [shape = "oval"][label="Basic Block 0\loffsets: 0..12\lflags=entry, block, unconditional, try\ljumps=[34]\l"];
  node_1 [label="Basic Block 1\loffsets: 14..30\lflags=except, unconditional\ljumps=[38]\l"];
  node_2 [label="Basic Block 2\loffsets: 32..32\lflags=end finally\l"];
  node_3 [label="Basic Block 3\loffsets: 34..36\l"];
  node_4 [label="Basic Block 4\loffsets: 38..40\lflags=no fallthrough\l"];

  node_0 -> node_3:nw [weight=1];           /* moved up and added directions*/
  node_0 -> node_2 [weight=1][color="red"];
  node_3 -> node_4 [weight=10];
  node_0 -> node_1 [weight=1][color="red"];
  node_2 -> node_3 [weight=10];
  node_0 -> node_1 [weight=10][style="invis"];
  node_1 -> node_2 [weight=10][style="invis"];
  node_1:se -> node_4:ne [weight=1];            /* added directions */
}

这给了你

这里涉及一些尝试和错误,但我确信这应该有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过消除蛇行和更好的边缘交叉来影响 Graphviz/dot 来制作更好的控制流图? 的相关文章

  • 使用 C++ 代码中的 Windows 本机程序打开文件

    我的 C 程序创建 png 文件 我需要在创建后立即打开 查看 该文件 有没有办法打开它 以便在其中打开它Windows资源管理器 因此文件将使用用户首选的程序打开 并且如果没有与文件格式关联的程序 Windows 将显示对话框窗口 用户可
  • 子图有相同的节点,如何使其唯一

    我通过 perl 脚本创建点文件 这是包含相同节点的子图 例如 subgraph aa gt bb gt cc subgraph dd gt bb gt ee 我知道这些子图使用相同的命名空间 所以我的结果输出很混乱 在每个子图中 我可以使
  • Graphviz 和 Brew doctor - 意外的 dylibs 错误

    刚刚做了一个brew install graphviz在 Mountain Lion 上 这给了我这个错误 错误 执行失败 make install graphviz rb 47 以为我只是卸载它 所以跑了brew uninstall gr
  • 在 graphviz 中使用符号字体/数学符号

    环境 graphviz 2 38 Windows 7 Using dot 我想生成如下所示的路径图来表示结构方程模型 好吧 这里只是一个简单的单因素测量模型 我想对某些节点和边使用希腊字母 并且实际上更喜欢如果我可以在点文件中使用类似 La
  • 在graphviz中从节点到边绘制边

    是否可以在 graphviz 中从节点绘制一条边到现有边的中心 我想复制化学或生物网络中常见的这种类型的反应图 Thanks Peter 是的 您可以使用不可见节点 例如这个例子 https stackoverflow com questi
  • 为什么使用 for 循环而不是 while 循环? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 for 循环还是 while 循环进行迭代 https stackoverflow com questions 99164 iterate with for loop or while loop
  • GraphViz - 子图的对齐

    I d like to draw a diagram like this But the only diagram I can draw is 我使用的代码 graph rankdir LR node shape box x1 x2 x3
  • Perl 跳出 If 语句

    这个刚刚出现 我如何摆脱困境if陈述 我有一个很长的 if 语句 但有一种情况我可以尽早摆脱它 在循环中我可以这样做 while something last if some condition blah blah blah 但是 我可以对
  • 增加子图之间的距离

    我有以下代码 digraph g graph rankdir LR compound true subgraph cluster0 graph label Ready n nAllowed Purchaser Operations nope
  • Java图形布局算法

    在我的 Java 应用程序中 我需要某种布局算法 第一种方法如下 需要安装Graphviz包 创建点文件 从java应用程序调用graphviz并解析输出 布局 使用 graphviz 的布局显示图形 属性点 但这个解决方案需要在运行的机器
  • 如何控制 graphviz 中的节点放置(即避免边缘交叉)

    我正在使用 graphviz 点 生成您可以在下面看到的图表 左下角的节点 红色椭圆 会引起烦恼 因为它的边缘与相邻节点的多个边缘交叉 有没有办法将节点放置限制在某个区域 您可以创建一个不可见的约束 以使红色节点出现在所有其他节点的左侧 r
  • 在 .dot 树中强制执行水平节点排序

    我正在尝试使用 GraphViz 重新创建二叉搜索树的示例图 它最终应该是这样的 这是我的第一次尝试 digraph G nodesep 0 3 ranksep 0 2 margin 0 1 node shape circle edge a
  • graphviz.backend.ExecutableNotFound:无法执行 ['dot', '-Tpng'],请确保 Graphviz 可执行文件位于系统的 PATH 上

    我花了一个小时找不到这个问题的任何解决方案 所以决定最好在这里提问 唯一给出的丰富信息here https stackoverflow com questions 35064304 runtimeerror make sure the gr
  • django Rest框架的控制流程是什么

    我正在为 web 应用程序开发 api 我最初使用的是 tastypie 后来改用了django rest framework drf Drf 对我来说似乎很容易 我打算做的是创建嵌套的用户配置文件对象 我的模型如下 from django
  • 在 Windows、Python 2.7 上安装 PyGraphViz

    我无法在 Windows XP 上安装 pygraphviz 我正在使用Python27 在启动安装之前 我已经更改了 setup py 文件的这两个变量 library path C Archivos de programa Graphv
  • 将 doxygen 的图表从上到下方向翻转为从左到右

    doxygen 图为 includes and 包含在 创建的嵌套深度从上到下递增 使用 1 8 5 由于我们的图大多是带有许多节点的浅图 这会导致非常宽的图和丑陋的水平滚动条 有没有办法教 doxygen 以从左到右的方向创建这些图 就像
  • 使用 LLVM 为整个源代码生成 CFG

    LLVM 社区的任何人都知道是否有一种方法可以使用以下方法为整个输入源代码生成 CFG opt dot cfg foo ll bc 由于此函数为每个函数生成 CFG 因此函数之间的连接将被忽略 看来旧的分析工具已经贬值了 我想知道你是否找到
  • 用于生成交互式图的 Java 库

    我想将我们的 SOA 服务可视化为图表 我们有商业服务和领域服务 gt domain service 1 e g business service 1 gt domain service 2 gt domain service 3 我目前使
  • 在 python 中使用 graphviz 从 DOT 文件绘制有向图

    这是API参考 http graphviz readthedocs io en latest api html for graphviz 我找不到任何从现有的生成有向图的方法dot源文件 方法如render and view保存在新文件中
  • 如何让 graphviz 记录的单元格对齐

    我正在 graphviz 中使用记录节点来制作一个简单的表格 但它看起来错误 digraph g node shape record height 08 node1 label DBAT 0 1 2 3 4 5 6 7 8 9 10 11

随机推荐