20 const IR::P4Action *action;
28 valueName(valueName) {
32 bool preorder(
const IR::PathExpression *expression);
34 bool preorder(
const IR::P4Action *act);
35 virtual cstring getParamInstanceName(
const IR::Expression *expression)
const;
36 bool isActionParameter(
const IR::PathExpression *expression)
const;
52 : program(program), instanceName(instanceName), codeGen(codeGen) {
55 keyTypeName = instanceName +
"_key";
56 valueTypeName = instanceName +
"_value";
57 dataMapName = instanceName;
63class EBPFTable :
public EBPFTableBase {
64 const int prefixLenFieldWidth = 32;
70 bool isTernaryTable()
const;
82 const IR::Key *keyGenerator;
83 const IR::ActionList *actionList;
84 const IR::TableBlock *table;
86 std::map<const IR::KeyElement *, cstring> keyFieldNames;
87 std::map<const IR::KeyElement *, EBPFType *> keyTypes;
91 const cstring prefixFieldName =
"prefixlen"_cs;
96 cstring p4ActionToActionIDName(
const IR::P4Action *action)
const;
97 void emitActionArguments(
CodeBuilder *builder,
const IR::P4Action *action,
cstring name);
104 virtual void emitValueActionIDNames(
CodeBuilder *builder);
105 virtual void emitValueStructStructure(
CodeBuilder *builder);
109 virtual void emitInitializer(
CodeBuilder *builder);
113 (void)actionRunVariable;
114 builder->target->emitTableLookup(builder, defaultActionMapName, key, value);
115 builder->endOfStatement(
true);
117 virtual bool isMatchTypeSupported(
const IR::Declaration_ID *matchType) {
118 return matchType->name.name == P4::P4CoreLibrary::instance().exactMatch.name ||
119 matchType->name.name == P4::P4CoreLibrary::instance().ternaryMatch.name ||
120 matchType->name.name == P4::P4CoreLibrary::instance().lpmMatch.name;
126 virtual bool cacheEnabled() {
return false; }
127 virtual void emitCacheLookup(CodeBuilder *builder,
cstring key,
cstring value) {
132 virtual void emitCacheUpdate(CodeBuilder *builder, cstring key, cstring value) {
138 DECLARE_TYPEINFO(EBPFTable, EBPFTableBase);
141class EBPFCounterTable :
public EBPFTableBase {
147 EBPFCounterTable(
const EBPFProgram *program,
const IR::ExternBlock *block,
cstring name,
150 size_t size,
bool isHash)
151 : EBPFTableBase(program, name, codeGen), size(size), isHash(isHash) {}
154 virtual void emitCounterIncrement(
CodeBuilder *builder,
155 const IR::MethodCallExpression *expression);
156 virtual void emitCounterAdd(
CodeBuilder *builder,
const IR::MethodCallExpression *expression);
159 DECLARE_TYPEINFO(EBPFCounterTable, EBPFTableBase);