8#ifndef BACKENDS_DPDK_DPDKPROGRAM_H_
9#define BACKENDS_DPDK_DPDKPROGRAM_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"
23#include "lib/big_int_util.h"
29using namespace P4::literals;
31class ConvertToDpdkProgram :
public Transform {
36 const IR::DpdkAsmProgram *dpdk_program;
41 : typemap(typemap), refmap(refmap), structure(structure), options(options) {}
43 const IR::DpdkAsmProgram *create(IR::P4Program *prog);
48 const IR::Node *preorder(IR::P4Program *p)
override;
49 const IR::DpdkAsmProgram *getDpdkProgram() {
return dpdk_program; }
51 IR::Type_Struct *metadata);
54class ConvertToDpdkParser :
public Inspector {
59 IR::Type_Struct *metadataStruct;
64 : refmap(refmap), typemap(typemap), structure(structure), metadataStruct(metadataStruct) {}
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); }
71 IR::Declaration_Variable *addNewTmpVarToMetadata(
cstring name,
const IR::Type *type);
72 void handleTupleExpression(
const IR::ListExpression *cl,
const IR::ListExpression *input,
74 void getCondVars(
const IR::Expression *sv,
const IR::Expression *ce, IR::Expression **leftExpr,
75 IR::Expression **rightExpr);
78class ConvertToDpdkControl :
public Inspector {
82 IR::Type_Struct *metadataStruct;
88 std::set<cstring> unique_actions;
94 bool deparser =
false)
98 metadataStruct(metadataStruct),
107 bool preorder(
const IR::P4Action *a)
override;
108 bool preorder(
const IR::P4Table *a)
override;
109 bool preorder(
const IR::P4Control *)
override;
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); }
118 std::optional<const IR::Member *> getMemExprFromProperty(
const IR::P4Table *,
cstring);
119 std::optional<int> getNumberFromProperty(
const IR::P4Table *,
cstring);
122class CollectActionUses :
public Inspector {
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);
133 actions.insert(path->path->name.name);
140class ElimUnusedActions :
public Transform {
142 std::set<cstring> kept_actions;
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);
159class EliminateUnusedAction :
public PassManager {
163 EliminateUnusedAction() {
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
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition ordered_set.h:32
Definition dpdk/backend.cpp:26
Collect information related to P4 programs targeting dpdk.
Definition dpdkProgramStructure.h:22