P4C
The P4 Compiler
Loading...
Searching...
No Matches
hsIndexSimplify.h
1#ifndef MIDEND_HSINDEXSIMPLIFY_H_
2#define MIDEND_HSINDEXSIMPLIFY_H_
3
4#include "frontends/common/resolveReferences/referenceMap.h"
5#include "frontends/p4/typeChecking/typeChecker.h"
6#include "frontends/p4/typeMap.h"
7#include "ir/ir.h"
8
9namespace P4 {
10
11using GeneratedVariablesMap = std::map<cstring, const IR::PathExpression *>;
12
16class HSIndexFinder : public Inspector {
17 friend class HSIndexTransform;
18 friend class HSIndexContretizer;
20 ReferenceMap *refMap;
21 TypeMap *typeMap;
22 const IR::ArrayIndex *arrayIndex = nullptr;
23 const IR::PathExpression *newVariable = nullptr;
24 GeneratedVariablesMap *generatedVariables;
25 std::set<cstring> storedMember;
26 std::list<IR::Member *> dependedMembers;
27
28 public:
30 TypeMap *typeMap, GeneratedVariablesMap *generatedVariables)
31 : locals(locals),
32 refMap(refMap),
33 typeMap(typeMap),
34 generatedVariables(generatedVariables) {}
35 void postorder(const IR::ArrayIndex *curArrayIndex) override;
36
37 protected:
38 void addNewVariable();
39};
40
43 friend class HSIndexContretizer;
44 size_t index;
45 HSIndexFinder &hsIndexFinder;
46
47 public:
48 HSIndexTransform(HSIndexFinder &finder, size_t index) : index(index), hsIndexFinder(finder) {}
49 const IR::Node *postorder(IR::ArrayIndex *curArrayIndex) override;
50};
51
68 ReferenceMap *refMap;
69 TypeMap *typeMap;
71 GeneratedVariablesMap *generatedVariables;
72
73 public:
74 HSIndexContretizer(ReferenceMap *refMap, TypeMap *typeMap,
75 IR::IndexedVector<IR::Declaration> *locals = nullptr,
76 GeneratedVariablesMap *generatedVariables = nullptr)
77 : refMap(refMap), typeMap(typeMap), locals(locals), generatedVariables(generatedVariables) {
78 if (generatedVariables == nullptr) {
79 generatedVariables = new GeneratedVariablesMap();
80 }
81 }
82 IR::Node *preorder(IR::IfStatement *ifStatement) override;
83 IR::Node *preorder(IR::AssignmentStatement *assignmentStatement) override;
84 IR::Node *preorder(IR::BlockStatement *blockStatement) override;
85 IR::Node *preorder(IR::MethodCallStatement *methodCallStatement) override;
86 IR::Node *preorder(IR::P4Control *control) override;
87 IR::Node *preorder(IR::P4Parser *parser) override;
88 IR::Node *preorder(IR::SwitchStatement *switchStatement) override;
89
90 protected:
91 IR::Node *eliminateArrayIndexes(HSIndexFinder &aiFinder, IR::Statement *statement,
92 const IR::Expression *expr);
93};
94
96 public:
97 HSIndexSimplifier(ReferenceMap *refMap, TypeMap *typeMap) {
98 // remove block statements
99 passes.push_back(new TypeChecking(refMap, typeMap, true));
100 passes.push_back(new HSIndexContretizer(refMap, typeMap));
101 setName("HSIndexSimplifier");
102 }
103};
104
105} // namespace P4
106
107#endif /* MIDEND_HSINDEXSIMPLIFY_H_ */
Definition hsIndexSimplify.h:67
Definition hsIndexSimplify.h:16
Definition hsIndexSimplify.h:95
This class substitutes index of a header stack in all occurences of found header stack.
Definition hsIndexSimplify.h:42
Definition node.h:52
Definition node.h:95
Definition visitor.h:400
Definition pass_manager.h:40
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Definition visitor.h:424
Definition typeChecker.h:55
Definition typeMap.h:41
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24