14#ifndef BACKENDS_TC_TCEXTERNS_H_
15#define BACKENDS_TC_TCEXTERNS_H_
21using namespace P4::literals;
27 const IR::Declaration_Instance *di;
31 EBPFCounterPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
34 this->tblname = tblname;
37 EBPFCounterPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
55 const IR::Type *keyArg;
56 const IR::Type *valueArg;
65 this->instanceName = di->toString();
66 if (!di->type->is<IR::Type_Specialized>()) {
67 ::P4::error(ErrorType::ERR_MODEL,
"Missing specialization: %1%", di);
70 auto ts = di->type->to<IR::Type_Specialized>();
72 if (ts->arguments->size() != PARAM_INDEX_2) {
73 ::P4::error(ErrorType::ERR_MODEL,
"Expected a type specialized with two arguments: %1%",
78 this->valueArg = ts->arguments->at(0);
79 this->keyArg = ts->arguments->at(1);
81 this->keyType = EBPF::EBPFTypeFactory::instance->create(keyArg);
82 this->valueType = EBPF::EBPFTypeFactory::instance->create(valueArg);
86 const IR::Expression *leftExpression);
98 bool preorder(
const IR::PathExpression *pe)
override {
99 auto decl = table->program->refMap->getDeclaration(pe->path,
true);
100 auto di = decl->to<IR::Declaration_Instance>();
102 if (EBPF::EBPFObject::getSpecializedTypeName(di) !=
"DirectCounter") {
104 "%1%: not a DirectCounter, see declaration of %2%", pe, decl);
107 auto counterName = EBPF::EBPFObject::externalName(di);
108 auto tblname = table->table->container->name.originalName;
109 auto ctr =
new EBPFCounterPNA(table->program, di, counterName, table->codeGen, tblname);
110 table->counters.emplace_back(std::make_pair(counterName, ctr));
114 void visitTableProperty() {
115 EBPF::EBPFTablePsaPropertyVisitor::visitTableProperty(
"pna_direct_counter"_cs);
124 void updateChecksum(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments,
bool addData);
133 void emitAddData(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments)
override;
136 void emitSubtractData(
EBPF::CodeBuilder *builder,
const ArgumentsList &arguments)
override;
140 const IR::MethodCallExpression *expr)
override;
141 cstring getConvertByteOrderFunction(
unsigned widthToEmit,
cstring byte_order);
150 EBPFChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
153 auto di = block->
to<IR::Declaration_Instance>();
154 if (di->arguments->size() != 1) {
155 ::P4::error(ErrorType::ERR_UNEXPECTED,
"Expected exactly 1 argument %1%", block);
158 int type = di->arguments->at(0)->expression->checkedTo<IR::Constant>()->asInt();
159 init(program, name, type);
162 EBPFChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
165 init(program, name, type);
169class EBPFInternetChecksumPNA :
public EBPFChecksumPNA {
171 EBPFInternetChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
173 : EBPFChecksumPNA(program, block, name,
174 EBPF::EBPFHashAlgorithmPSA::HashAlgorithm::ONES_COMPLEMENT16) {}
177 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
185 EBPFHashPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
188 auto di = block->
to<IR::Declaration_Instance>();
189 if (di->arguments->size() != 1) {
190 ::P4::error(ErrorType::ERR_UNEXPECTED,
"Expected exactly 1 argument %1%", block);
193 int type = di->arguments->at(0)->expression->checkedTo<IR::Constant>()->asInt();
194 init(program, name, type);
197 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
198 void calculateHash(
EBPF::CodeBuilder *builder,
const IR::MethodCallExpression *expr,
203class EBPFCRCChecksumPNA :
public EBPFChecksumPNA {
205 EBPFCRCChecksumPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *block,
207 : EBPFChecksumPNA(program, block, name) {}
210 const IR::MethodCallExpression *expr,
Visitor *visitor)
override;
221 BUG_CHECK(width == 16 || width == 32,
"Must be 16 bits width or 32 bits width.");
222 initialValue =
"0"_cs;
226 const IR::MethodCallExpression *expr);
228 const IR::MethodCallExpression *expr)
override;
237 BUG_CHECK(width == 16 || width == 32,
"Must be 16 bits width or 32 bits width.");
238 initialValue =
"0"_cs;
242 const IR::MethodCallExpression *expr);
244 const IR::MethodCallExpression *expr)
override;
254 EBPFDigestPNA(
const EBPF::EBPFProgram *program,
const IR::Declaration_Instance *di,
258 this->externName = externName;
259 this->instanceName = di->toString();
275 this->instanceName = di->toString();
280 this->tblname = tblname;
281 this->instanceName = di->toString();
285 const IR::Expression *leftExpression)
const;
288 const IR::Expression *leftExpression)
const;
298 bool preorder(
const IR::PathExpression *pe)
override {
299 auto decl = table->program->refMap->getDeclaration(pe->path,
true);
300 auto di = decl->to<IR::Declaration_Instance>();
302 if (EBPF::EBPFObject::getTypeName(di) !=
"DirectMeter") {
303 ::P4::error(ErrorType::ERR_UNEXPECTED,
"%1%: not a DirectMeter, see declaration of %2%",
308 auto meterName = EBPF::EBPFObject::externalName(di);
309 auto tblname = table->table->container->name.originalName;
310 auto met =
new EBPFMeterPNA(table->program, meterName, tblname, di, table->codeGen);
311 table->meters.emplace_back(std::make_pair(meterName, met));
315 void visitTableProperty() {
316 EBPF::EBPFTablePsaPropertyVisitor::visitTableProperty(
"pna_direct_meter"_cs);
325 const IR::Type *ltype,
const IR::Expression *lexpr,
326 const IR::Expression *rexpr)
const;
Definition ebpfPsaHashAlgorithm.h:74
Definition ebpf/codeGen.h:33
Definition ebpf/codeGen.h:41
Definition ebpfPsaChecksum.h:25
Definition ebpfPsaCounter.h:26
Definition ebpfPsaDigest.h:27
Definition ebpfPsaHashAlgorithm.h:26
Definition ebpfPsaMeter.h:23
Definition ebpfProgram.h:39
Definition ebpfPsaRandom.h:22
Also used to represent counters.
Definition ebpfTable.h:49
Definition ebpfPsaTable.h:29
Definition ebpfPsaTable.h:123
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:536
Definition ebpfCodeGen.h:408
Definition tc/backend.h:328
Definition tcExterns.h:26
Definition tcExterns.h:267
void emitVariables(EBPF::CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition tcExterns.cpp:217
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:28
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