22 const Node & rvsdgNode,
55 node.SetLabel(
type.debug_string());
77 graph.GetElementFromProgramObject(*rvsdgInput.
origin())))
79 auto & edge = graph.CreateDirectedEdge(*originPort, inputPort);
116 const bool traverseRecursively)
121 for (
size_t n = 0; n < region.
narguments(); n++)
124 auto & argument = *region.
argument(n);
128 node.SetAttribute(
"index", std::to_string(n));
131 node.SetLabel(argument.debug_string());
134 if (argument.input())
136 node.SetAttributeObject(
"input", *argument.input());
138 node.AppendToLabel(
util::strfmt(
"<- ", argument.input()->debug_string()),
" ");
147 for (
const auto rvsdgNode : traverser)
149 auto & node = graph.
CreateInOutNode(rvsdgNode->ninputs(), rvsdgNode->noutputs());
150 node.
SetLabel(rvsdgNode->DebugString());
151 node.SetProgramObject(*rvsdgNode);
153 for (
size_t i = 0; i < rvsdgNode->ninputs(); i++)
156 for (
size_t i = 0; i < rvsdgNode->noutputs(); i++)
160 const auto structuralNode =
dynamic_cast<const StructuralNode *
>(rvsdgNode);
161 if (structuralNode && traverseRecursively)
163 for (
auto & subregion : structuralNode->Subregions())
165 auto & subGraph = node.CreateSubgraph();
166 subGraph.SetLabel(
util::strfmt(
"RegionID: ", subregion.getRegionId()));
175 for (
size_t n = 0; n < region.
nresults(); n++)
178 auto & result = *region.
result(n);
182 node.SetAttribute(
"index", std::to_string(n));
185 node.SetLabel(result.debug_string());
190 node.SetAttributeObject(
"output", *result.output());
192 node.AppendToLabel(
util::strfmt(
"-> ", result.output()->debug_string()),
" ");
201 const bool emitTypeGraph)
void AttachNodeOutput(util::graph::Port &outputPort, const Output &rvsdgOutput, util::graph::Graph *typeGraph)
virtual void AnnotateGraphNode(const Node &rvsdgNode, util::graph::Node &node, util::graph::Graph *typeGraph)
virtual ~DotWriter() noexcept
virtual void AnnotateTypeGraphNode(const Type &type, util::graph::Node &node)
util::graph::Graph & WriteGraphs(util::graph::Writer &writer, const Region ®ion, bool emitTypeGraph)
util::graph::Graph & WriteGraph(util::graph::Writer &writer, const Region ®ion)
void AttachNodeInput(util::graph::Port &inputPort, const Input &rvsdgInput)
virtual void AnnotateRegionArgument(const RegionArgument ®ionArgument, util::graph::Node &node, util::graph::Graph *typeGraph)
virtual void AnnotateEdge(const Input &rvsdgInput, util::graph::Edge &edge)
void CreateGraphNodes(util::graph::Graph &graph, const Region ®ion, util::graph::Graph *typeGraph, bool traverseRecursively)
util::graph::Node & GetOrCreateTypeGraphNode(const Type &type, util::graph::Graph &typeGraph)
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
size_t index() const noexcept
Represents the argument of a region.
Represent acyclic RVSDG subgraphs.
RegionResult * result(size_t index) const noexcept
size_t nresults() const noexcept
Id getRegionId() const noexcept
RegionArgument * argument(size_t index) const noexcept
size_t narguments() const noexcept
void SetProgramObject(const T &object)
void SetLabel(std::string label)
void SetAttributeGraphElement(const std::string &attribute, const GraphElement &element)
ArgumentNode & CreateArgumentNode()
GraphElement * GetElementFromProgramObject(uintptr_t object) const
ResultNode & CreateResultNode()
InOutNode & CreateInOutNode(size_t inputPorts, size_t outputPorts)
Graph & GetGraph() override
static std::string type(const Node *n)
static std::string strfmt(Args... args)