17#ifndef FRONTENDS_P4_SPECIALIZE_H_
18#define FRONTENDS_P4_SPECIALIZE_H_
20#include "frontends/common/constantFolding.h"
21#include "frontends/common/resolveReferences/referenceMap.h"
22#include "frontends/p4/typeChecking/typeChecker.h"
47 const IR::Node *insertion)
56 CHECK_NULL(insertion);
58 const IR::Type_Declaration *synthesize(
ReferenceMap *refMap)
const;
66 const IR::Parameter *param);
78 const IR::IContainer *container,
const IR::Node *insertion);
86 const IR::IContainer *container,
const IR::Node *insertion);
88 cstring getName(
const IR::Node *insertion)
const {
89 auto s = ::get(specializations, insertion);
90 if (s ==
nullptr)
return nullptr;
93 void clear() { specializations.clear(); }
105 setName(
"FindSpecializations");
108 const IR::Node *findInsertionPoint()
const;
109 bool isSimpleConstant(
const IR::Expression *expression)
const;
110 Visitor::profile_t init_apply(
const IR::Node *node)
override {
112 return Inspector::init_apply(node);
119 bool preorder(
const IR::P4Parser *parser)
override {
return noParameters(parser); }
120 bool preorder(
const IR::P4Control *control)
override {
return noParameters(control); }
121 void postorder(
const IR::ConstructorCallExpression *expression)
override;
122 void postorder(
const IR::Declaration_Instance *decl)
override;
124 bool preorder(
const IR::Parameter *)
override {
169 const IR::Node *instantiate(
const IR::Node *node);
174 setName(
"Specialize");
176 const IR::Node *postorder(IR::P4Parser *parser)
override {
return instantiate(parser); }
178 const IR::Node *preorder(IR::Type_Package *package)
override {
182 const IR::Node *postorder(IR::P4Control *control)
override {
return instantiate(control); }
183 const IR::Node *postorder(IR::ConstructorCallExpression *expression)
override;
184 const IR::Node *postorder(IR::Declaration_Instance *)
override;
Definition externInstance.h:33
Definition specialize.h:99
bool noParameters(const IR::IContainer *container)
Definition specialize.cpp:189
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Maintains a map from invocation to a SpecializationInfo object.
Definition specialize.h:62
void addSpecialization(const IR::ConstructorCallExpression *invocation, const IR::IContainer *container, const IR::Node *insertion)
Definition specialize.cpp:79
Specializes each Parser and Control by substituting type arguments and constructor parameters.
Definition specialize.h:211
Specializes each Parser and Control with constant constructor arguments by substituting type argument...
Definition specialize.h:167
Definition ordered_map.h:30
Definition applyOptionsPragmas.cpp:24
Describes how a parser or control is specialized.
Definition specialize.h:30
const IR::IContainer * specialized
Actual parser or control that is being specialized.
Definition specialize.h:34
cstring name
Name to use for specialized object.
Definition specialize.h:32
const IR::Node * insertBefore
Where in the program should the specialization be inserted.
Definition specialize.h:44
IR::IndexedVector< IR::Declaration > * declarations
Declarations to insert in the list of locals.
Definition specialize.h:40
const IR::Node * invocation
Invocation which causes this specialization.
Definition specialize.h:42
const IR::Vector< IR::Type > * typeArguments
Values to substitute for type arguments.
Definition specialize.h:36
IR::Vector< IR::Argument > * constructorArguments
Values to substitute for constructor arguments.
Definition specialize.h:38