P4C
The P4 Compiler
Loading...
Searching...
No Matches
hsIndexSimplify.h
1#ifndef MIDEND_HSINDEXSIMPLIFY_H_
2#define MIDEND_HSINDEXSIMPLIFY_H_
3
4#include <memory>
5
6#include "frontends/p4/typeChecking/typeChecker.h"
7#include "frontends/p4/typeMap.h"
8#include "ir/ir.h"
9
10namespace P4 {
11
12using GeneratedVariablesMap = std::map<cstring, const IR::PathExpression *>;
13
17class HSIndexFinder : public Inspector {
18 friend class HSIndexTransform;
19 friend class HSIndexContretizer;
21 std::shared_ptr<NameGenerator> nameGen;
22 TypeMap *typeMap;
23 const IR::ArrayIndex *arrayIndex = nullptr;
24 const IR::PathExpression *newVariable = nullptr;
25 GeneratedVariablesMap *generatedVariables;
26 std::set<cstring> storedMember;
27 std::list<IR::Member *> dependedMembers;
28
29 public:
30 HSIndexFinder(IR::IndexedVector<IR::Declaration> *locals,
31 std::shared_ptr<NameGenerator> nameGen, TypeMap *typeMap,
32 GeneratedVariablesMap *generatedVariables)
33 : locals(locals),
34 nameGen(nameGen),
35 typeMap(typeMap),
36 generatedVariables(generatedVariables) {}
37 void postorder(const IR::ArrayIndex *curArrayIndex) override;
38
39 protected:
40 void addNewVariable();
41};
42
44class HSIndexTransform : public Transform {
45 friend class HSIndexContretizer;
46 size_t index;
47 HSIndexFinder &hsIndexFinder;
48
49 public:
50 HSIndexTransform(HSIndexFinder &finder, size_t index) : index(index), hsIndexFinder(finder) {}
51 const IR::Node *postorder(IR::ArrayIndex *curArrayIndex) override;
52};
53
69class HSIndexContretizer : public Transform {
70 TypeMap *typeMap;
71 std::shared_ptr<MinimalNameGenerator> nameGen;
73 GeneratedVariablesMap *generatedVariables;
74 size_t expansion = 0, maxExpansion;
75 int id;
76 static int idCtr;
77
78 public:
79 explicit HSIndexContretizer(TypeMap *typeMap, size_t maxExpansion,
80 std::shared_ptr<MinimalNameGenerator> nameGen = nullptr,
81 IR::IndexedVector<IR::Declaration> *locals = nullptr,
82 GeneratedVariablesMap *generatedVariables = nullptr)
83 : typeMap(typeMap),
84 nameGen(nameGen),
85 locals(locals),
86 generatedVariables(generatedVariables),
87 maxExpansion(maxExpansion) {
88 id = ++idCtr;
89 if (generatedVariables == nullptr) generatedVariables = new GeneratedVariablesMap();
90 LOG5("HSIndexContretizer(" << id << ") maxExpansion = " << maxExpansion);
91 }
92 Visitor::profile_t init_apply(const IR::Node *node) override {
93 auto rv = Transform::init_apply(node);
94
95 if (!nameGen) {
96 nameGen = std::make_shared<MinimalNameGenerator>();
97 node->apply(*nameGen);
98 }
99
100 return rv;
101 }
102
103 IR::Node *preorder(IR::IfStatement *ifStatement) override;
104 IR::Node *preorder(IR::BaseAssignmentStatement *assignmentStatement) override;
105 IR::Node *preorder(IR::BlockStatement *blockStatement) override;
106 IR::Node *preorder(IR::MethodCallStatement *methodCallStatement) override;
107 IR::Node *preorder(IR::P4Control *control) override;
108 IR::Node *preorder(IR::P4Parser *parser) override;
109 IR::Node *preorder(IR::SwitchStatement *switchStatement) override;
110
111 protected:
112 IR::Node *eliminateArrayIndexes(HSIndexFinder &aiFinder, IR::Statement *statement,
113 const IR::Expression *expr);
114};
115
116class HSIndexSimplifier : public PassManager {
117 public:
118 explicit HSIndexSimplifier(TypeMap *typeMap, size_t maxExpansion = 1000) {
119 // remove block statements
120 passes.push_back(new TypeChecking(nullptr, typeMap, true));
121 passes.push_back(new HSIndexContretizer(typeMap, maxExpansion));
122 setName("HSIndexSimplifier");
123 }
124};
125
126} // namespace P4
127
128#endif /* MIDEND_HSINDEXSIMPLIFY_H_ */
Definition hsIndexSimplify.h:69
Definition hsIndexSimplify.h:17
Definition indexed_vector.h:40
Definition node.h:94
Definition visitor.h:413
Definition visitor.h:437
Definition typeChecker.h:55
Definition typeMap.h:41
Definition visitor.h:78
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24