14#ifndef BACKENDS_TC_TCEXTERNS_H_ 
   15#define BACKENDS_TC_TCEXTERNS_H_ 
   18#include "ebpfCodeGen.h" 
   22using namespace P4::literals;
 
   28    const IR::Declaration_Instance *di;
 
   32    EBPFCounterPNA(
const EBPF::EBPFProgram *program, 
const IR::Declaration_Instance *di,
 
   35        this->tblname = tblname;
 
   38    EBPFCounterPNA(
const EBPF::EBPFProgram *program, 
const IR::Declaration_Instance *di,
 
 
   56    const IR::Type *keyArg;
 
   57    const IR::Type *valueArg;
 
   66        this->instanceName = di->toString();
 
   67        if (!di->type->is<IR::Type_Specialized>()) {
 
   68            ::P4::error(ErrorType::ERR_MODEL, 
"Missing specialization: %1%", di);
 
   71        auto ts = di->type->to<IR::Type_Specialized>();
 
   73        if (ts->arguments->size() != PARAM_INDEX_2) {
 
   74            ::P4::error(ErrorType::ERR_MODEL, 
"Expected a type specialized with two arguments: %1%",
 
   79        this->valueArg = ts->arguments->at(0);
 
   80        this->keyArg = ts->arguments->at(1);
 
   82        this->keyType = EBPF::EBPFTypeFactory::instance->create(keyArg);
 
   83        this->valueType = EBPF::EBPFTypeFactory::instance->create(valueArg);
 
   87                          const IR::Expression *leftExpression);
 
 
   99    bool preorder(
const IR::PathExpression *pe)
 override {
 
  100        auto decl = table->program->refMap->getDeclaration(pe->path, 
true);
 
  101        auto di = decl->to<IR::Declaration_Instance>();
 
  103        if (EBPF::EBPFObject::getSpecializedTypeName(di) != 
"DirectCounter") {
 
  105                        "%1%: not a DirectCounter, see declaration of %2%", pe, decl);
 
  108        auto counterName = EBPF::EBPFObject::externalName(di);
 
  109        auto tblname = table->table->container->name.originalName;
 
  110        auto ctr = 
new EBPFCounterPNA(table->program, di, counterName, table->codeGen, tblname);
 
  111        table->counters.emplace_back(std::make_pair(counterName, ctr));
 
  115    void visitTableProperty() {
 
  116        EBPF::EBPFTablePsaPropertyVisitor::visitTableProperty(
"pna_direct_counter"_cs);
 
 
  125    void updateChecksum(
EBPF::CodeBuilder *builder, 
const ArgumentsList &arguments, 
bool addData);
 
  134    void emitAddData(
EBPF::CodeBuilder *builder, 
const ArgumentsList &arguments) 
override;
 
  137    void emitSubtractData(
EBPF::CodeBuilder *builder, 
const ArgumentsList &arguments) 
override;
 
  141                              const IR::MethodCallExpression *expr) 
override;
 
  142    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;
 
 
  186    EBPFDigestPNA(
const EBPF::EBPFProgram *program, 
const IR::Declaration_Instance *di,
 
  190        this->externName = externName;
 
  191        this->instanceName = di->toString();
 
 
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 ebpfProgram.h:39
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:149
Definition ebpfCodeGen.h:358
Definition tc/backend.h:49
Definition tcExterns.h:27
void emitVariables(EBPF::CodeBuilder *builder, const IR::Declaration_Instance *decl) override
decl might be a null pointer
Definition tcExterns.cpp:215
This file defines functions for the pass to generate the introspection file.
Definition tc/backend.cpp:24
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition error.h:51
T * to() noexcept
Definition rtti.h:226