【问题标题】:Create Graphviz dot library/import创建 Graphviz 点库/导入
【发布时间】:2020-11-03 03:43:50
【问题描述】:

TLDR

为了使我能够拥有尽可能自动生成的基于文本的图形文档,我希望能够定义多种节点类型,并让这些定义可导入

更长的解释

我正在研究project,我在其中为用 VHDL 编写的硬件设计自动生成 Graphviz 点 RTL 图。我正在定义的节点的定义是复杂和粗略的,应该对用户隐藏。我希望能够定义几种节点类型,并使这些定义可导入并易于实例化。我开始感觉 graphviz/dot 可能不是正确的解决方案,我很乐意放弃 Graphviz 以获得更好的东西。我只想生成尽可能自动生成的基于文本的图形文档。目前我生成了一个复杂的节点定义,例如:

    Full_Adder_1bit [shape=plaintext, label=<
      <table border='1' cellborder='0' cellspacing='0'>
        <tr><td>Full_Adder_1bit</td></tr>
        <tr>
          <td><table border='0' cellborder='1' cellspacing='0' color='green'>
            <tr><td port='A'> A </td></tr>
            <tr><td port='B'> B </td></tr>
            <tr><td port='Cin'> Cin </td></tr>
          </table></td>
          <td><table border='0' cellborder='1' cellspacing='0' color='red'>
            <tr><td port='Sum'> Sum </td></tr>
            <tr><td port='Cout'> Cout </td></tr>
          </table></td>
        </tr>
      </table> >]

为了让用户使用它来记录他们的设计,他们必须正确使用 node 关键字,然后创建节点/端口来连接。

    node [shape=plaintext, label=<
      <table border='1' cellborder='0' cellspacing='0'>
        <tr><td>Full_Adder_1bit</td></tr>
        <tr>
          <td><table border='0' cellborder='1' cellspacing='0' color='green'>
            <tr><td port='A'> A </td></tr>
            <tr><td port='B'> B </td></tr>
            <tr><td port='Cin'> Cin </td></tr>
          </table></td>
          <td><table border='0' cellborder='1' cellspacing='0' color='red'>
            <tr><td port='Sum'> Sum </td></tr>
            <tr><td port='Cout'> Cout </td></tr>
          </table></td>
        </tr>
      </table> >]

    // -- MAIN --
    add1:Cout -> add2:Cin
    add2:Cout -> add3:Cin
    add3:Cout -> add4:Cin

This question 没有回答我的问题,因为我想做的是:

lib.dot

    Full_Adder_1bit [shape=plaintext, label=<
      <table border='1' cellborder='0' cellspacing='0'>
        <tr><td>Full_Adder_1bit</td></tr>
        <tr>
          <td><table border='0' cellborder='1' cellspacing='0' color='green'>
            <tr><td port='A'> A </td></tr>
            <tr><td port='B'> B </td></tr>
            <tr><td port='Cin'> Cin </td></tr>
          </table></td>
          <td><table border='0' cellborder='1' cellspacing='0' color='red'>
            <tr><td port='Sum'> Sum </td></tr>
            <tr><td port='Cout'> Cout </td></tr>
          </table></td>
        </tr>
      </table> >]

rtl.dot

    include(`lib.dot')

    add1 : instance of (Full_Adder_1bit)  
    add2 : instance of (Full_Adder_1bit)    
    add3 : instance of (Full_Adder_1bit)  
    add4 : instance of (Full_Adder_1bit)  
        
    // -- MAIN --
    add1:Cout -> add2:Cin   
    add2:Cout -> add3:Cin    
    add3:Cout -> add4:Cin  

【问题讨论】:

  • 您的解决方案可能是m4,更多详情here

标签: vhdl documentation graphviz register-transfer-level


【解决方案1】:

你可以使用 c 预处理器

或使用子图来控制哪些节点获得哪个标签标签 (添加了一些门以获得更说明性的示例)

例如

digraph G {
    rankdir=LR
    
// definitions
    subgraph Full_Adder_1bit { node [shape=plaintext, label=<
      <table border='1' cellborder='0' cellspacing='0'>
        <tr><td>Full_Adder_1bit</td></tr>
        <tr>
          <td><table border='0' cellborder='1' cellspacing='0' color='green'>
            <tr><td port='A'> A </td></tr>
            <tr><td port='B'> B </td></tr>
            <tr><td port='Cin'> Cin </td></tr>
          </table></td>
          <td><table border='0' cellborder='1' cellspacing='0' color='red'>
            <tr><td port='Sum'> Sum </td></tr>
            <tr><td port='Cout'> Cout </td></tr>
          </table></td>
        </tr>
      </table> >]
    }
    subgraph NAND {
        node[label=<<table border="0" cellspacing="0" cellborder="1">
            <tr><td port='A'>A</td><td port='out' rowspan="2">NAND</td></tr>
            <tr><td port='B'>B</td></tr>
            </table>> shape=none margin=0]
    }
    subgraph AND {
        node[label=<<table border="0" cellspacing="0" cellborder="1">
            <tr><td port='A'>A</td><td port='out' rowspan="2">AND</td></tr>
            <tr><td port='B'>B</td></tr>
            </table>> shape=none margin=0]
    }
    subgraph NOR {
        node[label=<<table border="0" cellspacing="0" cellborder="1">
            <tr><td port='A'>A</td><td port='out' rowspan="2">NOR</td></tr>
            <tr><td port='B'>B</td></tr>
            </table>> shape=none margin=0]
    }
    subgraph OR {
        node[label=<<table border="0" cellspacing="0" cellborder="1">
            <tr><td port='A'>A</td><td port='out' rowspan="2">OR</td></tr>
            <tr><td port='B'>B</td></tr>
            </table>> shape=none margin=0]
    }
    subgraph NOT {
        node[label=<<table border="0" cellspacing="0" cellborder="1">
            <tr><td port='A'>A</td><td port='out' >NOT</td></tr>
            </table>> shape=none margin=0]
    }
    subgraph Point { node[shape=point xlabel="\N"] }



// declarations
    subgraph Point { A_xor B_xor out_xor }
    subgraph AND { and1 and2 }
    subgraph NOT { not1 not2 }
    subgraph OR { or1 }
// connections
    A_xor->and1:A
    A_xor->not1:A not1:out->and2:A
    B_xor->and2:B
    B_xor->not2:A not2:out->and1:B
    and1:out->or1:A
    and2:out->or1:B
    or1:out->out_xor


    subgraph Full_Adder_1bit {
        add1:Cout -> add2:Cin
        add2:Cout -> add3:Cin
        add3:Cout -> add4:Cin
    }

}

【讨论】:

  • 肯定有所改进,但仍然不是我闭上眼睛想象导入节点类型时的梦想。我试试这个方法,看看能不能再成熟一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多