8#ifndef MIDEND_FLATTENUNIONS_H_
9#define MIDEND_FLATTENUNIONS_H_
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"
44 std::map<std::pair<cstring, cstring>, std::map<cstring, cstring>> structReplacementMap;
45 std::map<cstring, std::map<cstring, cstring>> replacementMap;
47 std::map<IR::Declaration_Variable *, IR::IndexedVector<IR::Declaration>> replaceDVMap;
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);
87class DoFlattenHeaderUnionStack :
public DoFlattenHeaderUnion {
88 std::map<std::pair<cstring, cstring>, std::vector<cstring>> stackFieldMap;
89 std::map<cstring, std::vector<cstring>> stackMap;
93 : DoFlattenHeaderUnion(refMap, typeMap) {
94 setName(
"DoFlattenHeaderUnionStack");
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);
141 : refMap(refMap), typeMap(typeMap) {
142 setName(
"HandleValidityHeaderUnion");
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,
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,
166class DoExpandHeaderUnionStackPushPop :
public Transform {
170 explicit DoExpandHeaderUnionStackPushPop(
P4::TypeMap *typeMap) : typeMap(typeMap) {
171 setName(
"DoExpandHeaderUnionStackPushPop");
173 const IR::Node *postorder(IR::MethodCallStatement *mcs)
override;
180 explicit RemoveUnusedHUDeclarations(
const UsedDeclSet &used) : used(used) {}
182 const IR::Node *preorder(IR::Type_HeaderUnion *type)
override {
183 if (!used.isUsed(getOriginal<IR::IDeclaration>()))
return nullptr;
188class RemoveAllUnusedHUDDeclarations :
public PassManager {
192 RemoveAllUnusedHUDDeclarations()
197 setName(
"RemoveAllUnusedHUDDeclarations");
198 setStopOnError(
true);
208class FlattenHeaderUnion :
public PassManager {
Definition typeChecker.h:23
Collects all used declarations into @used set.
Definition unusedDeclarations.h:50
Definition flattenUnions.h:166
Definition flattenUnions.h:134
Definition indexed_vector.h:31
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 typeChecker.h:46
Definition typeChecker.h:496
Definition unusedDeclarations.h:20
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13