29 const IR::P4Action *action;
37 valueName(valueName) {
41 bool preorder(
const IR::PathExpression *expression);
43 bool preorder(
const IR::P4Action *act);
44 virtual cstring getParamInstanceName(
const IR::Expression *expression)
const;
45 bool isActionParameter(
const IR::PathExpression *expression)
const;
61 : program(program), instanceName(instanceName), codeGen(codeGen) {
64 keyTypeName = instanceName +
"_key";
65 valueTypeName = instanceName +
"_value";
66 dataMapName = instanceName;
72class EBPFTable :
public EBPFTableBase {
73 const int prefixLenFieldWidth = 32;
79 bool isTernaryTable()
const;
91 const IR::Key *keyGenerator;
92 const IR::ActionList *actionList;
93 const IR::TableBlock *table;
95 std::map<const IR::KeyElement *, cstring> keyFieldNames;
96 std::map<const IR::KeyElement *, EBPFType *> keyTypes;
100 const cstring prefixFieldName =
"prefixlen"_cs;
105 cstring p4ActionToActionIDName(
const IR::P4Action *action)
const;
106 void emitActionArguments(
CodeBuilder *builder,
const IR::P4Action *action,
cstring name);
113 virtual void emitValueActionIDNames(
CodeBuilder *builder);
114 virtual void emitValueStructStructure(
CodeBuilder *builder);
118 virtual void emitInitializer(
CodeBuilder *builder);
122 (void)actionRunVariable;
123 builder->target->emitTableLookup(builder, defaultActionMapName, key, value);
124 builder->endOfStatement(
true);
126 virtual bool isMatchTypeSupported(
const IR::Declaration_ID *matchType) {
127 return matchType->name.name == P4::P4CoreLibrary::instance().exactMatch.name ||
128 matchType->name.name == P4::P4CoreLibrary::instance().ternaryMatch.name ||
129 matchType->name.name == P4::P4CoreLibrary::instance().lpmMatch.name;
135 virtual bool cacheEnabled() {
return false; }
136 virtual void emitCacheLookup(CodeBuilder *builder,
cstring key,
cstring value) {
141 virtual void emitCacheUpdate(CodeBuilder *builder, cstring key, cstring value) {
147 DECLARE_TYPEINFO(EBPFTable, EBPFTableBase);
150class EBPFCounterTable :
public EBPFTableBase {
156 EBPFCounterTable(
const EBPFProgram *program,
const IR::ExternBlock *block,
cstring name,
159 size_t size,
bool isHash)
160 : EBPFTableBase(program, name, codeGen), size(size), isHash(isHash) {}
163 virtual void emitCounterIncrement(
CodeBuilder *builder,
164 const IR::MethodCallExpression *expression);
165 virtual void emitCounterAdd(
CodeBuilder *builder,
const IR::MethodCallExpression *expression);
168 DECLARE_TYPEINFO(EBPFCounterTable, EBPFTableBase);