P4C
The P4 Compiler
Loading...
Searching...
No Matches
flattenUnions.h
1/*
2 * Copyright 2022 Intel Corp.
3 * SPDX-FileCopyrightText: 2022 Intel Corp.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_FLATTENUNIONS_H_
9#define MIDEND_FLATTENUNIONS_H_
10
11#include "./frontends/p4/parserControlFlow.h"
12#include "./frontends/p4/simplifyDefUse.h"
13#include "./frontends/p4/unusedDeclarations.h"
14#include "frontends/p4/typeChecking/typeChecker.h"
15#include "ir/ir.h"
16namespace P4 {
17
39class DoFlattenHeaderUnion : public Transform {
40 protected:
41 P4::ReferenceMap *refMap;
42 P4::TypeMap *typeMap;
43 // A field name is only unique within its declaring struct.
44 std::map<std::pair<cstring, cstring>, std::map<cstring, cstring>> structReplacementMap;
45 std::map<cstring, std::map<cstring, cstring>> replacementMap;
46 // Replacement map needed to add element-wise header declaration in right context
47 std::map<IR::Declaration_Variable *, IR::IndexedVector<IR::Declaration>> replaceDVMap;
48
49 public:
50 DoFlattenHeaderUnion(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
51 : refMap(refMap), typeMap(typeMap) {}
52 const IR::Node *postorder(IR::Type_Struct *sf) override;
53 const IR::Node *postorder(IR::Declaration_Variable *dv) override;
54 const IR::Node *postorder(IR::Member *m) override;
55 const IR::Node *postorder(IR::P4Parser *parser) override;
56 const IR::Node *postorder(IR::P4Control *control) override;
57 const IR::Node *postorder(IR::P4Action *action) override;
58 bool hasHeaderUnionField(IR::Type_Struct *s);
59};
60
87class DoFlattenHeaderUnionStack : public DoFlattenHeaderUnion {
88 std::map<std::pair<cstring, cstring>, std::vector<cstring>> stackFieldMap;
89 std::map<cstring, std::vector<cstring>> stackMap;
90
91 public:
92 DoFlattenHeaderUnionStack(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
93 : DoFlattenHeaderUnion(refMap, typeMap) {
94 setName("DoFlattenHeaderUnionStack");
95 }
96 const IR::Node *postorder(IR::Type_Struct *sf) override;
97 const IR::Node *postorder(IR::ArrayIndex *e) override;
98 const IR::Node *postorder(IR::Declaration_Variable *dv) override;
99 bool hasHeaderUnionStackField(IR::Type_Struct *s);
100};
101
134class HandleValidityHeaderUnion : public Transform {
135 P4::ReferenceMap *refMap;
136 P4::TypeMap *typeMap;
137 IR::IndexedVector<IR::Declaration> toInsert; // temporaries
138
139 public:
140 HandleValidityHeaderUnion(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
141 : refMap(refMap), typeMap(typeMap) {
142 setName("HandleValidityHeaderUnion");
143 }
144 const IR::Node *postorder(IR::AssignmentStatement *assn) override;
145 const IR::Node *postorder(IR::IfStatement *a) override;
146 const IR::Node *postorder(IR::SwitchStatement *a) override;
147 const IR::Node *postorder(IR::MethodCallStatement *mcs) override;
148 const IR::Node *postorder(IR::P4Parser *parser) override;
149 const IR::Node *postorder(IR::P4Control *control) override;
150 const IR::Node *postorder(IR::P4Action *action) override;
151 const IR::MethodCallStatement *processValidityForStr(const IR::Statement *s,
152 const IR::Member *m, cstring headerElement,
153 cstring setValid);
154 const IR::Node *setInvalidforRest(const IR::Statement *s, const IR::Member *m,
155 const IR::Type_HeaderUnion *hu, cstring exclude,
156 bool setValidforCurrMem);
157 const IR::Node *expandIsValid(const IR::Statement *a, const IR::MethodCallExpression *mce,
159};
160
166class DoExpandHeaderUnionStackPushPop : public Transform {
167 P4::TypeMap *typeMap;
168
169 public:
170 explicit DoExpandHeaderUnionStackPushPop(P4::TypeMap *typeMap) : typeMap(typeMap) {
171 setName("DoExpandHeaderUnionStackPushPop");
172 }
173 const IR::Node *postorder(IR::MethodCallStatement *mcs) override;
174};
175
176class RemoveUnusedHUDeclarations : public Transform {
177 const UsedDeclSet &used;
178
179 public:
180 explicit RemoveUnusedHUDeclarations(const UsedDeclSet &used) : used(used) {}
181
182 const IR::Node *preorder(IR::Type_HeaderUnion *type) override {
183 if (!used.isUsed(getOriginal<IR::IDeclaration>())) return nullptr;
184 return type;
185 }
186};
187
188class RemoveAllUnusedHUDDeclarations : public PassManager {
189 UsedDeclSet used;
190
191 public:
192 RemoveAllUnusedHUDDeclarations()
193 : PassManager({
194 new CollectUsedDeclarations(used),
196 }) {
197 setName("RemoveAllUnusedHUDDeclarations");
198 setStopOnError(true);
199 }
200};
201
208class FlattenHeaderUnion : public PassManager {
209 public:
210 FlattenHeaderUnion(P4::ReferenceMap *refMap, P4::TypeMap *typeMap, bool loopsUnroll = true) {
211 passes.push_back(new P4::TypeChecking(refMap, typeMap));
212 // Lower push_front/pop_front on header union stacks first; the new nodes need
213 // types before HandleValidityHeaderUnion.
214 if (loopsUnroll) {
215 passes.push_back(new DoExpandHeaderUnionStackPushPop(typeMap));
216 passes.push_back(new P4::ClearTypeMap(typeMap));
217 passes.push_back(new P4::TypeInference(typeMap, false));
218 passes.push_back(new P4::TypeChecking(refMap, typeMap));
219 }
220 passes.push_back(new HandleValidityHeaderUnion(refMap, typeMap));
221 // Stack flattening is only applicable if parser loops are unrolled and
222 // header union stack elements are accessed using [] notation. This pass does not handle
223 // .next .last etc accessors for stack elements.
224 if (loopsUnroll) {
225 passes.push_back(new DoFlattenHeaderUnionStack(refMap, typeMap));
227 }
228 passes.push_back(new P4::ClearTypeMap(typeMap));
229 passes.push_back(new P4::TypeInference(typeMap, false));
230 passes.push_back(new P4::TypeChecking(refMap, typeMap));
231 passes.push_back(new DoFlattenHeaderUnion(refMap, typeMap));
233 passes.push_back(new P4::RemoveAllUnusedHUDDeclarations());
234 passes.push_back(new P4::ClearTypeMap(typeMap));
235 passes.push_back(new P4::TypeChecking(nullptr, typeMap));
236 passes.push_back(new P4::RemoveParserIfs(typeMap));
237 }
238};
239} // namespace P4
240
241#endif /* MIDEND_FLATTENUNIONS_H_ */
Definition typeChecker.h:23
Collects all used declarations into @used set.
Definition unusedDeclarations.h:50
Definition flattenUnions.h:166
Definition flattenUnions.h:39
Definition flattenUnions.h:87
Definition flattenUnions.h:134
Definition indexed_vector.h:31
Definition node.h:44
Class used to encode maps from paths to declarations.
Definition referenceMap.h:58
Iterates UnusedDeclarations until convergence.
Definition unusedDeclarations.h:187
Definition flattenUnions.h:188
Definition parserControlFlow.h:105
Definition flattenUnions.h:176
Definition unusedDeclarations.h:39
Definition visitor.h:433
Definition typeChecker.h:46
Definition typeChecker.h:496
Definition typeMap.h:32
Definition unusedDeclarations.h:20
Definition cstring.h:76
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13