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