3#include <boost/graph/graphviz.hpp>
4#include <nlohmann/json.hpp>
18using json = nlohmann::json;
36 std::unordered_map<graph::Vertex, std::unique_ptr<data_flow::DataFlowNode>, boost::hash<graph::Vertex>> nodes_;
37 std::unordered_map<graph::Edge, std::unique_ptr<data_flow::Memlet>, boost::hash<graph::Edge>> edges_;
42 mutable std::optional<std::list<const DataFlowNode*>> topological_order_;
44 bool is_valid_topological_order(
const std::list<const DataFlowNode*>& order)
const;
46 std::list<const DataFlowNode*> boost_topological_sort()
const;
48 std::list<const DataFlowNode*> semantic_topological_sort()
const;
50 const std::list<const DataFlowNode*>& cached_topological_order()
const;
86 auto [eb, ee] = boost::in_edges(node.
vertex(), this->graph_);
87 auto edges = std::ranges::subrange(eb, ee);
89 auto memlets = std::views::transform(
92 return *(lookup_table.find(edge)->second);
101 auto [eb, ee] = boost::in_edges(node.
vertex(), this->graph_);
102 auto edges = std::ranges::subrange(eb, ee);
106 return *(lookup_table.find(edge)->second);
134 auto [eb, ee] = boost::out_edges(node.
vertex(), this->graph_);
135 auto edges = std::ranges::subrange(eb, ee);
137 auto memlets = std::views::transform(
140 return *(lookup_table.find(edge)->second);
149 auto [eb, ee] = boost::out_edges(node.
vertex(), this->graph_);
150 auto edges = std::ranges::subrange(eb, ee);
154 return *(lookup_table.find(edge)->second);
160 std::vector<const data_flow::Memlet*>
177 std::unordered_set<const data_flow::Tasklet*>
tasklets()
const;
179 std::unordered_set<data_flow::Tasklet*>
tasklets();
185 std::unordered_set<const data_flow::AccessNode*>
data_nodes()
const;
189 std::unordered_set<const data_flow::AccessNode*>
reads()
const;
191 std::unordered_set<const data_flow::AccessNode*>
writes()
const;
193 std::unordered_set<const data_flow::DataFlowNode*>
sources()
const;
195 std::unordered_set<data_flow::DataFlowNode*>
sources();
197 std::unordered_set<const data_flow::DataFlowNode*>
sinks()
const;
199 std::unordered_set<data_flow::DataFlowNode*>
sinks();
214 std::unordered_map<std::string, const data_flow::AccessNode*>
dominators()
const;
216 std::unordered_map<std::string, const data_flow::AccessNode*>
post_dominators()
const;
222 const std::pair<size_t, const std::unordered_map<const data_flow::DataFlowNode*, size_t>>
234 return dynamic_cast<T*
>(lib_node);
Access nodes for reading/writing data in the dataflow graph.
Definition sdfg_builder.h:13
Note: Even though the class references unique_ptr, it will never delete an SDFG it has a reference to...
Definition structured_sdfg_builder.h:44
Node representing access to a data container in the dataflow graph.
Definition access_node.h:84
Base class for computational nodes with inputs and outputs.
Definition code_node.h:88
const AccessNode * find_standalone_exit(const Memlet *output_edge) const
Same as [find_standalone_entry] find an access node that is standalone, so that we can recreate the a...
const data_flow::Memlet * in_edge_for_connector(const data_flow::CodeNode &node, const std::string &conn) const
std::unordered_set< const data_flow::LibraryNode * > library_nodes() const
void validate(const Function &function) const
std::unordered_set< const data_flow::AccessNode * > writes() const
void replace(const symbolic::Expression old_expression, const symbolic::Expression new_expression)
std::unordered_map< std::string, const data_flow::AccessNode * > dominators() const
size_t in_degree(const data_flow::DataFlowNode &node) const
std::unordered_set< const data_flow::DataFlowNode * > successors(const data_flow::DataFlowNode &node) const
const data_flow::Memlet * in_edge_if_single(const data_flow::AccessNode &node) const
Will return the single input edge if it exists.
std::vector< data_flow::Memlet * > in_edges_by_connector(const data_flow::CodeNode &node)
std::unordered_set< data_flow::DataFlowNode * > sources()
auto out_edges(const data_flow::DataFlowNode &node) const
Definition data_flow_graph.h:133
std::unordered_set< const data_flow::DataFlowNode * > predecessors(const data_flow::DataFlowNode &node) const
const AccessNode * find_standalone_entry(const Memlet *input_edge) const
For the given input, identify a standalone input from which one could use to replace the following da...
std::unordered_set< data_flow::LibraryNode * > library_nodes()
std::unordered_set< data_flow::AccessNode * > data_nodes()
std::vector< data_flow::Memlet * > out_edges_by_connector(const data_flow::CodeNode &node)
std::unordered_set< const data_flow::Tasklet * > tasklets() const
std::vector< data_flow::Memlet * > out_edges_for_connector(const data_flow::CodeNode &node, const std::string &conn)
std::unordered_set< data_flow::DataFlowNode * > sinks()
auto out_edges(const data_flow::DataFlowNode &node)
Definition data_flow_graph.h:148
std::vector< const data_flow::Memlet * > out_edges_for_connector(const data_flow::CodeNode &node, const std::string &conn) const
auto all_simple_paths(const data_flow::DataFlowNode &src, const data_flow::DataFlowNode &dst) const
T * is_a_library_node()
Definition data_flow_graph.h:226
std::unordered_map< std::string, data_flow::AccessNode * > post_dominators()
auto edges() const
Definition data_flow_graph.h:76
std::vector< const data_flow::Memlet * > in_edges_by_connector(const data_flow::CodeNode &node) const
auto in_edges(const data_flow::DataFlowNode &node) const
Definition data_flow_graph.h:85
const std::list< const data_flow::DataFlowNode * > & topological_order() const
data_flow::Memlet * in_edge_for_connector(const data_flow::CodeNode &node, const std::string &conn)
std::list< data_flow::DataFlowNode * > topological_sort()
std::unordered_set< const data_flow::DataFlowNode * > sinks() const
void invalidate_topological_order()
Must be called after any change that can affect topological_sort() (nodes, edges, access-node names).
const Element * get_parent() const
std::vector< const data_flow::Memlet * > out_edges_by_connector(const data_flow::CodeNode &node) const
std::list< const data_flow::DataFlowNode * > topological_sort() const
std::unordered_set< const data_flow::AccessNode * > data_nodes() const
std::unordered_set< const data_flow::AccessNode * > reads() const
std::unordered_map< std::string, const data_flow::AccessNode * > post_dominators() const
const std::pair< size_t, const std::unordered_map< const data_flow::DataFlowNode *, size_t > > weakly_connected_components() const
DataFlowGraph(Element *parent)
data_flow::Memlet * in_edge_if_single(const data_flow::AccessNode &node)
DataFlowGraph & operator=(const DataFlowGraph &)=delete
auto nodes() const
Definition data_flow_graph.h:67
std::unordered_set< data_flow::Tasklet * > tasklets()
void replace(const symbolic::ExpressionMapping &replacements)
DataFlowGraph(const DataFlowGraph &graph)=delete
auto nodes()
Definition data_flow_graph.h:72
auto in_edges(const data_flow::DataFlowNode &node)
Definition data_flow_graph.h:100
std::unordered_set< const data_flow::DataFlowNode * > sources() const
const data_flow::Memlet * in_edge(const data_flow::AccessNode &node) const
size_t out_degree(const data_flow::DataFlowNode &node) const
auto edges()
Definition data_flow_graph.h:81
Abstract base class for all dataflow graph nodes.
Definition data_flow_node.h:106
graph::Vertex vertex() const
Get the graph vertex for this node.
Base class for all library nodes in the dataflow graph.
Definition library_node.h:106
Edge in the dataflow graph representing data movement.
Definition memlet.h:131
Base class for all nodes in the dataflow graph.
SymEngine::RCP< const SymEngine::Basic > Expression
Reference-counted pointer to a symbolic expression (SymEngine Basic).
Definition symbolic.h:83
SymEngine::map_basic_basic ExpressionMapping
Definition symbolic.h:109
nlohmann::json json
Definition interstate_edge.h:14
Library node definitions for calling functions beyond simple instructions.
Edges in the dataflow graph representing data movement.
Definition function_builder.h:10
Definition access_node.h:67
boost::graph_traits< Graph >::edge_descriptor Edge
Definition graph.h:26
boost::adjacency_list< boost::listS, boost::listS, boost::bidirectionalS > Graph
Definition graph.h:24
const T & add_const(T &s)
Definition helpers.h:44
T & indirect(const std::unique_ptr< T > &ptr)
Definition helpers.h:39
Symbolic system for integer-based symbol analysis.
Simple computational operations in the dataflow graph.