std::string dot()

in src/core/ir.cpp [540:597]


std::string dot(const IR &ir) {
  std::stringstream ss;
  ss << "digraph G {\n";
  ss << " node [fontname = \"courier\", fontsize=12];\n";
  ss << " { rank=sink; vars[shape=record,label=\"";
  auto vars = ir.vars();
  for (auto &v : vars) {
    ss << "<" << v << ">";
    ss << ir.var(v).name();
    if (&v != &vars.back()) {
      ss << "|";
    }
  }
  ss << "\"]; }\n";
  auto short_name = [](std::string name) {
    return name.substr(0, name.find("_"));
  };
  for (auto n : toposort(ir)) {
    ss << " ";
    ss << n << "[shape=record,";
    ss << "label=\"{" << loop_tool::dump(ir.node(n).op());
    ss << " : [";
    auto vars = ir.node(n).vars();
    for (auto &v : vars) {
      ss << short_name(ir.var(v).name());
      if (&v != &vars.back()) {
        ss << ", ";
      }
    }
    ss << "]|{";
    auto order = ir.order(n);
    int i = 0;
    for (auto &p : order) {
      ss << "<" << i++ << ">";
      ss << short_name(ir.var(p.first).name());
      if (p.second.size > 0) {
        ss << ":" << p.second.size;
      }
      if (p.second.tail > 0) {
        ss << "r" << p.second.tail;
      }
      if (&p != &order.back()) {
        ss << "|";
      }
    }
    ss << "}}\"];\n";
    for (auto out : ir.node(n).outputs()) {
      ss << " " << n << " -> " << out << ";\n";
    }
    i = 0;
    for (auto &p : order) {
      ss << " \"vars\":" << p.first << " -> \"" << n << "\":" << i++;
      ss << "[style=dotted,arrowhead=none,weight=0];\n";
    }
  }
  ss << "}\n";
  return ss.str();
}