8#ifndef BACKENDS_BMV2_COMMON_HELPERS_H_
9#define BACKENDS_BMV2_COMMON_HELPERS_H_
11#include "JsonObjects.h"
12#include "backends/common/programStructure.h"
13#include "controlFlowGraph.h"
14#include "expression.h"
15#include "frontends/common/model.h"
16#include "frontends/p4-14/fromv1.0/v1model.h"
18#include "lib/cstring.h"
20#include "lib/ordered_map.h"
24using namespace P4::literals;
27#define UNUSED __attribute__((__unused__))
33 static const cstring rangeMatchTypeName;
34 static const cstring optionalMatchTypeName;
39 static const unsigned defaultTableSize;
44 static const cstring jsonMetadataParameterName;
53enum class BlockConverted {
73enum class Arch { V1MODEL, PSA, PNA, V1MODEL2020 };
82 static const cstring name() {
return "action profile"_cs; }
83 static const cstring propertyName() {
84 return P4V1::V1Model::instance.tableAttributes.tableImplementation.name;
86 static const cstring typeName() {
return P4V1::V1Model::instance.action_profile.name; }
87 static const cstring sizeParamName() {
return "size"_cs; }
95 static const cstring name() {
return "action profile"_cs; }
96 static const cstring propertyName() {
return "implementation"_cs; }
97 static const cstring typeName() {
return "ActionProfile"_cs; }
98 static const cstring sizeParamName() {
return "size"_cs; }
111 static const cstring name() {
return "action selector"_cs; }
112 static const cstring typeName() {
return P4V1::V1Model::instance.action_selector.name; }
120 static const cstring name() {
return "action selector"_cs; }
121 static const cstring typeName() {
return "ActionSelector"_cs; }
133 static const cstring name() {
return "register"_cs; }
134 static const cstring typeName() {
return P4V1::V1Model::instance.registers.name; }
135 static const cstring sizeParamName() {
return "size"_cs; }
139 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
144 static std::optional<size_t> indexTypeParamIdx() {
return 1; }
149 static const cstring name() {
return "register"_cs; }
150 static const cstring typeName() {
return "Register"_cs; }
151 static const cstring sizeParamName() {
return "size"_cs; }
152 static size_t dataTypeParamIdx() {
return 0; }
170template <
typename Kind>
190 static const cstring name() {
return "counter"_cs; }
191 static const cstring directPropertyName() {
192 return P4V1::V1Model::instance.tableAttributes.counters.name;
194 static const cstring typeName() {
return P4V1::V1Model::instance.counter.name; }
195 static const cstring directTypeName() {
return P4V1::V1Model::instance.directCounter.name; }
196 static const cstring sizeParamName() {
return "size"_cs; }
197 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
202 static const cstring name() {
return "counter"_cs; }
203 static const cstring directPropertyName() {
204 return P4V1::V1Model::instance.tableAttributes.counters.name;
206 static const cstring typeName() {
return P4V1::V1Model::instance.counter.name; }
207 static const cstring directTypeName() {
return P4V1::V1Model::instance.directCounter.name; }
208 static const cstring sizeParamName() {
return "size"_cs; }
209 static std::optional<size_t> indexTypeParamIdx() {
return 0; }
215 static const cstring name() {
return "counter"_cs; }
216 static const cstring directPropertyName() {
return "psa_direct_counter"_cs; }
217 static const cstring typeName() {
return "Counter"_cs; }
218 static const cstring directTypeName() {
return "DirectCounter"_cs; }
219 static const cstring sizeParamName() {
return "n_counters"_cs; }
229 static const cstring directPropertyName() {
return "pna_direct_counter"_cs; }
235 static const cstring name() {
return "meter"_cs; }
236 static const cstring directPropertyName() {
237 return P4V1::V1Model::instance.tableAttributes.meters.name;
239 static const cstring typeName() {
return P4V1::V1Model::instance.meter.name; }
240 static const cstring directTypeName() {
return P4V1::V1Model::instance.directMeter.name; }
241 static const cstring sizeParamName() {
return "size"_cs; }
242 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
247 static const cstring name() {
return "meter"_cs; }
248 static const cstring directPropertyName() {
249 return P4V1::V1Model::instance.tableAttributes.meters.name;
251 static const cstring typeName() {
return P4V1::V1Model::instance.meter.name; }
252 static const cstring directTypeName() {
return P4V1::V1Model::instance.directMeter.name; }
253 static const cstring sizeParamName() {
return "size"_cs; }
254 static std::optional<size_t> indexTypeParamIdx() {
return 0; }
260 static const cstring name() {
return "meter"_cs; }
261 static const cstring directPropertyName() {
return "psa_direct_meter"_cs; }
262 static const cstring typeName() {
return "Meter"_cs; }
263 static const cstring directTypeName() {
return "DirectMeter"_cs; }
264 static const cstring sizeParamName() {
return "n_meters"_cs; }
274 static const cstring directPropertyName() {
return "pna_direct_meter"_cs; }
279using BlockTypeMap = std::map<const IR::Block *, const IR::Type *>;
288struct ConversionContext {
292 const IR::ToplevelBlock *toplevel;
305 std::map<const IR::Declaration_Instance *, SelectorInput> selector_input_map;
307 const SelectorInput *get_selector_input(
const IR::Declaration_Instance *selector) {
308 auto it = selector_input_map.find(selector);
309 if (it == selector_input_map.end())
return nullptr;
325 int createFieldList(
const IR::Expression *expr,
cstring listName,
bool learn =
false);
326 cstring createCalculation(
cstring algo,
const IR::Expression *fields,
328 static void modelError(
const char *format,
const IR::Node *place);
336cstring stringRepr(big_int value,
unsigned bytes = 0);
Definition expression.h:42
Definition JsonObjects.h:17
Definition bmv2/common/helpers.h:30
static const cstring selectorMatchTypeName
constant definition for bmv2
Definition bmv2/common/helpers.h:32
Definition bmv2/common/helpers.h:37
Definition bmv2/common/helpers.h:42
static const cstring validField
Definition bmv2/common/helpers.h:49
Definition backends/common/programStructure.h:23
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition lib/json.h:128
Definition lib/json.h:177
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition action.cpp:9
std::vector< const IR::Expression * > SelectorInput
Definition bmv2/common/helpers.h:286
const IR::ListExpression * convertToList(const IR::Expression *expr, P4::TypeMap *typeMap)
Converts expr into a ListExpression or returns nullptr if not possible.
Definition bmv2/common/helpers.cpp:173
Definition tofino/bf-p4c/control-plane/bfruntime_arch_handler.h:77
Definition bmv2/common/helpers.h:288
ExpressionConverter * conv
Expression converter is used in many places.
Definition bmv2/common/helpers.h:298
P4::ReferenceMap * refMap
context
Definition bmv2/common/helpers.h:290
P4::ProgramStructure * structure
ProgramStructure pointer.
Definition bmv2/common/helpers.h:296
BlockConverted blockConverted
Block currently being converted.
Definition bmv2/common/helpers.h:294
Util::JsonArray * action_profiles
For action profile conversion.
Definition bmv2/common/helpers.h:303
static std::optional< size_t > indexTypeParamIdx()
Definition bmv2/common/helpers.h:222
static std::optional< size_t > indexTypeParamIdx()
Definition bmv2/common/helpers.h:267
Definition bmv2/common/helpers.h:171
Definition bmv2/common/helpers.h:78
Definition bmv2/common/helpers.h:107
Definition bmv2/common/helpers.h:162
Definition bmv2/common/helpers.h:164
static std::optional< size_t > indexTypeParamIdx()
Definition bmv2/common/helpers.h:155
static size_t dataTypeParamIdx()
Definition bmv2/common/helpers.h:138
Traits for the register extern, must be specialized for v1model and PSA.
Definition bmv2/common/helpers.h:129