P4C
The P4 Compiler
Loading...
Searching...
No Matches
flattenHeaders.h
1/*
2 * Copyright 2018 MNK Consulting, LLC.
3 * SPDX-FileCopyrightText: 2018 MNK Consulting, LLC.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_FLATTENHEADERS_H_
9#define MIDEND_FLATTENHEADERS_H_
10
11#include "flattenInterfaceStructs.h"
12#include "frontends/p4/typeChecking/typeChecker.h"
13#include "ir/ir.h"
14
15namespace P4 {
16
20class FindHeaderTypesToReplace : public Inspector {
21 P4::TypeMap *typeMap;
24
25 public:
26 explicit FindHeaderTypesToReplace(P4::TypeMap *typeMap, AnnotationSelectionPolicy *policy)
27 : typeMap(typeMap), policy(policy) {
28 setName("FindHeaderTypesToReplace");
29 CHECK_NULL(typeMap);
30 }
31 bool preorder(const IR::Type_Header *type) override;
32 void createReplacement(const IR::Type_Header *type, AnnotationSelectionPolicy *policy);
33 StructTypeReplacement<IR::Type_StructLike> *getReplacement(const cstring name) const {
34 return ::P4::get(replacement, name);
35 }
36 bool empty() const { return replacement.empty(); }
37};
38
111class ReplaceHeaders : public Transform, P4WriteContext {
112 P4::TypeMap *typeMap;
113 FindHeaderTypesToReplace *findHeaderTypesToReplace;
114
115 public:
116 explicit ReplaceHeaders(P4::TypeMap *typeMap,
117 FindHeaderTypesToReplace *findHeaderTypesToReplace)
118 : typeMap(typeMap), findHeaderTypesToReplace(findHeaderTypesToReplace) {
119 CHECK_NULL(typeMap);
120 CHECK_NULL(findHeaderTypesToReplace);
121 setName("ReplaceHeaders");
122 }
123
124 const IR::Node *preorder(IR::P4Program *program) override;
125 const IR::Node *postorder(IR::Member *expression) override;
126 const IR::Node *postorder(IR::Type_Header *type) override;
127};
128
129class FlattenHeaders final : public PassManager {
130 public:
131 FlattenHeaders(TypeMap *typeMap, AnnotationSelectionPolicy *policy = nullptr) {
132 auto findHeadersToReplace = new FindHeaderTypesToReplace(typeMap, policy);
133 passes.push_back(new TypeChecking(nullptr, typeMap));
134 passes.push_back(findHeadersToReplace);
135 passes.push_back(new ReplaceHeaders(typeMap, findHeadersToReplace));
136 passes.push_back(new ClearTypeMap(typeMap));
137 setName("FlattenHeaders");
138 }
139};
140
141} // namespace P4
142
143#endif /* MIDEND_FLATTENHEADERS_H_ */
Definition flattenInterfaceStructs.h:23
Definition typeChecker.h:32
Definition flattenHeaders.h:20
Definition node.h:53
Definition visitor.h:418
Definition visitor.h:811
Definition flattenHeaders.h:111
Definition visitor.h:442
Definition typeChecker.h:55
Definition typeMap.h:32
Definition cstring.h:85
Definition ordered_map.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
Definition flattenInterfaceStructs.h:60