docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
sdfg::data_flow::DataFlowGraph Class Reference

#include <sdfg/data_flow/data_flow_graph.h>

Public Member Functions

 DataFlowGraph ()=default
 DataFlowGraph (Element *parent)
 ~DataFlowGraph ()=default
 DataFlowGraph (const DataFlowGraph &graph)=delete
DataFlowGraph & operator= (const DataFlowGraph &)=delete
void validate (const Function &function) const
const Element * get_parent () const
Element * get_parent ()
auto nodes () const
auto nodes ()
auto edges () const
auto edges ()
auto in_edges (const data_flow::DataFlowNode &node) const
auto in_edges (const data_flow::DataFlowNode &node)
const data_flow::Memlet * in_edge_for_connector (const data_flow::CodeNode &node, const std::string &conn) const
data_flow::Memlet * in_edge_for_connector (const data_flow::CodeNode &node, const std::string &conn)
const data_flow::Memlet * in_edge (const data_flow::AccessNode &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.
data_flow::Memlet * in_edge_if_single (const data_flow::AccessNode &node)
std::vector< data_flow::Memlet * > in_edges_by_connector (const data_flow::CodeNode &node)
std::vector< const data_flow::Memlet * > in_edges_by_connector (const data_flow::CodeNode &node) const
auto out_edges (const data_flow::DataFlowNode &node) const
auto out_edges (const data_flow::DataFlowNode &node)
std::vector< const data_flow::Memlet * > out_edges_for_connector (const data_flow::CodeNode &node, const std::string &conn) const
std::vector< data_flow::Memlet * > out_edges_for_connector (const data_flow::CodeNode &node, const std::string &conn)
std::vector< data_flow::Memlet * > out_edges_by_connector (const data_flow::CodeNode &node)
std::vector< const data_flow::Memlet * > out_edges_by_connector (const data_flow::CodeNode &node) const
size_t in_degree (const data_flow::DataFlowNode &node) const
size_t out_degree (const data_flow::DataFlowNode &node) const
void replace (const symbolic::Expression old_expression, const symbolic::Expression new_expression)
void replace (const symbolic::ExpressionMapping &replacements)
std::unordered_set< const data_flow::Tasklet * > tasklets () const
std::unordered_set< data_flow::Tasklet * > tasklets ()
std::unordered_set< const data_flow::LibraryNode * > library_nodes () const
std::unordered_set< data_flow::LibraryNode * > library_nodes ()
std::unordered_set< const data_flow::AccessNode * > data_nodes () const
std::unordered_set< data_flow::AccessNode * > data_nodes ()
std::unordered_set< const data_flow::AccessNode * > reads () const
std::unordered_set< const data_flow::AccessNode * > writes () const
std::unordered_set< const data_flow::DataFlowNode * > sources () const
std::unordered_set< data_flow::DataFlowNode * > sources ()
std::unordered_set< const data_flow::DataFlowNode * > sinks () const
std::unordered_set< data_flow::DataFlowNode * > sinks ()
std::unordered_set< const data_flow::DataFlowNode * > predecessors (const data_flow::DataFlowNode &node) const
std::unordered_set< const data_flow::DataFlowNode * > successors (const data_flow::DataFlowNode &node) const
std::list< const data_flow::DataFlowNode * > topological_sort () const
std::list< data_flow::DataFlowNode * > topological_sort ()
const std::list< const data_flow::DataFlowNode * > & topological_order () const
void invalidate_topological_order ()
 Must be called after any change that can affect topological_sort() (nodes, edges, access-node names).
std::unordered_map< std::string, const data_flow::AccessNode * > dominators () const
std::unordered_map< std::string, const data_flow::AccessNode * > post_dominators () const
std::unordered_map< std::string, data_flow::AccessNode * > post_dominators ()
auto all_simple_paths (const data_flow::DataFlowNode &src, const data_flow::DataFlowNode &dst) const
const std::pair< size_t, const std::unordered_map< const data_flow::DataFlowNode *, size_t > > weakly_connected_components () const
template<typename T>
T * is_a_library_node ()
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 dataflow For a Block that contains a libNode with 2 inputs, 1 output, the access nodes of the inputs would be those standalone entry points.
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 access node in a different place without impacting correctness, as long as we repreduce the same accesses via it.

Friends

class sdfg::builder::SDFGBuilder
class sdfg::builder::StructuredSDFGBuilder

Constructor & Destructor Documentation

◆ DataFlowGraph() [1/3]

sdfg::data_flow::DataFlowGraph::DataFlowGraph ( )
default

◆ DataFlowGraph() [2/3]

sdfg::data_flow::DataFlowGraph::DataFlowGraph ( Element * parent)

◆ ~DataFlowGraph()

sdfg::data_flow::DataFlowGraph::~DataFlowGraph ( )
default

◆ DataFlowGraph() [3/3]

sdfg::data_flow::DataFlowGraph::DataFlowGraph ( const DataFlowGraph & graph)
delete

Member Function Documentation

◆ all_simple_paths()

auto sdfg::data_flow::DataFlowGraph::all_simple_paths ( const data_flow::DataFlowNode & src,
const data_flow::DataFlowNode & dst ) const

◆ data_nodes() [1/2]

std::unordered_set< data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::data_nodes ( )

◆ data_nodes() [2/2]

std::unordered_set< const data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::data_nodes ( ) const

◆ dominators()

std::unordered_map< std::string, const data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::dominators ( ) const

◆ edges() [1/2]

auto sdfg::data_flow::DataFlowGraph::edges ( )
inline

◆ edges() [2/2]

auto sdfg::data_flow::DataFlowGraph::edges ( ) const
inline

◆ find_standalone_entry()

const AccessNode * sdfg::data_flow::DataFlowGraph::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 dataflow For a Block that contains a libNode with 2 inputs, 1 output, the access nodes of the inputs would be those standalone entry points.

For expanding of the libNode one can reuse those accessNodes, if they are the entrypoints into the dataflow

This is to abstract away the expectation that all edges are memlets that always must either start or end in an AccessNode in preparation of supporting pure data-edges between tasklets etc.

Parameters
input_edgethe input edge for which we want to find a standalone cut point.
Returns
nullptr, if no viable standalone input could be found

◆ find_standalone_exit()

const AccessNode * sdfg::data_flow::DataFlowGraph::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 access node in a different place without impacting correctness, as long as we repreduce the same accesses via it.

Parameters
output_edgethe output edge for which we want to find a standalone cut point
Returns
nullptr, if no viable standalone output could be found

◆ get_parent() [1/2]

Element * sdfg::data_flow::DataFlowGraph::get_parent ( )

◆ get_parent() [2/2]

const Element * sdfg::data_flow::DataFlowGraph::get_parent ( ) const

◆ in_degree()

size_t sdfg::data_flow::DataFlowGraph::in_degree ( const data_flow::DataFlowNode & node) const

◆ in_edge()

const data_flow::Memlet * sdfg::data_flow::DataFlowGraph::in_edge ( const data_flow::AccessNode & node) const
Deprecated
AccessNodes can have multiple input edges, because the node is not an operation, it is almost irrelevant to the operation represented by the edges Will throw if there are more than 1 edge on the AccessNode

◆ in_edge_for_connector() [1/2]

data_flow::Memlet * sdfg::data_flow::DataFlowGraph::in_edge_for_connector ( const data_flow::CodeNode & node,
const std::string & conn )

◆ in_edge_for_connector() [2/2]

const data_flow::Memlet * sdfg::data_flow::DataFlowGraph::in_edge_for_connector ( const data_flow::CodeNode & node,
const std::string & conn ) const

◆ in_edge_if_single() [1/2]

data_flow::Memlet * sdfg::data_flow::DataFlowGraph::in_edge_if_single ( const data_flow::AccessNode & node)

◆ in_edge_if_single() [2/2]

const data_flow::Memlet * sdfg::data_flow::DataFlowGraph::in_edge_if_single ( const data_flow::AccessNode & node) const

Will return the single input edge if it exists.

Will return null if zero or more than 2 input edges exist on this access node. Suitable for situations where more than 1 edge are not supported anyway.

◆ in_edges() [1/2]

auto sdfg::data_flow::DataFlowGraph::in_edges ( const data_flow::DataFlowNode & node)
inline

◆ in_edges() [2/2]

auto sdfg::data_flow::DataFlowGraph::in_edges ( const data_flow::DataFlowNode & node) const
inline

◆ in_edges_by_connector() [1/2]

std::vector< data_flow::Memlet * > sdfg::data_flow::DataFlowGraph::in_edges_by_connector ( const data_flow::CodeNode & node)

◆ in_edges_by_connector() [2/2]

std::vector< const data_flow::Memlet * > sdfg::data_flow::DataFlowGraph::in_edges_by_connector ( const data_flow::CodeNode & node) const

◆ invalidate_topological_order()

void sdfg::data_flow::DataFlowGraph::invalidate_topological_order ( )

Must be called after any change that can affect topological_sort() (nodes, edges, access-node names).

◆ is_a_library_node()

template<typename T>
T * sdfg::data_flow::DataFlowGraph::is_a_library_node ( )
inline

◆ library_nodes() [1/2]

std::unordered_set< data_flow::LibraryNode * > sdfg::data_flow::DataFlowGraph::library_nodes ( )

◆ library_nodes() [2/2]

std::unordered_set< const data_flow::LibraryNode * > sdfg::data_flow::DataFlowGraph::library_nodes ( ) const

◆ nodes() [1/2]

auto sdfg::data_flow::DataFlowGraph::nodes ( )
inline

◆ nodes() [2/2]

auto sdfg::data_flow::DataFlowGraph::nodes ( ) const
inline

◆ operator=()

DataFlowGraph & sdfg::data_flow::DataFlowGraph::operator= ( const DataFlowGraph & )
delete

◆ out_degree()

size_t sdfg::data_flow::DataFlowGraph::out_degree ( const data_flow::DataFlowNode & node) const

◆ out_edges() [1/2]

auto sdfg::data_flow::DataFlowGraph::out_edges ( const data_flow::DataFlowNode & node)
inline

◆ out_edges() [2/2]

auto sdfg::data_flow::DataFlowGraph::out_edges ( const data_flow::DataFlowNode & node) const
inline

◆ out_edges_by_connector() [1/2]

std::vector< data_flow::Memlet * > sdfg::data_flow::DataFlowGraph::out_edges_by_connector ( const data_flow::CodeNode & node)

◆ out_edges_by_connector() [2/2]

std::vector< const data_flow::Memlet * > sdfg::data_flow::DataFlowGraph::out_edges_by_connector ( const data_flow::CodeNode & node) const

◆ out_edges_for_connector() [1/2]

std::vector< data_flow::Memlet * > sdfg::data_flow::DataFlowGraph::out_edges_for_connector ( const data_flow::CodeNode & node,
const std::string & conn )

◆ out_edges_for_connector() [2/2]

std::vector< const data_flow::Memlet * > sdfg::data_flow::DataFlowGraph::out_edges_for_connector ( const data_flow::CodeNode & node,
const std::string & conn ) const

◆ post_dominators() [1/2]

std::unordered_map< std::string, data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::post_dominators ( )

◆ post_dominators() [2/2]

std::unordered_map< std::string, const data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::post_dominators ( ) const

◆ predecessors()

std::unordered_set< const data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::predecessors ( const data_flow::DataFlowNode & node) const

◆ reads()

std::unordered_set< const data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::reads ( ) const

◆ replace() [1/2]

void sdfg::data_flow::DataFlowGraph::replace ( const symbolic::Expression old_expression,
const symbolic::Expression new_expression )

◆ replace() [2/2]

void sdfg::data_flow::DataFlowGraph::replace ( const symbolic::ExpressionMapping & replacements)

◆ sinks() [1/2]

std::unordered_set< data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::sinks ( )

◆ sinks() [2/2]

std::unordered_set< const data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::sinks ( ) const

◆ sources() [1/2]

std::unordered_set< data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::sources ( )

◆ sources() [2/2]

std::unordered_set< const data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::sources ( ) const

◆ successors()

std::unordered_set< const data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::successors ( const data_flow::DataFlowNode & node) const

◆ tasklets() [1/2]

std::unordered_set< data_flow::Tasklet * > sdfg::data_flow::DataFlowGraph::tasklets ( )

◆ tasklets() [2/2]

std::unordered_set< const data_flow::Tasklet * > sdfg::data_flow::DataFlowGraph::tasklets ( ) const

◆ topological_order()

const std::list< const data_flow::DataFlowNode * > & sdfg::data_flow::DataFlowGraph::topological_order ( ) const

◆ topological_sort() [1/2]

std::list< data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::topological_sort ( )

◆ topological_sort() [2/2]

std::list< const data_flow::DataFlowNode * > sdfg::data_flow::DataFlowGraph::topological_sort ( ) const

◆ validate()

void sdfg::data_flow::DataFlowGraph::validate ( const Function & function) const

◆ weakly_connected_components()

const std::pair< size_t, const std::unordered_map< const data_flow::DataFlowNode *, size_t > > sdfg::data_flow::DataFlowGraph::weakly_connected_components ( ) const

◆ writes()

std::unordered_set< const data_flow::AccessNode * > sdfg::data_flow::DataFlowGraph::writes ( ) const

◆ sdfg::builder::SDFGBuilder

friend class sdfg::builder::SDFGBuilder
friend

◆ sdfg::builder::StructuredSDFGBuilder


The documentation for this class was generated from the following file: