P4C
The P4 Compiler
Loading...
Searching...
No Matches
actionSynthesis.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_ACTIONSYNTHESIS_H_
9#define MIDEND_ACTIONSYNTHESIS_H_
10
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/p4/typeChecking/typeChecker.h"
13#include "ir/ir.h"
14
15namespace P4 {
16
22 public:
23 virtual ~ActionSynthesisPolicy() {}
28 virtual bool convert(const Visitor::Context *ctxt, const IR::P4Control *control) = 0;
29
40 virtual bool can_combine(const Visitor::Context *, const IR::BlockStatement *,
41 const IR::StatOrDecl *) {
42 return true;
43 }
44};
45
67class DoMoveActionsToTables : public Transform {
68 ReferenceMap *refMap;
69 TypeMap *typeMap;
70 std::vector<const IR::P4Table *> tables; // inserted tables
71
72 public:
73 DoMoveActionsToTables(ReferenceMap *refMap, TypeMap *typeMap)
74 : refMap(refMap), typeMap(typeMap) {
75 CHECK_NULL(refMap);
76 CHECK_NULL(typeMap);
77 setName("DoMoveActionsToTables");
78 }
79 const IR::Node *preorder(IR::P4Parser *parser) override {
80 prune();
81 return parser;
82 }
83 const IR::Node *postorder(IR::P4Control *control) override;
84 const IR::Node *preorder(IR::P4Control *control) override {
85 tables.clear();
86 return control;
87 }
88 const IR::Node *preorder(IR::P4Action *action) override {
89 prune();
90 return action;
91 }
92 const IR::Node *postorder(IR::MethodCallStatement *statement) override;
93};
94
112class DoSynthesizeActions : public Transform {
113 ReferenceMap *refMap;
114 TypeMap *typeMap;
115 std::vector<const IR::P4Action *> actions; // inserted actions
116 bool changes = false;
117 ActionSynthesisPolicy *policy;
118
119 public:
120 // If true the statement must be moved to an action
121 bool mustMove(const IR::MethodCallStatement *statement);
122 bool mustMove(const IR::BaseAssignmentStatement *statement);
123
124 DoSynthesizeActions(ReferenceMap *refMap, TypeMap *typeMap, ActionSynthesisPolicy *policy)
125 : refMap(refMap), typeMap(typeMap), policy(policy) {
126 CHECK_NULL(refMap);
127 CHECK_NULL(typeMap);
128 setName("DoSynthesizeActions");
129 }
130 const IR::Node *preorder(IR::P4Parser *parser) override {
131 prune();
132 return parser;
133 }
134 const IR::Node *postorder(IR::P4Control *control) override;
135 const IR::Node *preorder(IR::P4Control *control) override;
136 const IR::Node *preorder(IR::P4Action *action) override {
137 prune();
138 return action;
139 } // skip actions
140 // We do not handle return: this pass should be called after it has been removed
141 const IR::Node *preorder(IR::BlockStatement *statement) override;
142 const IR::Node *preorder(IR::BaseAssignmentStatement *statement) override;
143 const IR::Node *preorder(IR::MethodCallStatement *statement) override;
144 const IR::Node *preorder(IR::ExitStatement *statement) override;
145 const IR::Node *preorder(IR::Function *function) override {
146 prune();
147 return function;
148 }
149
150 protected:
151 const IR::Statement *createAction(const IR::Statement *body);
152};
153
154class SynthesizeActions : public PassManager {
155 public:
156 SynthesizeActions(ReferenceMap *refMap, TypeMap *typeMap,
157 ActionSynthesisPolicy *policy = nullptr,
158 TypeChecking *typeChecking = nullptr) {
159 if (!typeChecking) typeChecking = new TypeChecking(refMap, typeMap);
160 passes.push_back(typeChecking);
161 passes.push_back(new DoSynthesizeActions(refMap, typeMap, policy));
162 setName("SynthesizeActions");
163 }
164};
165
166class MoveActionsToTables : public PassManager {
167 public:
168 MoveActionsToTables(ReferenceMap *refMap, TypeMap *typeMap,
169 TypeChecking *typeChecking = nullptr) {
170 if (!typeChecking) typeChecking = new TypeChecking(refMap, typeMap);
171 passes.push_back(typeChecking);
172 passes.push_back(new DoMoveActionsToTables(refMap, typeMap));
173 setName("MoveActionsToTables");
174 }
175};
176
177} // namespace P4
178
179#endif /* MIDEND_ACTIONSYNTHESIS_H_ */
Definition actionSynthesis.h:21
virtual bool can_combine(const Visitor::Context *, const IR::BlockStatement *, const IR::StatOrDecl *)
Definition actionSynthesis.h:40
virtual bool convert(const Visitor::Context *ctxt, const IR::P4Control *control)=0
Definition actionSynthesis.h:67
Definition actionSynthesis.h:112
Definition node.h:44
Class used to encode maps from paths to declarations.
Definition referenceMap.h:58
Definition visitor.h:433
Definition typeChecker.h:46
Definition typeMap.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13