6 #ifndef JLM_UTIL_GRAPHWRITER_HPP
7 #define JLM_UTIL_GRAPHWRITER_HPP
14 #include <unordered_map>
64 [[nodiscard]]
virtual const char *
72 [[nodiscard]] std::string
78 [[nodiscard]]
virtual Graph &
81 [[nodiscard]]
const Graph &
98 AppendToLabel(std::string_view text, std::string_view sep =
"\n");
109 [[nodiscard]]
const std::string &
115 [[nodiscard]] std::string_view
156 [[nodiscard]] uintptr_t
165 SetAttribute(const std::
string & attribute, std::
string value);
207 [[nodiscard]] std::optional<std::string_view>
215 [[nodiscard]] std::optional<uintptr_t>
269 using AttributeValue = std::variant<std::string, const GraphElement *, uintptr_t>;
295 [[nodiscard]]
virtual bool
301 [[nodiscard]]
virtual bool
307 [[nodiscard]]
const std::vector<Edge *> &
397 static inline const char *
const Circle =
"circle";
398 static inline const char *
const Oval =
"oval";
399 static inline const char *
const Point =
"point";
400 static inline const char *
const Plain =
"plain";
401 static inline const char *
const Plaintext =
"plaintext";
402 static inline const char *
const Triangle =
"triangle";
531 void SetShape(std::string)
override;
729 static inline const char *
const Solid =
"solid";
730 static inline const char *
const Dashed =
"dashed";
731 static inline const char *
const Dotted =
"dotted";
733 static inline const char *
const Bold =
"bold";
734 static inline const char *
const Tapered =
"tapered";
789 [[nodiscard]]
const Writer &
939 static_assert(!std::is_pointer_v<T>);
950 template<
typename Element,
typename ProgramObject>
954 static_assert(std::is_base_of_v<GraphElement, Element>);
956 auto result =
dynamic_cast<Element *
>(element);
1045 [[nodiscard]]
Graph &
1051 [[nodiscard]]
size_t
1057 [[nodiscard]]
Graph &
1067 template<typename T>
1073 static_assert(!std::is_pointer_v<T>);
1093 [[nodiscard]]
Graph &
1103 [[nodiscard]]
size_t
1124 inline const char *
const Black =
"#000000";
1125 inline const char *
const Blue =
"#0000FF";
1126 inline const char *
const Coral =
"#FF7F50";
1129 inline const char *
const Gold =
"#FFD700";
1130 inline const char *
const Gray =
"#BEBEBE";
1131 inline const char *
const Green =
"#00FF00";
1132 inline const char *
const Orange =
"#FFA500";
1133 inline const char *
const Purple =
"#A020F0";
1134 inline const char *
const Red =
"#FF0000";
1135 inline const char *
const Brown =
"#8B4513";
1137 inline const char *
const White =
"#FFFFFF";
1138 inline const char *
const Yellow =
"#FFFF00";
bool CanBeEdgeHead() const override
void SetOutsideSource(const Port &outsideSource)
const char * GetIdPrefix() const override
const Port * OutsideSource_
~ArgumentNode() override=default
ArgumentNode(Graph &graph)
void OutputASCII(std::ostream &out, size_t indent) const override
void SetStyle(std::string style)
void SetArrowTail(std::string arrow)
Port & GetOtherEnd(const Port &end)
const char * GetIdPrefix() const override
Graph & GetGraph() override
Edge(Port &from, Port &to, bool directed)
void OutputDot(std::ostream &out, size_t indent) const
void SetArrowHead(std::string arrow)
size_t GetUniqueIdSuffix() const
void SetProgramObject(const T &object)
GraphElement & operator=(GraphElement &&other)=delete
virtual Graph & GetGraph()=0
void SetLabel(std::string label)
uintptr_t GetProgramObject() const noexcept
std::string GetFullId() const
void SetAttributeObject(const std::string &attribute, uintptr_t object)
virtual ~GraphElement()=default
void RemoveProgramObject()
std::variant< std::string, const GraphElement *, uintptr_t > AttributeValue
void AppendToLabel(std::string_view text, std::string_view sep="\n")
void SetAttribute(const std::string &attribute, std::string value)
virtual const char * GetIdPrefix() const =0
std::string_view GetLabelOr(std::string_view otherwise) const
GraphElement(const GraphElement &other)=delete
const std::string & GetLabel() const
bool RemoveAttribute(const std::string &attribute)
GraphElement(GraphElement &&other)=delete
std::optional< uintptr_t > GetAttributeObject(const std::string &attribute) const
std::unordered_map< std::string, AttributeValue > AttributeMap_
GraphElement & operator=(const GraphElement &other)=delete
void OutputAttributes(std::ostream &out, AttributeOutputFormat format) const
bool HasAttribute(const std::string &attribute) const
const GraphElement * GetAttributeGraphElement(const std::string &attribute) const
std::optional< size_t > UniqueIdSuffix_
std::optional< std::string_view > GetAttributeString(const std::string &attribute) const
void SetProgramObjectUintptr(uintptr_t object)
void SetAttributeGraphElement(const std::string &attribute, const GraphElement &element)
bool HasProgramObject() const noexcept
std::vector< std::unique_ptr< ArgumentNode > > ArgumentNodes_
ArgumentNode & CreateArgumentNode()
Node & GetNode(size_t index)
GraphElement * GetElementFromProgramObject(uintptr_t object) const
std::unordered_map< uintptr_t, GraphElement * > ProgramObjectMapping_
Node & GetResultNode(size_t index)
Edge & GetEdge(size_t index)
Edge * GetEdgeBetween(Port &a, Port &b)
void OutputASCII(std::ostream &out, size_t indent) const
Edge & CreateUndirectedEdge(Port &a, Port &b)
const char * GetIdPrefix() const override
void RemoveProgramObjectMapping(uintptr_t object)
std::vector< std::unique_ptr< Edge > > Edges_
Graph & GetGraph() override
ResultNode & CreateResultNode()
size_t NumResultNodes() const noexcept
void Output(std::ostream &out, OutputFormat format, size_t indent=0) const
std::vector< std::unique_ptr< ResultNode > > ResultNodes_
void OutputDot(std::ostream &out, size_t indent) const
size_t NumEdges() const noexcept
size_t NumNodes() const noexcept
Node & GetArgumentNode(size_t index)
InOutNode & CreateInOutNode(size_t inputPorts, size_t outputPorts)
Edge & CreateDirectedEdge(Port &from, Port &to)
size_t NumArgumentNodes() const noexcept
std::vector< std::unique_ptr< Node > > Nodes_
Element & GetFromProgramObject(const ProgramObject &object) const
Edge & CreateEdge(Port &from, Port &to, bool directed)
void MapProgramObjectToElement(GraphElement &element)
~Graph() override=default
size_t NumInputPorts() const
void OutputSubgraphs(std::ostream &out, OutputFormat format, size_t indent) const override
std::unordered_map< std::string, std::string > HtmlTableAttributes_
std::vector< std::unique_ptr< OutputPort > > OutputPorts_
void OutputDot(std::ostream &out, size_t indent) const override
InOutNode(Graph &graph, size_t inputPorts, size_t outputPorts)
void SetFillColor(std::string color) override
size_t NumOutputPorts() const
OutputPort & GetOutputPort(size_t index)
std::vector< Graph * > SubGraphs_
std::vector< std::unique_ptr< InputPort > > InputPorts_
void SetShape(std::string) override
InputPort & GetInputPort(size_t index)
~InOutNode() override=default
size_t NumSubgraphs() const
Graph & GetSubgraph(size_t index)
InputPort & CreateInputPort()
void OutputASCII(std::ostream &out, size_t indent) const override
void SetHtmlTableAttribute(std::string name, std::string value)
OutputPort & CreateOutputPort()
Node & GetNode() override
const char * GetIdPrefix() const override
Graph & GetGraph() override
virtual void OutputDot(std::ostream &out, size_t indent) const
virtual void OutputSubgraphs(std::ostream &out, OutputFormat format, size_t indent) const
void OutputDotPortId(std::ostream &out) const override
void Output(std::ostream &out, OutputFormat format, size_t indent) const
virtual void OutputASCII(std::ostream &out, size_t indent) const
virtual void SetShape(std::string shape)
void SetFillColor(std::string color) override
Node & GetNode() override
void SetFillColor(std::string color) override
~OutputPort() override=default
OutputPort(InOutNode &node)
bool CanBeEdgeHead() const override
void OutputDotPortId(std::ostream &out) const override
const char * GetIdPrefix() const override
const std::vector< Edge * > & GetConnections() const
virtual bool CanBeEdgeTail() const
virtual bool CanBeEdgeHead() const
virtual void SetFillColor(std::string color)=0
std::vector< Edge * > Connections_
bool HasIncomingEdges() const
void OutputIncomingEdgesASCII(std::ostream &out) const
Graph & GetGraph() override
void OnEdgeAdded(Edge &edge)
bool HasOutgoingEdges() const
virtual void OutputDotPortId(std::ostream &out) const =0
virtual Node & GetNode()=0
const Port * OutsideDestination_
void SetOutsideDestination(const Port &outsideSource)
void OutputASCII(std::ostream &out, size_t indent) const override
const char * GetIdPrefix() const override
~ResultNode() override=default
bool CanBeEdgeTail() const override
GraphElement * GetElementFromProgramObject(uintptr_t object) const
size_t GetNextUniqueIdStubSuffix(const char *idStub)
std::unordered_map< std::string, size_t > NextUniqueIdStubSuffix_
Writer(Writer &&other)=delete
size_t NumGraphs() const noexcept
Graph & CreateSubGraph(Node &parentNode)
std::vector< std::unique_ptr< Graph > > Graphs_
void outputAllGraphs(std::ostream &out, OutputFormat format)
Writer & operator=(Writer &&other)=delete
Writer(const Writer &other)=delete
Writer & operator=(const Writer &other)=delete
Graph & GetGraph(size_t index)
std::string Edge(jlm::rvsdg::Output *output, jlm::rvsdg::Input *input, std::unordered_map< rvsdg::Output *, ViewColors > &tailLabel, bool back_edge=false)
static std::string indent(size_t depth)
const char *const Firebrick
const char *const CornflowerBlue
const char *const SkyBlue
static const char *const Dashed
static const char *const Bold
static const char *const Invisible
static const char *const Tapered
static const char *const Solid
static const char *const Dotted
static const char *const Plain
static const char *const Plaintext
static const char *const Point
static const char *const Triangle
static const char *const Rectangle
static const char *const Oval
static const char *const DoubleCircle
static const char *const Circle