P4C
The P4 Compiler
Loading...
Searching...
No Matches
eliminateTuples.h
1/*
2 * Copyright 2016 VMware, Inc.
3 * SPDX-FileCopyrightText: 2016 VMware, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_ELIMINATETUPLES_H_
9#define MIDEND_ELIMINATETUPLES_H_
10
11#include "frontends/common/resolveReferences/resolveReferences.h"
12#include "frontends/p4/typeChecking/typeChecker.h"
13#include "ir/ir.h"
14
15namespace P4 {
16
21class ReplacementMap {
23 std::set<const IR::Type_Struct *> inserted;
24 const IR::Type *convertType(const IR::Type *type);
25
26 public:
27 NameGenerator &ng;
28 P4::TypeMap *typeMap;
29
30 ReplacementMap(NameGenerator &ng, TypeMap *typeMap) : ng(ng), typeMap(typeMap) {
31 CHECK_NULL(typeMap);
32 }
33 const IR::Type_Struct *getReplacement(const IR::Type_BaseList *tt);
34 IR::IndexedVector<IR::Node> *getNewReplacements();
35};
36
68class DoReplaceTuples final : public Transform {
69 ReplacementMap repl;
71
72 public:
73 explicit DoReplaceTuples(TypeMap *typeMap) : repl(ng, typeMap) { setName("DoReplaceTuples"); }
74 Visitor::profile_t init_apply(const IR::Node *node) override {
75 auto rv = Transform::init_apply(node);
76 node->apply(ng);
77
78 return rv;
79 }
80 const IR::Node *skip(const IR::Node *node) {
81 prune();
82 return node;
83 }
84 const IR::Node *postorder(IR::Type_BaseList *type) override;
85 const IR::Node *insertReplacements(const IR::Node *before);
86 const IR::Node *postorder(IR::Type_Struct *type) override { return insertReplacements(type); }
87 const IR::Node *postorder(IR::ArrayIndex *expression) override;
88 const IR::Node *postorder(IR::Type_Typedef *type) override { return insertReplacements(type); }
89 const IR::Node *postorder(IR::Type_Newtype *type) override { return insertReplacements(type); }
90 const IR::Node *postorder(IR::P4Parser *parser) override { return insertReplacements(parser); }
91 const IR::Node *postorder(IR::P4Control *control) override {
92 return insertReplacements(control);
93 }
94 const IR::Node *postorder(IR::Method *method) override { return insertReplacements(method); }
95 const IR::Node *postorder(IR::Type_Extern *ext) override { return insertReplacements(ext); }
96 const IR::Node *postorder(IR::Declaration_Instance *decl) override {
97 return insertReplacements(decl);
98 }
99 const IR::Node *preorder(IR::P4ValueSet *set) override {
100 // Disable substitution of type parameters for value sets.
101 // We want to keep these as tuples.
102 return skip(set);
103 }
104 const IR::Node *preorder(IR::P4ListExpression *expression) override { return skip(expression); }
105 const IR::Node *preorder(IR::Type_P4List *list) override { return skip(list); }
106};
107
108class EliminateTuples final : public PassManager {
109 public:
110 explicit EliminateTuples(TypeMap *typeMap, TypeChecking *typeChecking = nullptr,
111 TypeInference *typeInference = nullptr) {
112 passes.push_back(typeChecking ? typeChecking : new TypeChecking(nullptr, typeMap));
113 passes.push_back(new DoReplaceTuples(typeMap));
114 passes.push_back(new ClearTypeMap(typeMap));
115 // We do a round of type-checking which may mutate the program.
116 // This will convert some ListExpressions
117 // into StructExpression where tuples were converted
118 // to structs.
119 passes.push_back(typeInference ? typeInference : new TypeInference(typeMap, false));
120 setName("EliminateTuples");
121 }
122};
123
124} // namespace P4
125
126#endif /* MIDEND_ELIMINATETUPLES_H_ */
Definition typeChecker.h:32
Definition eliminateTuples.h:68
Definition indexed_vector.h:31
Definition node.h:53
Definition referenceMap.h:36
Definition referenceMap.h:29
Definition eliminateTuples.h:21
Definition visitor.h:442
Definition typeChecker.h:55
Definition typeChecker.h:491
Definition typeMap.h:32
Definition visitor.h:78
Definition ordered_map.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13