docc 0.8.3 (0d44999b)
C++ API Reference
Loading...
Searching...
No Matches
language_extension.h
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4
9#include "sdfg/function.h"
11#include "sdfg/types/array.h"
12#include "sdfg/types/pointer.h"
13#include "sdfg/types/scalar.h"
15#include "sdfg/types/type.h"
16
17namespace sdfg {
19class StructuredLoop;
20}
21
22namespace codegen {
23
25struct LoopHints {
26 bool unroll = false;
27 bool no_vectorize = false;
28};
29
31struct Body {
33 enum class Kind { Block, Scope };
34
37};
38
40protected:
42 std::string external_prefix_;
43
44public:
45 LanguageExtension(sdfg::Function& function, const std::string& external_prefix)
47 }
48
49 virtual ~LanguageExtension() = default;
50
51 const std::string& external_prefix() const {
52 return this->external_prefix_;
53 }
54
55 virtual const std::string language() const = 0;
56
57 virtual std::string primitive_type(const types::PrimitiveType prim_type) = 0;
58
59 virtual std::string declaration(
60 const std::string& name, const types::IType& type, bool use_initializer = false, bool use_alignment = false
61 ) = 0;
62
63 virtual std::string type_cast(const std::string& name, const types::IType& type) = 0;
64
65 virtual std::string subset(const types::IType& type, const data_flow::Subset& subset) = 0;
66
67 virtual std::string expression(const symbolic::Expression expr) = 0;
68
69 virtual std::string access_node(const data_flow::AccessNode& node) = 0;
70
71 virtual std::string tasklet(const data_flow::Tasklet& tasklet) = 0;
72
73 virtual std::string zero(const types::PrimitiveType prim_type) = 0;
74
75 /* Statements; each returns one complete statement without a trailing newline. */
76
77 virtual std::string comment(const std::string& text) = 0;
78
79 virtual std::string assignment(const std::string& lhs, const std::string& rhs) = 0;
80
82 virtual std::string
83 local_declaration(const std::string& name, const types::IType& type, const std::string& init = "") = 0;
84
85 virtual std::string copy_bytes(const std::string& dst, const std::string& src, const std::string& size) = 0;
86
87 virtual std::string break_statement() = 0;
88
89 virtual std::string continue_statement() = 0;
90
91 virtual std::string return_statement(const std::string& value) = 0;
92
94 virtual void deallocation(PrettyPrinter& stream, const std::string& container, const types::IType& type) = 0;
95
96 /* Expressions */
97
98 virtual std::string null_literal() = 0;
99
100 virtual std::string address_of(const std::string& expr) = 0;
101
102 virtual std::string dereference(const std::string& expr) = 0;
103
104 virtual std::string size_of(const std::string& expr) = 0;
105
106 virtual std::string reinterpret_cast_expr(const std::string& expr, const std::string& type) = 0;
107
108 /* Structured control flow: every begin_* opens a Body that must be closed by end(). */
109
110 virtual Body
112
114 virtual Body begin_while(PrettyPrinter& stream) = 0;
115
117 virtual Body begin_branch(PrettyPrinter& stream, size_t index, size_t count, const symbolic::Condition& condition) = 0;
118
119 virtual Body begin_scope(PrettyPrinter& stream) = 0;
120
121 virtual void end(PrettyPrinter& stream, const Body& body) = 0;
122};
123
124} // namespace codegen
125} // namespace sdfg
Array type representation for c-style arrays.
Definition function.h:43
virtual std::string copy_bytes(const std::string &dst, const std::string &src, const std::string &size)=0
virtual ~LanguageExtension()=default
sdfg::Function & function_
Definition language_extension.h:41
virtual std::string local_declaration(const std::string &name, const types::IType &type, const std::string &init="")=0
Declares a local, initialized if init is non-empty. Empty if the language needs no declaration.
virtual std::string type_cast(const std::string &name, const types::IType &type)=0
std::string external_prefix_
Definition language_extension.h:42
virtual std::string break_statement()=0
virtual std::string address_of(const std::string &expr)=0
virtual std::string continue_statement()=0
virtual std::string declaration(const std::string &name, const types::IType &type, bool use_initializer=false, bool use_alignment=false)=0
virtual std::string expression(const symbolic::Expression expr)=0
LanguageExtension(sdfg::Function &function, const std::string &external_prefix)
Definition language_extension.h:45
virtual std::string tasklet(const data_flow::Tasklet &tasklet)=0
virtual const std::string language() const =0
virtual std::string size_of(const std::string &expr)=0
virtual std::string dereference(const std::string &expr)=0
virtual std::string assignment(const std::string &lhs, const std::string &rhs)=0
virtual Body begin_while(PrettyPrinter &stream)=0
An unconditional loop, left only through break or return.
virtual Body begin_branch(PrettyPrinter &stream, size_t index, size_t count, const symbolic::Condition &condition)=0
Branch index of count branches of a conditional, guarded by condition.
virtual std::string subset(const types::IType &type, const data_flow::Subset &subset)=0
virtual std::string primitive_type(const types::PrimitiveType prim_type)=0
virtual std::string null_literal()=0
virtual Body begin_for(PrettyPrinter &stream, const structured_control_flow::StructuredLoop &loop, const LoopHints &hints)=0
virtual void deallocation(PrettyPrinter &stream, const std::string &container, const types::IType &type)=0
Emits the release of a container the function owns, if its storage requires one.
virtual std::string zero(const types::PrimitiveType prim_type)=0
virtual Body begin_scope(PrettyPrinter &stream)=0
virtual std::string access_node(const data_flow::AccessNode &node)=0
virtual std::string comment(const std::string &text)=0
const std::string & external_prefix() const
Definition language_extension.h:51
virtual std::string reinterpret_cast_expr(const std::string &expr, const std::string &type)=0
virtual std::string return_statement(const std::string &value)=0
virtual void end(PrettyPrinter &stream, const Body &body)=0
Definition utils.h:16
Node representing access to a data container in the dataflow graph.
Definition access_node.h:84
Simple computational operation in the dataflow graph.
Definition tasklet.h:348
Base class for structured loop constructs.
Definition structured_loop.h:244
Abstract base interface for all types in the sdfglib type system.
Definition type.h:625
SymEngine::RCP< const SymEngine::Basic > Expression
Reference-counted pointer to a symbolic expression (SymEngine Basic).
Definition symbolic.h:83
SymEngine::RCP< const SymEngine::Boolean > Condition
Reference-counted pointer to a boolean condition expression.
Definition symbolic.h:86
Library node definitions for calling functions beyond simple instructions.
Edges in the dataflow graph representing data movement.
Definition argument_registry.h:10
symbolic::MultiExpression Subset
Type alias for a subset specification (array of symbolic expressions).
Definition memlet.h:103
Definition language_extension.h:18
PrimitiveType
Enumeration of all primitive data types supported by sdfglib.
Definition type.h:35
Definition analysis.h:7
Pointer type representation.
Scalar (primitive) type representation.
An open region of emitted code, closed by LanguageExtension::end.
Definition language_extension.h:31
Kind kind
Definition language_extension.h:35
size_t content_mark
Definition language_extension.h:36
Kind
Block: the body of a control-flow construct. Scope: a lexical scope that only isolates local names.
Definition language_extension.h:33
@ Scope
Definition language_extension.h:33
@ Block
Definition language_extension.h:33
Loop properties a language may be able to express (e.g. clang loop pragmas in C).
Definition language_extension.h:25
bool no_vectorize
Definition language_extension.h:27
bool unroll
Definition language_extension.h:26
Structure and record type representations.
Symbolic system for integer-based symbol analysis.
Simple computational operations in the dataflow graph.
Core type system definitions for sdfglib.