8#ifndef BACKENDS_DPDK_DPDKHELPERS_H_
9#define BACKENDS_DPDK_DPDKHELPERS_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"
25#include "midend/removeComplexExpressions.h"
27#define TOSTR_DECLA(NAME) std::ostream &toStr(std::ostream &, IR::NAME *)
31static const int SupportedBitWidth = 128;
44const char DirectResourceTableEntryIndex[] =
"table_entry_index";
112class BranchingInstructionGeneration {
117 if (n->
is<IR::LAnd>() || n->
is<IR::LOr>()) {
127 : convert(convert), refMap(refMap), typeMap(typeMap) {}
132 void postorder(
const IR::Type_Varbits *type)
override {
133 LOG3(
"Validating Type_Varbits: " << type);
134 if (type->size % 8 != 0) {
135 ::P4::error(ErrorType::ERR_UNSUPPORTED,
"%1% varbit width (%2%) not aligned to 8 bits",
136 type->srcInfo, type->size);
141class ConvertStatementToDpdk :
public Inspector {
146 const IR::P4Parser *parser =
nullptr;
148 IR::Type_Struct *metadataStruct =
nullptr;
149 bool createSandboxHeaderType =
false;
150 bool createTmpVar =
false;
154 bool checkIfBelongToSameHdrMdStructure(
const IR::Argument *field);
156 cstring getHdrMdStrName(
const IR::Member *mem);
157 bool checkIfConsecutiveHdrMdfields(
const IR::Argument *field);
158 void createSandboxHeader();
159 void createTmpVarForSandbox();
160 friend class BranchingInstructionGeneration;
165 : typemap(typemap), refmap(refmap), structure(structure) {
166 visitDagOnce =
false;
170 : typemap(typemap), refmap(refmap), structure(structure), metadataStruct(metadataStruct) {
171 visitDagOnce =
false;
174 void branchingInstructionGeneration(
cstring true_label,
cstring false_label,
175 const IR::Expression *expr);
176 bool preorder(
const IR::AssignmentStatement *a)
override;
177 bool preorder(
const IR::IfStatement *a)
override;
178 bool preorder(
const IR::MethodCallStatement *a)
override;
179 bool preorder(
const IR::SwitchStatement *a)
override;
181 void add_instr(
const IR::DpdkAsmStatement *s) { instructions.push_back(s); }
183 void process_logical_operation(
const IR::Expression *,
const IR::Operation_Binary *);
186 void set_parser(
const IR::P4Parser *p) { parser = p; }
187 void set_parent(
const IR::Node *p) { parent = p; }
188 bool handleConstSwitch(
const IR::SwitchStatement *a);
189 bool checkIf128bitOp(
const IR::Expression *,
const IR::Expression *);
190 void add128bitwiseInstr(
const IR::Expression *src1Op,
const IR::Expression *src2Op,
192 void add128ComparisonInstr(
cstring true_label,
const IR::Expression *src1Op,
193 const IR::Expression *src2Op,
const char *op);
194 void add128bitComplInstr(
const IR::Expression *,
const IR::Expression *);
195 void add128bitMovInstr(
const IR::Expression *left,
const IR::Expression *right);
199 const std::set<cstring> *process;
202 explicit ProcessControls(
const std::set<cstring> *process) : process(process) {
205 bool convert(
const IR::P4Control *control)
const {
206 if (process->find(control->name) != process->end())
return true;
bool generate(const IR::Expression *, cstring, cstring, bool)
Definition dpdkHelpers.cpp:809
Definition dpdkHelpers.h:141
void process_relation_operation(const IR::Expression *, const IR::Operation_Relation *)
Definition dpdkHelpers.cpp:20
bool preorder(const IR::AssignmentStatement *a) override
Definition dpdkHelpers.cpp:113
bool convert(const IR::P4Control *control) const
Definition dpdkHelpers.h:205
Definition dpdkHelpers.h:131
Definition indexed_vector.h:31
Definition ir/vector.h:59
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition removeComplexExpressions.h:21
Definition dpdk/backend.cpp:26
const char PnaMainOutputMetadataOutputPortName[]
Name of the metadata used as output port.
Definition dpdkHelpers.h:43
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:22
bool is() const noexcept
Definition rtti.h:216