17#ifndef BACKENDS_BMV2_COMMON_HELPERS_H_
18#define BACKENDS_BMV2_COMMON_HELPERS_H_
20#include "JsonObjects.h"
21#include "controlFlowGraph.h"
22#include "expression.h"
23#include "frontends/common/model.h"
24#include "frontends/p4/fromv1.0/v1model.h"
26#include "lib/cstring.h"
28#include "lib/ordered_map.h"
29#include "programStructure.h"
34#define UNUSED __attribute__((__unused__))
40 static const cstring rangeMatchTypeName;
41 static const cstring optionalMatchTypeName;
46 static const unsigned defaultTableSize;
51 static const cstring jsonMetadataParameterName;
69enum class Arch { V1MODEL, PSA, V1MODEL2020 };
78 static const cstring name() {
return "action profile"; }
79 static const cstring propertyName() {
80 return P4V1::V1Model::instance.tableAttributes.tableImplementation.name;
82 static const cstring typeName() {
return P4V1::V1Model::instance.action_profile.name; }
83 static const cstring sizeParamName() {
return "size"; }
91 static const cstring name() {
return "action profile"; }
92 static const cstring propertyName() {
return "implementation"; }
93 static const cstring typeName() {
return "ActionProfile"; }
94 static const cstring sizeParamName() {
return "size"; }
104 static const cstring name() {
return "action selector"; }
105 static const cstring typeName() {
return P4V1::V1Model::instance.action_selector.name; }
113 static const cstring name() {
return "action selector"; }
114 static const cstring typeName() {
return "ActionSelector"; }
123 static const cstring name() {
return "register"; }
124 static const cstring typeName() {
return P4V1::V1Model::instance.registers.name; }
125 static const cstring sizeParamName() {
return "size"; }
128 static size_t dataTypeParamIdx() {
return 0; }
129 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
134 static std::optional<size_t> indexTypeParamIdx() {
return 1; }
139 static const cstring name() {
return "register"; }
140 static const cstring typeName() {
return "Register"; }
141 static const cstring sizeParamName() {
return "size"; }
142 static size_t dataTypeParamIdx() {
return 0; }
145 static std::optional<size_t> indexTypeParamIdx() {
return 1; }
157template <
typename Kind>
177 static const cstring name() {
return "counter"; }
178 static const cstring directPropertyName() {
179 return P4V1::V1Model::instance.tableAttributes.counters.name;
181 static const cstring typeName() {
return P4V1::V1Model::instance.counter.name; }
182 static const cstring directTypeName() {
return P4V1::V1Model::instance.directCounter.name; }
183 static const cstring sizeParamName() {
return "size"; }
184 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
189 static const cstring name() {
return "counter"; }
190 static const cstring directPropertyName() {
191 return P4V1::V1Model::instance.tableAttributes.counters.name;
193 static const cstring typeName() {
return P4V1::V1Model::instance.counter.name; }
194 static const cstring directTypeName() {
return P4V1::V1Model::instance.directCounter.name; }
195 static const cstring sizeParamName() {
return "size"; }
196 static std::optional<size_t> indexTypeParamIdx() {
return 0; }
202 static const cstring name() {
return "counter"; }
203 static const cstring directPropertyName() {
return "psa_direct_counter"; }
204 static const cstring typeName() {
return "Counter"; }
205 static const cstring directTypeName() {
return "DirectCounter"; }
206 static const cstring sizeParamName() {
return "n_counters"; }
209 static std::optional<size_t> indexTypeParamIdx() {
return 1; }
215 static const cstring name() {
return "meter"; }
216 static const cstring directPropertyName() {
217 return P4V1::V1Model::instance.tableAttributes.meters.name;
219 static const cstring typeName() {
return P4V1::V1Model::instance.meter.name; }
220 static const cstring directTypeName() {
return P4V1::V1Model::instance.directMeter.name; }
221 static const cstring sizeParamName() {
return "size"; }
222 static std::optional<size_t> indexTypeParamIdx() {
return std::nullopt; }
227 static const cstring name() {
return "meter"; }
228 static const cstring directPropertyName() {
229 return P4V1::V1Model::instance.tableAttributes.meters.name;
231 static const cstring typeName() {
return P4V1::V1Model::instance.meter.name; }
232 static const cstring directTypeName() {
return P4V1::V1Model::instance.directMeter.name; }
233 static const cstring sizeParamName() {
return "size"; }
234 static std::optional<size_t> indexTypeParamIdx() {
return 0; }
240 static const cstring name() {
return "meter"; }
241 static const cstring directPropertyName() {
return "psa_direct_meter"; }
242 static const cstring typeName() {
return "Meter"; }
243 static const cstring directTypeName() {
return "DirectMeter"; }
244 static const cstring sizeParamName() {
return "n_meters"; }
247 static std::optional<size_t> indexTypeParamIdx() {
return 0; }
252using BlockTypeMap = std::map<const IR::Block *, const IR::Type *>;
259using SelectorInput = std::vector<const IR::Expression *>;
265 const IR::ToplevelBlock *toplevel;
267 BlockConverted blockConverted;
278 std::map<const IR::Declaration_Instance *, SelectorInput> selector_input_map;
280 const SelectorInput *get_selector_input(
const IR::Declaration_Instance *selector) {
281 auto it = selector_input_map.find(selector);
282 if (it == selector_input_map.end())
return nullptr;
292 blockConverted(BlockConverted::None),
293 structure(structure),
298 int createFieldList(
const IR::Expression *expr,
cstring listName,
bool learn =
false);
301 static void modelError(
const char *
format,
const IR::Node *
place);
309cstring stringRepr(big_int value,
unsigned bytes = 0);
312const IR::ListExpression *convertToList(
const IR::Expression *expr,
P4::TypeMap *typeMap);
Definition controlFlowGraph.h:60
Definition expression.h:53
Definition JsonObjects.h:27
static const cstring selectorMatchTypeName
constant definition for bmv2
Definition helpers.h:39
Definition programStructure.h:40
Definition sharedActionSelectorCheck.h:40
static const cstring validField
Definition helpers.h:56
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Traits for the register extern, must be specialized for v1model and PSA.
Definition helpers.h:119