17#ifndef BACKENDS_DPDK_DPDKHELPERS_H_
18#define BACKENDS_DPDK_DPDKHELPERS_H_
21#include "dpdkProgramStructure.h"
22#include "frontends/common/constantFolding.h"
23#include "frontends/common/resolveReferences/referenceMap.h"
24#include "frontends/p4/coreLibrary.h"
25#include "frontends/p4/enumInstance.h"
26#include "frontends/p4/evaluator/evaluator.h"
27#include "frontends/p4/methodInstance.h"
28#include "frontends/p4/simplify.h"
29#include "frontends/p4/typeMap.h"
30#include "frontends/p4/unusedDeclarations.h"
32#include "lib/big_int_util.h"
34#include "midend/removeComplexExpressions.h"
36#define TOSTR_DECLA(NAME) std::ostream &toStr(std::ostream &, IR::NAME *)
49const char DirectResourceTableEntryIndex[] =
"table_entry_index";
117class BranchingInstructionGeneration {
121 if (n->
is<IR::LAnd>() || n->
is<IR::LOr>()) {
131 : refMap(refMap), typeMap(typeMap) {}
136 void postorder(
const IR::Type_Varbits *type)
override {
137 LOG3(
"Validating Type_Varbits: " << type);
138 if (type->size % 8 != 0) {
139 ::P4::error(ErrorType::ERR_UNSUPPORTED,
"%1% varbit width (%2%) not aligned to 8 bits",
140 type->srcInfo, type->size);
145class ConvertStatementToDpdk :
public Inspector {
150 const IR::P4Parser *parser =
nullptr;
152 IR::Type_Struct *metadataStruct =
nullptr;
156 bool checkIfBelongToSameHdrMdStructure(
const IR::Argument *field);
158 cstring getHdrMdStrName(
const IR::Member *mem);
159 bool checkIfConsecutiveHdrMdfields(
const IR::Argument *field);
164 : typemap(typemap), refmap(refmap), structure(structure) {
165 visitDagOnce =
false;
169 : typemap(typemap), refmap(refmap), structure(structure), metadataStruct(metadataStruct) {
170 visitDagOnce =
false;
173 void branchingInstructionGeneration(
cstring true_label,
cstring false_label,
174 const IR::Expression *expr);
175 bool preorder(
const IR::AssignmentStatement *a)
override;
176 bool preorder(
const IR::IfStatement *a)
override;
177 bool preorder(
const IR::MethodCallStatement *a)
override;
178 bool preorder(
const IR::SwitchStatement *a)
override;
180 void add_instr(
const IR::DpdkAsmStatement *s) { instructions.push_back(s); }
182 void process_logical_operation(
const IR::Expression *,
const IR::Operation_Binary *);
185 void set_parser(
const IR::P4Parser *p) { parser = p; }
186 void set_parent(
const IR::Node *p) { parent = p; }
187 bool handleConstSwitch(
const IR::SwitchStatement *a);
192 const std::set<cstring> *process;
195 explicit ProcessControls(
const std::set<cstring> *process) : process(process) {
198 bool convert(
const IR::P4Control *control)
const {
199 if (process->find(control->name) != process->end())
return true;
bool generate(const IR::Expression *, cstring, cstring, bool)
Definition dpdkHelpers.cpp:794
void process_relation_operation(const IR::Expression *, const IR::Operation_Relation *)
Definition dpdkHelpers.cpp:31
bool preorder(const IR::AssignmentStatement *a) override
Definition dpdkHelpers.cpp:116
bool convert(const IR::P4Control *control) const
Definition dpdkHelpers.h:198
Definition dpdkHelpers.h:135
Definition indexed_vector.h:40
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Definition removeComplexExpressions.h:30
Definition dpdk/backend.cpp:36
const char PnaMainOutputMetadataOutputPortName[]
Name of the metadata used as output port.
Definition dpdkHelpers.h:48
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition error.h:51
Collect information related to P4 programs targeting dpdk.
Definition dpdkProgramStructure.h:16
bool is() const noexcept
Definition rtti.h:216