8#ifndef BACKENDS_BMV2_SIMPLE_SWITCH_SIMPLESWITCH_H_
9#define BACKENDS_BMV2_SIMPLE_SWITCH_SIMPLESWITCH_H_
14#include "backends/bmv2/common/action.h"
15#include "backends/bmv2/common/backend.h"
16#include "backends/bmv2/common/control.h"
17#include "backends/bmv2/common/deparser.h"
18#include "backends/bmv2/common/extern.h"
19#include "backends/bmv2/common/globals.h"
20#include "backends/bmv2/common/header.h"
21#include "backends/bmv2/common/options.h"
22#include "backends/bmv2/common/parser.h"
23#include "backends/bmv2/common/sharedActionSelectorCheck.h"
24#include "backends/common/programStructure.h"
25#include "frontends/common/constantFolding.h"
26#include "frontends/p4/evaluator/evaluator.h"
27#include "frontends/p4/simplify.h"
28#include "frontends/p4/unusedDeclarations.h"
29#include "midend/convertEnums.h"
35 std::set<cstring> pipeline_controls;
36 std::set<cstring> non_pipeline_controls;
38 const IR::P4Parser *parser =
nullptr;
39 const IR::P4Control *ingress =
nullptr;
40 const IR::P4Control *egress =
nullptr;
41 const IR::P4Control *compute_checksum =
nullptr;
42 const IR::P4Control *verify_checksum =
nullptr;
43 const IR::P4Control *deparser =
nullptr;
45 V1ProgramStructure() {}
46 BlockConverted blockKind(
const IR::Node *node)
const {
48 return BlockConverted::Parser;
49 else if (node == ingress)
50 return BlockConverted::Ingress;
51 else if (node == egress)
52 return BlockConverted::Egress;
53 else if (node == compute_checksum)
54 return BlockConverted::ChecksumCompute;
55 else if (node == verify_checksum)
56 return BlockConverted::ChecksumVerify;
57 else if (node == deparser)
58 return BlockConverted::Deparser;
59 return BlockConverted::None;
63class SimpleSwitchExpressionConverter :
public ExpressionConverter {
69 : ExpressionConverter(refMap, typeMap, structure, scalarsName), structure(structure) {}
71 void modelError(
const char *format,
const IR::Node *node) {
73 "\nAre you using an up-to-date v1model.p4?", node);
76 bool isStandardMetadataParameter(
const IR::Parameter *param) {
77 auto params = structure->parser->getApplyParameters();
78 if (params->size() != 4) {
79 modelError(
"%1%: Expected 4 parameter for parser", structure->parser);
82 if (params->parameters.at(3) == param)
return true;
84 params = structure->ingress->getApplyParameters();
85 if (params->size() != 3) {
86 modelError(
"%1%: Expected 3 parameter for ingress", structure->ingress);
89 if (params->parameters.at(2) == param)
return true;
91 params = structure->egress->getApplyParameters();
92 if (params->size() != 3) {
93 modelError(
"%1%: Expected 3 parameter for egress", structure->egress);
96 if (params->parameters.at(2) == param)
return true;
102 if (isStandardMetadataParameter(param)) {
104 if (fieldName !=
"") {
105 result->emplace(
"type",
"field");
106 auto e = BMV2::mkArrayField(result,
"value"_cs);
107 e->append(
"standard_metadata");
108 e->append(fieldName);
110 result->emplace(
"type",
"header");
111 result->emplace(
"value",
"standard_metadata");
119class ParseV1Architecture :
public Inspector {
125 : structure(structure), v1model(P4V1::V1Model::instance()) {}
126 void modelError(
const char *format,
const IR::Node *node);
127 bool preorder(
const IR::PackageBlock *block)
override;
130class SimpleSwitchBackend :
public Backend {
137 void createRecirculateFieldsList(
ConversionContext *ctxt,
const IR::ToplevelBlock *tlb,
139 cstring createCalculation(
cstring algo,
const IR::Expression *fields,
143 void modelError(
const char *format,
const IR::Node *place)
const;
144 void convertChecksum(
const IR::BlockStatement *body,
Util::JsonArray *checksums,
148 void convert(
const IR::ToplevelBlock *tlb)
override;
150 P4::ConvertEnums::EnumMapping *enumMap)
151 : Backend(options, refMap, typeMap, enumMap),
153 v1model(P4V1::V1Model::instance()) {}
156EXTERN_CONVERTER_W_FUNCTION(clone)
157EXTERN_CONVERTER_W_FUNCTION(clone_preserving_field_list)
158EXTERN_CONVERTER_W_FUNCTION_AND_MODEL(hash,
P4V1::V1Model, v1model)
159EXTERN_CONVERTER_W_FUNCTION(digest)
160EXTERN_CONVERTER_W_FUNCTION(resubmit_preserving_field_list)
161EXTERN_CONVERTER_W_FUNCTION(recirculate_preserving_field_list)
162EXTERN_CONVERTER_W_FUNCTION(mark_to_drop)
163EXTERN_CONVERTER_W_FUNCTION(log_msg)
164EXTERN_CONVERTER_W_FUNCTION_AND_MODEL(random,
P4V1::V1Model, v1model)
165EXTERN_CONVERTER_W_FUNCTION_AND_MODEL(truncate,
P4V1::V1Model, v1model)
166EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE_AND_MODEL(
register,
P4V1::V1Model, v1model)
167EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE_AND_MODEL(counter,
P4V1::V1Model, v1model)
168EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE_AND_MODEL(meter,
P4V1::V1Model, v1model)
169EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE(direct_counter)
170EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE_AND_MODEL(direct_meter,
P4V1::V1Model, v1model)
171EXTERN_CONVERTER_W_INSTANCE_AND_MODEL(action_profile,
P4V1::V1Model, v1model)
172EXTERN_CONVERTER_W_INSTANCE_AND_MODEL(action_selector,
P4V1::V1Model, v1model)
Definition backends/bmv2/common/options.h:18
Definition expression.h:42
void convert(const IR::ToplevelBlock *tlb) override
Definition simpleSwitch.cpp:1069
Util::IJson * convertParam(const IR::Parameter *param, cstring fieldName) override
Definition simpleSwitch.h:101
Definition simpleSwitch.h:33
Definition bmv2/common/v1model.h:253
Definition backends/common/programStructure.h:23
Class used to encode maps from paths to declarations.
Definition referenceMap.h:58
Definition lib/json.h:119
Definition lib/json.h:168
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition action.cpp:9
void errorWithSuffix(const int kind, const char *format, const char *suffix, const T *node, Args &&...args)
This is similar to the above method, but also has a suffix.
Definition lib/error.h:67
Definition bmv2/common/helpers.h:288