P4C
The P4 Compiler
Loading...
Searching...
No Matches
extern.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_BMV2_COMMON_EXTERN_H_
9#define BACKENDS_BMV2_COMMON_EXTERN_H_
10
11#include "backends/common/programStructure.h"
12#include "frontends/p4/methodInstance.h"
13#include "helpers.h"
14#include "ir/ir.h"
15
16namespace P4::BMV2 {
17
19 static std::map<cstring, ExternConverter *> *cvtForType;
20
21 public:
22 virtual ~ExternConverter() = default;
23 static void registerExternConverter(cstring, ExternConverter *);
24
25 virtual Util::IJson *convertExternObject(ConversionContext *ctxt, const P4::ExternMethod *em,
26 const IR::MethodCallExpression *mc,
27 const IR::StatOrDecl *s, const bool &emitExterns);
28 virtual void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c,
29 const IR::ExternBlock *eb, const bool &emitExterns);
30 virtual Util::IJson *convertExternFunction(ConversionContext *ctxt,
31 const P4::ExternFunction *ef,
32 const IR::MethodCallExpression *mc,
33 const IR::StatOrDecl *s, const bool emitExterns);
34
35 static ExternConverter *get(cstring type);
36 static ExternConverter *get(const IR::Type_Extern *type) { return get(type->name); }
37 static ExternConverter *get(const IR::ExternBlock *eb) { return get(eb->type); }
38 static ExternConverter *get(const P4::ExternFunction *ef) { return get(ef->method->name); }
39 static ExternConverter *get(const P4::ExternMethod *em) {
40 return get(em->originalExternType->name);
41 }
42
43 static Util::IJson *cvtExternObject(ConversionContext *ctxt, const P4::ExternMethod *em,
44 const IR::MethodCallExpression *mc, const IR::StatOrDecl *s,
45 const bool &emitExterns);
46 static void cvtExternInstance(ConversionContext *ctxt, const IR::Declaration *c,
47 const IR::ExternBlock *eb, const bool &emitExterns);
48 static Util::IJson *cvtExternFunction(ConversionContext *ctxt, const P4::ExternFunction *ef,
49 const IR::MethodCallExpression *mc,
50 const IR::StatOrDecl *s, const bool emitExterns);
51
52 // helper function for simple switch
53 void modelError(const char *format, const IR::Node *place) const;
54 void addToFieldList(ConversionContext *ctxt, const IR::Expression *expr, Util::JsonArray *fl);
55 int createFieldList(ConversionContext *ctxt, const IR::Expression *expr, cstring group,
56 cstring listName, Util::JsonArray *field_lists);
57 cstring createCalculation(ConversionContext *ctxt, cstring algo, const IR::Expression *fields,
58 Util::JsonArray *calculations, bool usePayload, const IR::Node *node);
59 static cstring convertHashAlgorithm(cstring algorithm);
60 Util::IJson *convertAssertAssume(ConversionContext *ctxt,
61 const IR::MethodCallExpression *methodCall,
62 const P4::ExternFunction *ef);
63};
64
65#define EXTERN_CONVERTER_W_FUNCTION_AND_MODEL(extern_name, model_type, model_name) \
66 class ExternConverter_##extern_name : public ExternConverter { \
67 model_type &model_name; \
68 ExternConverter_##extern_name() : model_name(model_type::instance) { \
69 registerExternConverter(cstring(#extern_name), this); \
70 } \
71 static ExternConverter_##extern_name singleton; \
72 Util::IJson *convertExternFunction(ConversionContext *ctxt, const P4::ExternFunction *ef, \
73 const IR::MethodCallExpression *mc, \
74 const IR::StatOrDecl *s, \
75 const bool emitExterns) override; \
76 };
77
78#define EXTERN_CONVERTER_W_FUNCTION(extern_name) \
79 class ExternConverter_##extern_name : public ExternConverter { \
80 ExternConverter_##extern_name() { registerExternConverter(cstring(#extern_name), this); } \
81 static ExternConverter_##extern_name singleton; \
82 Util::IJson *convertExternFunction(ConversionContext *ctxt, const P4::ExternFunction *ef, \
83 const IR::MethodCallExpression *mc, \
84 const IR::StatOrDecl *s, \
85 const bool emitExterns) override; \
86 };
87
88#define EXTERN_CONVERTER_W_INSTANCE_AND_MODEL(extern_name, model_type, model_name) \
89 class ExternConverter_##extern_name : public ExternConverter { \
90 model_type &model_name; \
91 ExternConverter_##extern_name() : model_name(model_type::instance) { \
92 registerExternConverter(cstring(#extern_name), this); \
93 } \
94 static ExternConverter_##extern_name singleton; \
95 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
96 const IR::ExternBlock *eb, const bool &emitExterns) override; \
97 };
98
99#define EXTERN_CONVERTER_W_INSTANCE(extern_name) \
100 class ExternConverter_##extern_name : public ExternConverter { \
101 ExternConverter_##extern_name() { registerExternConverter(cstring(#extern_name), this); } \
102 static ExternConverter_##extern_name singleton; \
103 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
104 const IR::ExternBlock *eb, const bool &emitExterns) override; \
105 };
106
107#define EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE_AND_MODEL(extern_name, type, name) \
108 class ExternConverter_##extern_name : public ExternConverter { \
109 type &name; \
110 ExternConverter_##extern_name() : name(type::instance) { \
111 registerExternConverter(cstring(#extern_name), this); \
112 } \
113 static ExternConverter_##extern_name singleton; \
114 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
115 const IR::ExternBlock *eb, const bool &emitExternes) override; \
116 Util::IJson *convertExternObject(ConversionContext *ctxt, const P4::ExternMethod *em, \
117 const IR::MethodCallExpression *mc, \
118 const IR::StatOrDecl *s, \
119 const bool &emitExterns) override; \
120 };
121
122#define EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE(extern_name) \
123 class ExternConverter_##extern_name : public ExternConverter { \
124 ExternConverter_##extern_name() { registerExternConverter(cstring(#extern_name), this); } \
125 static ExternConverter_##extern_name singleton; \
126 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
127 const IR::ExternBlock *eb, const bool &emitExterns) override; \
128 Util::IJson *convertExternObject(ConversionContext *ctxt, const P4::ExternMethod *em, \
129 const IR::MethodCallExpression *mc, \
130 const IR::StatOrDecl *s, \
131 const bool &emitExterns) override; \
132 };
133
134EXTERN_CONVERTER_W_FUNCTION(assert)
135EXTERN_CONVERTER_W_FUNCTION(assume)
136
137} // namespace P4::BMV2
138
139#endif /* BACKENDS_BMV2_COMMON_EXTERN_H_ */
Definition extern.h:18
virtual void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, const IR::ExternBlock *eb, const bool &emitExterns)
Definition extern.cpp:72
Definition methodInstance.h:194
Definition methodInstance.h:168
Definition node.h:53
Definition lib/json.h:41
Definition lib/json.h:128
Definition cstring.h:85
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition action.cpp:9
Definition bmv2/common/helpers.h:288