Module: Emfrp::Graphviz

Extended by:
Graphviz
Included in:
Graphviz
Defined in:
lib/emfrp/compile/graphviz/graphviz.rb

Instance Method Summary collapse

Instance Method Details

#compile(top, output_io) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 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) ⇒ Object



49
50
51
# 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) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 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