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