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 *)
40static const int SupportedBitWidth = 128;
53const char DirectResourceTableEntryIndex[] =
"table_entry_index";
121class BranchingInstructionGeneration {
126 if (n->
is<IR::LAnd>() || n->
is<IR::LOr>()) {
136 : convert(convert), refMap(refMap), typeMap(typeMap) {}
141 void postorder(
const IR::Type_Varbits *type)
override {
142 LOG3(
"Validating Type_Varbits: " << type);
143 if (type->size % 8 != 0) {
144 ::P4::error(ErrorType::ERR_UNSUPPORTED,
"%1% varbit width (%2%) not aligned to 8 bits",
145 type->srcInfo, type->size);
150class ConvertStatementToDpdk :
public Inspector {
155 const IR::P4Parser *parser =
nullptr;
157 IR::Type_Struct *metadataStruct =
nullptr;
158 bool createSandboxHeaderType =
false;
159 bool createTmpVar =
false;
163 bool checkIfBelongToSameHdrMdStructure(
const IR::Argument *field);
165 cstring getHdrMdStrName(
const IR::Member *mem);
166 bool checkIfConsecutiveHdrMdfields(
const IR::Argument *field);
167 void createSandboxHeader();
168 void createTmpVarForSandbox();
169 friend class BranchingInstructionGeneration;
174 : typemap(typemap), refmap(refmap), structure(structure) {
175 visitDagOnce =
false;
179 : typemap(typemap), refmap(refmap), structure(structure), metadataStruct(metadataStruct) {
180 visitDagOnce =
false;
183 void branchingInstructionGeneration(
cstring true_label,
cstring false_label,
184 const IR::Expression *expr);
185 bool preorder(
const IR::AssignmentStatement *a)
override;
186 bool preorder(
const IR::IfStatement *a)
override;
187 bool preorder(
const IR::MethodCallStatement *a)
override;
188 bool preorder(
const IR::SwitchStatement *a)
override;
190 void add_instr(
const IR::DpdkAsmStatement *s) { instructions.push_back(s); }
192 void process_logical_operation(
const IR::Expression *,
const IR::Operation_Binary *);
195 void set_parser(
const IR::P4Parser *p) { parser = p; }
196 void set_parent(
const IR::Node *p) { parent = p; }
197 bool handleConstSwitch(
const IR::SwitchStatement *a);
198 bool checkIf128bitOp(
const IR::Expression *,
const IR::Expression *);
199 void add128bitwiseInstr(
const IR::Expression *src1Op,
const IR::Expression *src2Op,
201 void add128ComparisonInstr(
cstring true_label,
const IR::Expression *src1Op,
202 const IR::Expression *src2Op,
const char *op);
203 void add128bitComplInstr(
const IR::Expression *,
const IR::Expression *);
204 void add128bitMovInstr(
const IR::Expression *left,
const IR::Expression *right);
208 const std::set<cstring> *process;
211 explicit ProcessControls(
const std::set<cstring> *process) : process(process) {
214 bool convert(
const IR::P4Control *control)
const {
215 if (process->find(control->name) != process->end())
return true;
bool generate(const IR::Expression *, cstring, cstring, bool)
Definition dpdkHelpers.cpp:820
Definition dpdkHelpers.h:150
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:124
bool convert(const IR::P4Control *control) const
Definition dpdkHelpers.h:214
Definition dpdkHelpers.h:140
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:37
const char PnaMainOutputMetadataOutputPortName[]
Name of the metadata used as output port.
Definition dpdkHelpers.h:52
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58
Collect information related to P4 programs targeting dpdk.
Definition dpdkProgramStructure.h:16
bool is() const noexcept
Definition rtti.h:216