P4C
The P4 Compiler
Loading...
Searching...
No Matches
expandLookahead.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_EXPANDLOOKAHEAD_H_
9#define MIDEND_EXPANDLOOKAHEAD_H_
10
11#include "frontends/common/resolveReferences/resolveReferences.h"
12#include "frontends/p4/typeChecking/typeChecker.h"
13#include "frontends/p4/typeMap.h"
14#include "ir/ir.h"
15
16namespace P4 {
17
31class DoExpandLookahead : public Transform, public ResolutionContext {
33 P4::TypeMap *typeMap;
40 bool expandHeader = true;
41
42 struct ExpansionInfo {
43 const IR::Statement *statement;
44 unsigned width;
45 const IR::Type *origType;
46 const IR::PathExpression *tmp; // temporary used for result
47 };
48
49 void expand(const IR::PathExpression *bitvector, const IR::Type *type, unsigned *offset,
50 const IR::Expression *destination, IR::IndexedVector<IR::StatOrDecl> *output);
51 ExpansionInfo *convertLookahead(const IR::MethodCallExpression *expression);
52
53 public:
54 explicit DoExpandLookahead(TypeMap *typeMap, bool expandHeader = true)
55 : typeMap(typeMap), expandHeader(expandHeader) {
56 CHECK_NULL(typeMap);
57 setName("DoExpandLookahead");
58 }
59 Visitor::profile_t init_apply(const IR::Node *node) override {
60 auto rv = Transform::init_apply(node);
61 node->apply(nameGen);
62
63 return rv;
64 }
65
66 const IR::Node *postorder(IR::AssignmentStatement *statement) override;
67 const IR::Node *postorder(IR::MethodCallStatement *statement) override;
68 const IR::Node *preorder(IR::P4Control *control) override {
69 prune();
70 return control;
71 }
72 const IR::Node *preorder(IR::P4Parser *parser) override {
73 newDecls.clear();
74 return parser;
75 }
76 const IR::Node *postorder(IR::P4Parser *parser) override {
77 if (!newDecls.empty()) parser->parserLocals.append(newDecls);
78 return parser;
79 }
80};
81
85class ExpandLookahead : public PassManager {
86 public:
87 explicit ExpandLookahead(TypeMap *typeMap, TypeChecking *typeChecking = nullptr,
88 bool expandHeader = true) {
89 if (!typeChecking) typeChecking = new TypeChecking(nullptr, typeMap);
90 passes.push_back(typeChecking);
91 passes.push_back(new DoExpandLookahead(typeMap, expandHeader));
92 setName("ExpandLookahead");
93 }
94};
95
96} // namespace P4
97
98#endif /* MIDEND_EXPANDLOOKAHEAD_H_ */
Definition expandLookahead.h:31
Definition indexed_vector.h:31
Definition node.h:53
Definition referenceMap.h:36
Definition visitor.h:442
Definition typeChecker.h:55
Definition typeMap.h:32
Definition visitor.h:78
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13