P4C
The P4 Compiler
Loading...
Searching...
No Matches
evaluator.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 FRONTENDS_P4_EVALUATOR_EVALUATOR_H_
9#define FRONTENDS_P4_EVALUATOR_EVALUATOR_H_
10
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/common/resolveReferences/resolveReferences.h"
13#include "frontends/p4/typeMap.h"
14#include "ir/ir.h"
15#include "ir/pass_manager.h"
16
17namespace P4 {
18
19class IHasBlock {
20 public:
21 virtual IR::ToplevelBlock *getToplevelBlock() const = 0;
22};
23
24class Evaluator final : public Inspector, public IHasBlock {
25 const ReferenceMap *refMap;
26 const TypeMap *typeMap;
27 std::vector<IR::Block *> blockStack;
28 IR::ToplevelBlock *toplevelBlock;
29
30 protected:
31 void pushBlock(IR::Block *block);
32 void popBlock(IR::Block *block);
33
34 public:
35 Evaluator(const ReferenceMap *refMap, const TypeMap *typeMap)
36 : refMap(refMap), typeMap(typeMap), toplevelBlock(nullptr) {
37 CHECK_NULL(refMap);
38 CHECK_NULL(typeMap);
39 setName("Evaluator");
40 visitDagOnce = false;
41 }
42 IR::ToplevelBlock *getToplevelBlock() const override { return toplevelBlock; }
43
44 IR::Block *currentBlock() const;
47 void setValue(const IR::Node *node, const IR::CompileTimeValue *constant);
50 bool hasValue(const IR::Node *node) const;
51 const IR::CompileTimeValue *getValue(const IR::Node *node) const;
52
55 std::vector<const IR::CompileTimeValue *> *evaluateArguments(
56 const IR::ParameterList *parameters, const IR::Vector<IR::Argument> *arguments,
57 IR::Block *context);
58
59 profile_t init_apply(const IR::Node *node) override;
60
61 // The traversal order is controlled very explicitly
62 bool preorder(const IR::P4Program *program) override;
63 bool preorder(const IR::Declaration_Constant *decl) override;
64 bool preorder(const IR::P4Table *table) override;
65 bool preorder(const IR::Declaration_Instance *inst) override;
66 bool preorder(const IR::ConstructorCallExpression *inst) override;
67 bool preorder(const IR::MethodCallExpression *expr) override;
68 bool preorder(const IR::PathExpression *expression) override;
69 bool preorder(const IR::Property *prop) override;
70 bool preorder(const IR::Member *expression) override;
71 bool preorder(const IR::ListExpression *expression) override;
72 bool preorder(const IR::P4ListExpression *expression) override;
73 bool preorder(const IR::StructExpression *expression) override;
74 bool preorder(const IR::Constant *expression) override {
75 setValue(expression, expression);
76 return false;
77 }
78 bool preorder(const IR::StringLiteral *expression) override {
79 setValue(expression, expression);
80 return false;
81 }
82 bool preorder(const IR::BoolLiteral *expression) override {
83 setValue(expression, expression);
84 return false;
85 }
86 bool preorder(const IR::ListCompileTimeValue *expression) override {
87 setValue(expression, expression);
88 return false;
89 }
90 bool preorder(const IR::StructCompileTimeValue *expression) override {
91 setValue(expression, expression);
92 return false;
93 }
94 bool preorder(const IR::Declaration_ID *expression) override {
95 setValue(expression, expression);
96 return false;
97 }
98
99 const IR::Block *processConstructor(const IR::Node *node, const IR::Type *type,
100 const IR::Type *instanceType,
101 const IR::Vector<IR::Argument> *arguments);
102};
103
106class EvaluatorPass final : public PassManager, public IHasBlock {
107 P4::Evaluator *evaluator;
108 std::unique_ptr<ReferenceMap> selfRefMap;
109
110 public:
111 IR::ToplevelBlock *getToplevelBlock() const override { return evaluator->getToplevelBlock(); }
112 EvaluatorPass(ReferenceMap *refMap, TypeMap *typeMap);
113 explicit EvaluatorPass(TypeMap *typeMap) : EvaluatorPass(nullptr, typeMap) {}
114};
115
116} // namespace P4
117
118#endif /* FRONTENDS_P4_EVALUATOR_EVALUATOR_H_ */
Definition evaluator.h:24
void setValue(const IR::Node *node, const IR::CompileTimeValue *constant)
Definition evaluator.cpp:43
std::vector< const IR::CompileTimeValue * > * evaluateArguments(const IR::ParameterList *parameters, const IR::Vector< IR::Argument > *arguments, IR::Block *context)
Definition evaluator.cpp:100
bool hasValue(const IR::Node *node) const
Definition evaluator.cpp:50
Definition evaluator.h:19
Definition node.h:44
Definition ir/vector.h:50
Definition visitor.h:409
Class used to encode maps from paths to declarations.
Definition referenceMap.h:58
Definition typeMap.h:32
Definition visitor.h:69
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13