17#ifndef BACKENDS_BMV2_COMMON_EXTERN_H_
18#define BACKENDS_BMV2_COMMON_EXTERN_H_
20#include "backends/common/programStructure.h"
21#include "frontends/p4/methodInstance.h"
28 static std::map<cstring, ExternConverter *> *cvtForType;
34 const IR::MethodCallExpression *mc,
35 const IR::StatOrDecl *s,
const bool &emitExterns);
37 const IR::ExternBlock *eb,
const bool &emitExterns);
40 const IR::MethodCallExpression *mc,
41 const IR::StatOrDecl *s,
const bool emitExterns);
44 static ExternConverter *get(
const IR::Type_Extern *type) {
return get(type->name); }
45 static ExternConverter *get(
const IR::ExternBlock *eb) {
return get(eb->type); }
48 return get(em->originalExternType->name);
52 const IR::MethodCallExpression *mc,
const IR::StatOrDecl *s,
53 const bool &emitExterns);
55 const IR::ExternBlock *eb,
const bool &emitExterns);
57 const IR::MethodCallExpression *mc,
58 const IR::StatOrDecl *s,
const bool emitExterns);
61 void modelError(
const char *format,
const IR::Node *place)
const;
69 const IR::MethodCallExpression *methodCall,
73#define EXTERN_CONVERTER_W_FUNCTION_AND_MODEL(extern_name, model_type, model_name) \
74 class ExternConverter_##extern_name : public ExternConverter { \
75 model_type &model_name; \
76 ExternConverter_##extern_name() : model_name(model_type::instance) { \
77 registerExternConverter(cstring(#extern_name), this); \
79 static ExternConverter_##extern_name singleton; \
80 Util::IJson *convertExternFunction(ConversionContext *ctxt, const P4::ExternFunction *ef, \
81 const IR::MethodCallExpression *mc, \
82 const IR::StatOrDecl *s, \
83 const bool emitExterns) override; \
86#define EXTERN_CONVERTER_W_FUNCTION(extern_name) \
87 class ExternConverter_##extern_name : public ExternConverter { \
88 ExternConverter_##extern_name() { registerExternConverter(cstring(#extern_name), this); } \
89 static ExternConverter_##extern_name singleton; \
90 Util::IJson *convertExternFunction(ConversionContext *ctxt, const P4::ExternFunction *ef, \
91 const IR::MethodCallExpression *mc, \
92 const IR::StatOrDecl *s, \
93 const bool emitExterns) override; \
96#define EXTERN_CONVERTER_W_INSTANCE_AND_MODEL(extern_name, model_type, model_name) \
97 class ExternConverter_##extern_name : public ExternConverter { \
98 model_type &model_name; \
99 ExternConverter_##extern_name() : model_name(model_type::instance) { \
100 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; \
107#define EXTERN_CONVERTER_W_INSTANCE(extern_name) \
108 class ExternConverter_##extern_name : public ExternConverter { \
109 ExternConverter_##extern_name() { registerExternConverter(cstring(#extern_name), this); } \
110 static ExternConverter_##extern_name singleton; \
111 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
112 const IR::ExternBlock *eb, const bool &emitExterns) override; \
115#define EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE_AND_MODEL(extern_name, type, name) \
116 class ExternConverter_##extern_name : public ExternConverter { \
118 ExternConverter_##extern_name() : name(type::instance) { \
119 registerExternConverter(cstring(#extern_name), this); \
121 static ExternConverter_##extern_name singleton; \
122 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
123 const IR::ExternBlock *eb, const bool &emitExternes) override; \
124 Util::IJson *convertExternObject(ConversionContext *ctxt, const P4::ExternMethod *em, \
125 const IR::MethodCallExpression *mc, \
126 const IR::StatOrDecl *s, \
127 const bool &emitExterns) override; \
130#define EXTERN_CONVERTER_W_OBJECT_AND_INSTANCE(extern_name) \
131 class ExternConverter_##extern_name : public ExternConverter { \
132 ExternConverter_##extern_name() { registerExternConverter(cstring(#extern_name), this); } \
133 static ExternConverter_##extern_name singleton; \
134 void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, \
135 const IR::ExternBlock *eb, const bool &emitExterns) override; \
136 Util::IJson *convertExternObject(ConversionContext *ctxt, const P4::ExternMethod *em, \
137 const IR::MethodCallExpression *mc, \
138 const IR::StatOrDecl *s, \
139 const bool &emitExterns) override; \
142EXTERN_CONVERTER_W_FUNCTION(assert)
143EXTERN_CONVERTER_W_FUNCTION(assume)
virtual void convertExternInstance(ConversionContext *ctxt, const IR::Declaration *c, const IR::ExternBlock *eb, const bool &emitExterns)
Definition extern.cpp:83
Definition methodInstance.h:181
Definition methodInstance.h:149
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition action.cpp:21