P4C
The P4 Compiler
Loading...
Searching...
No Matches
removeComplexExpressions.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef MIDEND_REMOVECOMPLEXEXPRESSIONS_H_
9#define MIDEND_REMOVECOMPLEXEXPRESSIONS_H_
10
11#include "frontends/common/resolveReferences/resolveReferences.h"
12#include "frontends/p4/typeMap.h"
13#include "ir/ir.h"
14
15namespace P4 {
16
22 public:
28 virtual bool convert(const IR::P4Control *control) const = 0;
29};
30
36class RemoveComplexExpressions : public Transform, public ResolutionContext {
37 public:
39 P4::TypeMap *typeMap;
43
44 explicit RemoveComplexExpressions(P4::TypeMap *typeMap,
45 RemoveComplexExpressionsPolicy *policy = nullptr)
46 : typeMap(typeMap), policy(policy) {
47 CHECK_NULL(typeMap);
48 setName("RemoveComplexExpressions");
49 }
50 Visitor::profile_t init_apply(const IR::Node *node) override {
51 auto rv = Transform::init_apply(node);
52 node->apply(nameGen);
53
54 return rv;
55 }
56
57 const IR::PathExpression *createTemporary(const IR::Expression *expression);
58 const IR::Expression *simplifyExpression(const IR::Expression *expression, bool force);
59 const IR::Vector<IR::Expression> *simplifyExpressions(const IR::Vector<IR::Expression> *vec,
60 bool force = false);
61 const IR::Vector<IR::Argument> *simplifyExpressions(const IR::Vector<IR::Argument> *vec);
62 const IR::IndexedVector<IR::NamedExpression> *simplifyExpressions(
64
65 const IR::Node *simpleStatement(IR::Statement *statement);
66
67 const IR::Node *postorder(IR::SelectExpression *expression) override;
68 const IR::Node *preorder(IR::ParserState *state) override {
69 assignments.clear();
70 return state;
71 }
72 const IR::Node *postorder(IR::ParserState *state) override {
73 state->components.append(assignments);
74 return state;
75 }
76 const IR::Node *postorder(IR::MethodCallExpression *expression) override;
77 const IR::Node *preorder(IR::P4Parser *parser) override {
78 newDecls.clear();
79 return parser;
80 }
81 const IR::Node *postorder(IR::P4Parser *parser) override {
82 if (newDecls.size() != 0) {
83 // prepend declarations
84 newDecls.append(parser->parserLocals);
85 parser->parserLocals = newDecls;
86 }
87 return parser;
88 }
89 const IR::Node *preorder(IR::P4Control *control) override;
90 const IR::Node *postorder(IR::P4Control *control) override {
91 if (newDecls.size() != 0) {
92 // prepend declarations
93 newDecls.append(control->controlLocals);
94 control->controlLocals = newDecls;
95 }
96 return control;
97 }
98 const IR::Node *postorder(IR::Statement *statement) override;
99 const IR::Node *postorder(IR::MethodCallStatement *statement) override;
100};
101
102} // namespace P4
103
104#endif /* MIDEND_REMOVECOMPLEXEXPRESSIONS_H_ */
Definition indexed_vector.h:31
Definition node.h:53
Definition ir/vector.h:59
Definition referenceMap.h:36
Definition removeComplexExpressions.h:21
virtual bool convert(const IR::P4Control *control) const =0
Definition visitor.h:442
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