module Emfrp::Graphviz

Public Instance Methods

compile(top, output_io) click to toggle source
# File lib/emfrp/compile/graphviz/graphviz.rb, line 5
def compile(top, output_io)
  node_stmts, edge_stmts = [], []
  visited = {}
  top[:outputs].each do |n|
    node = top[:dict][:node_space][n[:name][:desc]].get
    traverse(top, node, node_stmts, edge_stmts, visited)
  end
  output_io << "digraph #{top[:module_name][:desc]} {\n"
  node_stmts.each do |s|
    output_io << "  #{s}\n"
  end
  edge_stmts.each do |s|
    output_io << "  #{s}\n"
  end
  output_io << "}\n"
end
escape_name(name) click to toggle source
# File lib/emfrp/compile/graphviz/graphviz.rb, line 49
def escape_name(name)
  CodegenContext.new(nil).escape_name(name)
end
traverse(top, node, node_stmts, edge_stmts, visited) click to toggle source
# File lib/emfrp/compile/graphviz/graphviz.rb, line 22
def traverse(top, node, node_stmts, edge_stmts, visited)
  return if visited[node]
  visited[node] = true
  name = node[:name][:desc]
  type = node[:typing].to_uniq_str
  node_attrs = ["label = \"#{name} : #{type}\""]
  case node
  when NodeDef
    if top[:outputs].find{|o| o[:name] == node[:name]}
      node_attrs += ["style = filled", "fillcolor = \"#e4e4e4\""]
    end
    node[:params].each do |n|
      ch_name = n[:name][:desc]
      if n[:last]
        edge_stmts << "#{escape_name(ch_name)} -> #{escape_name(name)} [style = dashed];"
      else
        edge_stmts << "#{escape_name(ch_name)} -> #{escape_name(name)};"
      end
      ch_node = top[:dict][:node_space][ch_name].get
      traverse(top, ch_node, node_stmts, edge_stmts, visited)
    end
  when InputDef
    node_attrs << "shape = \"invhouse\""
  end
  node_stmts << "#{escape_name(name)} [#{node_attrs.join(", ")}];"
end