8#ifndef BACKENDS_TC_TCEXTERNS_H_
9#define BACKENDS_TC_TCEXTERNS_H_
15using namespace P4::literals;
21 const IR::Declaration_Instance *di;
25 EBPFCounterPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
28 this->tblname = tblname;
31 EBPFCounterPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
49 const IR::Type *keyArg;
50 const IR::Type *valueArg;
59 this->instanceName = di->toString();
60 if (!di->type->is<IR::Type_Specialized>()) {
61 ::P4::error(ErrorType::ERR_MODEL,
"Missing specialization: %1%", di);
64 auto ts = di->type->to<IR::Type_Specialized>();
66 if (ts->arguments->size() != PARAM_INDEX_2) {
67 ::P4::error(ErrorType::ERR_MODEL,
"Expected a type specialized with two arguments: %1%",
72 this->valueArg = ts->arguments->at(0);
73 this->keyArg = ts->arguments->at(1);
75 this->keyType = EBPF::EBPFTypeFactory::instance->create(keyArg);
76 this->valueType = EBPF::EBPFTypeFactory::instance->create(valueArg);
80 const IR::Expression *leftExpression);
92 bool preorder(
const IR::PathExpression *pe)
override {
93 auto decl = table->program->refMap->getDeclaration(pe->path,
true);
94 auto di = decl->to<IR::Declaration_Instance>();
96 if (EBPF::EBPFObject::getSpecializedTypeName(di) !=
"DirectCounter") {
98 "%1%: not a DirectCounter, see declaration of %2%", pe, decl);
101 auto counterName = EBPF::EBPFObject::externalName(di);
102 auto tblname = table->table->container->name.originalName;
103 auto ctr =
new EBPFCounterPNA(table->program, di, counterName, table->codeGen, tblname);
104 table->counters.emplace_back(std::make_pair(counterName, ctr));
108 void visitTableProperty() {
109 EBPF::EBPFTablePsaPropertyVisitor::visitTableProperty(
"pna_direct_counter"_cs);
118 void updateChecksum(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments,
bool addData);
127 void emitAddData(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments)
override;
130 void emitSubtractData(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments)
override;
134 const IR::MethodCallExpression *expr)
override;
135 cstring getConvertByteOrderFunction(
unsigned widthToEmit,
cstring byte_order);
144 EBPFChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
147 auto di = block->
to<IR::Declaration_Instance>();
148 if (di->arguments->size() != 1) {
149 ::P4::error(ErrorType::ERR_UNEXPECTED,
"Expected exactly 1 argument %1%", block);
152 int type = di->arguments->at(0)->expression->checkedTo<IR::Constant>()->asInt();
153 init(program, name, type);
156 EBPFChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
159 init(program, name, type);
163class EBPFInternetChecksumPNA :
public EBPFChecksumPNA {
165 EBPFInternetChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
167 : EBPFChecksumPNA(program, block, name,
168 EBPF::EBPFHashAlgorithmPSA::HashAlgorithm::ONES_COMPLEMENT16) {}
171 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
179 EBPFHashPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
182 auto di = block->
to<IR::Declaration_Instance>();
183 if (di->arguments->size() != 1) {
184 ::P4::error(ErrorType::ERR_UNEXPECTED,
"Expected exactly 1 argument %1%", block);
187 int type = di->arguments->at(0)->expression->checkedTo<IR::Constant>()->asInt();
188 init(program, name, type);
191 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
192 void calculateHash(
EBPF::CodeBuilder *builder,
const IR::MethodCallExpression *expr,
197class EBPFCRCChecksumPNA :
public EBPFChecksumPNA {
199 EBPFCRCChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
201 : EBPFChecksumPNA(program, block, name) {}
204 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
215 BUG_CHECK(width == 16 || width == 32,
"Must be 16 bits width or 32 bits width.");
216 initialValue =
"0"_cs;
220 const IR::MethodCallExpression *expr);
222 const IR::MethodCallExpression *expr)
override;
231 BUG_CHECK(width == 16 || width == 32,
"Must be 16 bits width or 32 bits width.");
232 initialValue =
"0"_cs;
236 const IR::MethodCallExpression *expr);
238 const IR::MethodCallExpression *expr)
override;
248 EBPFDigestPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
252 this->externName = externName;
253 this->instanceName = di->toString();
269 this->instanceName = di->toString();
274 this->tblname = tblname;
275 this->instanceName = di->toString();
279 const IR::Expression *leftExpression)
const;
282 const IR::Expression *leftExpression)
const;
292 bool preorder(
const IR::PathExpression *pe)
override {
293 auto decl = table->program->refMap->getDeclaration(pe->path,
true);
294 auto di = decl->to<IR::Declaration_Instance>();
296 if (EBPF::EBPFObject::getTypeName(di) !=
"DirectMeter") {
297 ::P4::error(ErrorType::ERR_UNEXPECTED,
"%1%: not a DirectMeter, see declaration of %2%",
302 auto meterName = EBPF::EBPFObject::externalName(di);
303 auto tblname = table->table->container->name.originalName;
304 auto met =
new EBPFMeterPNA(table->program, meterName, tblname, di, table->codeGen);
305 table->meters.emplace_back(std::make_pair(meterName, met));
309 void visitTableProperty() {
310 EBPF::EBPFTablePsaPropertyVisitor::visitTableProperty(
"pna_direct_meter"_cs);
319 const IR::Type *ltype,
const IR::Expression *lexpr,
320 const IR::Expression *rexpr)
const;
Definition ebpfPsaHashAlgorithm.h:64
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfPsaChecksum.h:15
Definition ebpfPsaCounter.h:16
Definition ebpfPsaDigest.h:18
Definition ebpfPsaHashAlgorithm.h:16
Definition ebpfPsaMeter.h:16
Definition ebpfProgram.h:30
Definition ebpfPsaRandom.h:15
Also used to represent counters.
Definition ebpfTable.h:49
Definition ebpfPsaTable.h:19
Definition ebpfPsaTable.h:113
Base class for EBPF types.
Definition ebpfType.h:29
Definition methodInstance.h:168
void emitVariables(EBPF::CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition tcExterns.cpp:525
Definition ebpfCodeGen.h:399
Definition tc/backend.h:319
Definition tcExterns.h:20
Definition tcExterns.h:261
void emitVariables(EBPF::CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition tcExterns.cpp:206
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:17
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58
T * to() noexcept
Definition rtti.h:226