17#ifndef BACKENDS_BMV2_COMMON_HELPERS_H_
18#define BACKENDS_BMV2_COMMON_HELPERS_H_
20#include "JsonObjects.h"
21#include "backends/common/programStructure.h"
22#include "controlFlowGraph.h"
23#include "expression.h"
24#include "frontends/common/model.h"
25#include "frontends/p4/fromv1.0/v1model.h"
27#include "lib/cstring.h"
29#include "lib/ordered_map.h"
36#define UNUSED __attribute__((__unused__))
42 static const cstring rangeMatchTypeName;
43 static const cstring optionalMatchTypeName;
48 static const unsigned defaultTableSize;
53 static const cstring jsonMetadataParameterName;
62enum class BlockConverted {
82enum class Arch { V1MODEL, PSA, V1MODEL2020 };
91 static const cstring name() {
return "action profile"_cs; }
92 static const cstring propertyName() {
93 return P4V1::V1Model::instance.tableAttributes.tableImplementation.name;
95 static const cstring typeName() {
return P4V1::V1Model::instance.action_profile.name; }
96 static const cstring sizeParamName() {
return "size"_cs; }
104 static const cstring name() {
return "action profile"_cs; }
105 static const cstring propertyName() {
return "implementation"_cs; }
106 static const cstring typeName() {
return "ActionProfile"_cs; }
107 static const cstring sizeParamName() {
return "size"_cs; }
117 static const cstring name() {
return "action selector"_cs; }
118 static const cstring typeName() {
return P4V1::V1Model::instance.action_selector.name; }
126 static const cstring name() {
return "action selector"_cs; }
127 static const cstring typeName() {
return "ActionSelector"_cs; }
136 static const cstring name() {
return "register"_cs; }
137 static const cstring typeName() {
return P4V1::V1Model::instance.registers.name; }
138 static const cstring sizeParamName() {
return "size"_cs; }
142 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
147 static std::optional<size_t> indexTypeParamIdx() {
return 1; }
152 static const cstring name() {
return "register"_cs; }
153 static const cstring typeName() {
return "Register"_cs; }
154 static const cstring sizeParamName() {
return "size"_cs; }
155 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; }
228 static const cstring name() {
return "meter"_cs; }
229 static const cstring directPropertyName() {
230 return P4V1::V1Model::instance.tableAttributes.meters.name;
232 static const cstring typeName() {
return P4V1::V1Model::instance.meter.name; }
233 static const cstring directTypeName() {
return P4V1::V1Model::instance.directMeter.name; }
234 static const cstring sizeParamName() {
return "size"_cs; }
235 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
240 static const cstring name() {
return "meter"_cs; }
241 static const cstring directPropertyName() {
242 return P4V1::V1Model::instance.tableAttributes.meters.name;
244 static const cstring typeName() {
return P4V1::V1Model::instance.meter.name; }
245 static const cstring directTypeName() {
return P4V1::V1Model::instance.directMeter.name; }
246 static const cstring sizeParamName() {
return "size"_cs; }
247 static std::optional<size_t> indexTypeParamIdx() {
return 0; }
253 static const cstring name() {
return "meter"_cs; }
254 static const cstring directPropertyName() {
return "psa_direct_meter"_cs; }
255 static const cstring typeName() {
return "Meter"_cs; }
256 static const cstring directTypeName() {
return "DirectMeter"_cs; }
257 static const cstring sizeParamName() {
return "n_meters"_cs; }
265using BlockTypeMap = std::map<const IR::Block *, const IR::Type *>;
278 const IR::ToplevelBlock *toplevel;
291 std::map<const IR::Declaration_Instance *, SelectorInput> selector_input_map;
293 const SelectorInput *get_selector_input(
const IR::Declaration_Instance *selector) {
294 auto it = selector_input_map.find(selector);
295 if (it == selector_input_map.end())
return nullptr;
311 int createFieldList(
const IR::Expression *expr,
cstring listName,
bool learn =
false);
312 cstring createCalculation(
cstring algo,
const IR::Expression *fields,
314 static void modelError(
const char *format,
const IR::Node *place);
322cstring stringRepr(big_int value,
unsigned bytes = 0);
Definition expression.h:51
Definition JsonObjects.h:27
static const cstring selectorMatchTypeName
constant definition for bmv2
Definition helpers.h:41
static const cstring validField
Definition helpers.h:58
Definition backends/common/programStructure.h:32
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition action.cpp:21
std::vector< const IR::Expression * > SelectorInput
Definition helpers.h:272
const IR::ListExpression * convertToList(const IR::Expression *expr, P4::TypeMap *typeMap)
Converts expr into a ListExpression or returns nullptr if not possible.
Definition helpers.cpp:184
BlockConverted blockConverted
Block currently being converted.
Definition helpers.h:280
ExpressionConverter * conv
Expression converter is used in many places.
Definition helpers.h:284
BMV2::JsonObjects * json
Final json output.
Definition helpers.h:286
P4::ProgramStructure * structure
ProgramStructure pointer.
Definition helpers.h:282
P4::ReferenceMap * refMap
context
Definition helpers.h:276
Util::JsonArray * action_profiles
For action profile conversion.
Definition helpers.h:289
static std::optional< size_t > indexTypeParamIdx()
Definition helpers.h:222
static std::optional< size_t > indexTypeParamIdx()
Definition helpers.h:260
static std::optional< size_t > indexTypeParamIdx()
Definition helpers.h:158
static size_t dataTypeParamIdx()
Definition helpers.h:141
Traits for the register extern, must be specialized for v1model and PSA.
Definition helpers.h:132