P4C
The P4 Compiler
Loading...
Searching...
No Matches
dpdkProgram.h
1/*
2 * Copyright 2020 Intel Corp.
3 * SPDX-FileCopyrightText: 2020 Intel Corp.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_DPDK_DPDKPROGRAM_H_
9#define BACKENDS_DPDK_DPDKPROGRAM_H_
10
11#include "dpdkArch.h"
12#include "dpdkProgramStructure.h"
13#include "frontends/common/constantFolding.h"
14#include "frontends/common/resolveReferences/referenceMap.h"
15#include "frontends/p4/coreLibrary.h"
16#include "frontends/p4/enumInstance.h"
17#include "frontends/p4/evaluator/evaluator.h"
18#include "frontends/p4/methodInstance.h"
19#include "frontends/p4/simplify.h"
20#include "frontends/p4/typeMap.h"
21#include "frontends/p4/unusedDeclarations.h"
22#include "ir/ir.h"
23#include "lib/big_int_util.h"
24#include "lib/json.h"
25#include "options.h"
26
27namespace P4::DPDK {
28
29using namespace P4::literals;
30
31class ConvertToDpdkProgram : public Transform {
32 P4::TypeMap *typemap;
33 P4::ReferenceMap *refmap;
34 DpdkProgramStructure *structure;
35 DpdkOptions &options;
36 const IR::DpdkAsmProgram *dpdk_program;
37
38 public:
39 ConvertToDpdkProgram(P4::ReferenceMap *refmap, P4::TypeMap *typemap,
40 DpdkProgramStructure *structure, DpdkOptions &options)
41 : typemap(typemap), refmap(refmap), structure(structure), options(options) {}
42
43 const IR::DpdkAsmProgram *create(IR::P4Program *prog);
44 IR::IndexedVector<IR::DpdkAsmStatement> create_pna_preamble();
45 IR::IndexedVector<IR::DpdkAsmStatement> create_psa_preamble();
46 IR::IndexedVector<IR::DpdkAsmStatement> create_pna_postamble();
47 IR::IndexedVector<IR::DpdkAsmStatement> create_psa_postamble();
48 const IR::Node *preorder(IR::P4Program *p) override;
49 const IR::DpdkAsmProgram *getDpdkProgram() { return dpdk_program; }
51 IR::Type_Struct *metadata);
52};
53
54class ConvertToDpdkParser : public Inspector {
56 P4::ReferenceMap *refmap;
57 P4::TypeMap *typemap;
58 DpdkProgramStructure *structure;
59 IR::Type_Struct *metadataStruct;
60
61 public:
62 ConvertToDpdkParser(P4::ReferenceMap *refmap, P4::TypeMap *typemap,
63 DpdkProgramStructure *structure, IR::Type_Struct *metadataStruct)
64 : refmap(refmap), typemap(typemap), structure(structure), metadataStruct(metadataStruct) {}
65 IR::IndexedVector<IR::DpdkAsmStatement> getInstructions() { return instructions; }
66
67 bool preorder(const IR::P4Parser *a) override;
68 bool preorder(const IR::ParserState *s) override;
69 void add_instr(const IR::DpdkAsmStatement *s) { instructions.push_back(s); }
70 cstring append_parser_name(const IR::P4Parser *p, cstring);
71 IR::Declaration_Variable *addNewTmpVarToMetadata(cstring name, const IR::Type *type);
72 void handleTupleExpression(const IR::ListExpression *cl, const IR::ListExpression *input,
73 int inputSize, cstring trueLabel, cstring falseLabel);
74 void getCondVars(const IR::Expression *sv, const IR::Expression *ce, IR::Expression **leftExpr,
75 IR::Expression **rightExpr);
76};
77
78class ConvertToDpdkControl : public Inspector {
79 P4::TypeMap *typemap;
80 P4::ReferenceMap *refmap;
81 DpdkProgramStructure *structure;
82 IR::Type_Struct *metadataStruct;
88 std::set<cstring> unique_actions;
89 bool deparser;
90
91 public:
92 ConvertToDpdkControl(P4::ReferenceMap *refmap, P4::TypeMap *typemap,
93 DpdkProgramStructure *structure, IR::Type_Struct *metadataStruct,
94 bool deparser = false)
95 : typemap(typemap),
96 refmap(refmap),
97 structure(structure),
98 metadataStruct(metadataStruct),
99 deparser(deparser) {}
100
101 IR::IndexedVector<IR::DpdkTable> &getTables() { return tables; }
102 IR::IndexedVector<IR::DpdkSelector> &getSelectors() { return selectors; }
103 IR::IndexedVector<IR::DpdkLearner> &getLearners() { return learners; }
104 IR::IndexedVector<IR::DpdkAction> &getActions() { return actions; }
105 IR::IndexedVector<IR::DpdkAsmStatement> &getInstructions() { return instructions; }
106
107 bool preorder(const IR::P4Action *a) override;
108 bool preorder(const IR::P4Table *a) override;
109 bool preorder(const IR::P4Control *) override;
110 bool checkTableValid(const IR::P4Table *a);
111
112 void add_inst(const IR::DpdkAsmStatement *s) { instructions.push_back(s); }
113 void add_table(const IR::DpdkTable *t) { tables.push_back(t); }
114 void add_table(const IR::DpdkSelector *s) { selectors.push_back(s); }
115 void add_table(const IR::DpdkLearner *s) { learners.push_back(s); }
116 void add_action(const IR::DpdkAction *a) { actions.push_back(a); }
117
118 std::optional<const IR::Member *> getMemExprFromProperty(const IR::P4Table *, cstring);
119 std::optional<int> getNumberFromProperty(const IR::P4Table *, cstring);
120};
121
122class CollectActionUses : public Inspector {
123 ordered_set<cstring> &actions;
124
125 public:
126 explicit CollectActionUses(ordered_set<cstring> &a) : actions(a) {}
127 bool preorder(const IR::ActionListElement *ale) {
128 if (auto mce = ale->expression->to<IR::MethodCallExpression>()) {
129 if (auto path = mce->method->to<IR::PathExpression>()) {
130 if (path->path->name.originalName == "NoAction")
131 actions.insert("NoAction"_cs);
132 else
133 actions.insert(path->path->name.name);
134 }
135 }
136 return false;
137 }
138};
139
140class ElimUnusedActions : public Transform {
141 const ordered_set<cstring> &used_actions;
142 std::set<cstring> kept_actions;
143
144 public:
145 explicit ElimUnusedActions(const ordered_set<cstring> &a) : used_actions(a) {}
146 const IR::Node *postorder(IR::DpdkAction *a) override {
147 if (kept_actions.count(a->name.name) != 0) return nullptr;
148 if (used_actions.find(a->name.name) != used_actions.end()) {
149 kept_actions.insert(a->name.name);
150 return a;
151 }
152 return nullptr;
153 }
154};
155
159class EliminateUnusedAction : public PassManager {
160 ordered_set<cstring> actions;
161
162 public:
163 EliminateUnusedAction() {
164 addPasses({new CollectActionUses(actions), new ElimUnusedActions(actions)});
165 }
166};
167
168} // namespace P4::DPDK
169#endif /* BACKENDS_DPDK_DPDKPROGRAM_H_ */
Definition dpdkProgram.h:122
bool checkTableValid(const IR::P4Table *a)
Definition dpdkProgram.cpp:507
void getCondVars(const IR::Expression *sv, const IR::Expression *ce, IR::Expression **leftExpr, IR::Expression **rightExpr)
Definition dpdkProgram.cpp:265
IR::IndexedVector< IR::DpdkStructType > UpdateHeaderMetadata(IR::P4Program *prog, IR::Type_Struct *metadata)
Definition dpdkProgram.cpp:19
Definition backends/dpdk/options.h:15
Definition dpdkProgram.h:140
Definition indexed_vector.h:31
Definition node.h:53
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition typeMap.h:32
Definition cstring.h:85
Definition ordered_set.h:32
Definition dpdk/backend.cpp:26
Collect information related to P4 programs targeting dpdk.
Definition dpdkProgramStructure.h:22