8#ifndef FRONTENDS_P4_SPECIALIZE_H_
9#define FRONTENDS_P4_SPECIALIZE_H_
11#include "frontends/common/resolveReferences/referenceMap.h"
12#include "frontends/common/resolveReferences/resolveReferences.h"
13#include "frontends/p4/typeMap.h"
15#include "ir/pass_manager.h"
22struct SpecializationInfo {
47 CHECK_NULL(insertion);
49 const IR::Type_Declaration *synthesize(
const Visitor::Context *ctxt);
66 const IR::IContainer *container,
const IR::Node *insertion,
75 const IR::IContainer *container,
const IR::Node *insertion,
78 const Visitor::Context *ctxt)
const;
80 auto s = ::P4::get(specializations, insertion);
81 if (s ==
nullptr)
return nullptr;
84 void clear() { specializations.clear(); }
90class FindSpecializations :
public Inspector,
public ResolutionContext {
97 setName(
"FindSpecializations");
100 const IR::Node *findInsertionPoint()
const;
101 bool isSimpleConstant(
const IR::Expression *expression)
const;
103 auto rv = Inspector::init_apply(node);
106 node->apply(nameGen);
115 bool preorder(
const IR::P4Parser *parser)
override {
return noParameters(parser); }
116 bool preorder(
const IR::P4Control *control)
override {
return noParameters(control); }
117 void postorder(
const IR::ConstructorCallExpression *expression)
override;
118 void postorder(
const IR::Declaration_Instance *decl)
override;
120 bool preorder(
const IR::Parameter *)
override {
165 const IR::Node *instantiate(
const IR::Node *node,
const Visitor::Context *ctxt);
170 setName(
"Specialize");
172 const IR::Node *postorder(IR::P4Parser *parser)
override {
173 return instantiate(parser, getContext());
176 const IR::Node *preorder(IR::Type_Package *package)
override {
180 const IR::Node *postorder(IR::P4Control *control)
override {
181 return instantiate(control, getContext());
183 const IR::Node *postorder(IR::ConstructorCallExpression *expression)
override;
184 const IR::Node *postorder(IR::Declaration_Instance *)
override;
211class SpecializeAll :
public PassRepeated {
Definition referenceMap.h:57
bool noParameters(const IR::IContainer *container)
Definition specialize.cpp:185
Definition frontends/p4/frontend.h:33
Definition indexed_vector.h:31
Definition ir/vector.h:59
Definition referenceMap.h:36
Definition referenceMap.h:29
Maintains a map from invocation to a SpecializationInfo object.
Definition specialize.h:53
void addSpecialization(const IR::ConstructorCallExpression *invocation, const IR::IContainer *container, const IR::Node *insertion, DeclarationLookup *declLookup, NameGenerator *nameGen)
Definition specialize.cpp:72
Definition ordered_map.h:32
The namespace encapsulating IR node classes.
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
const IR::IContainer * specialized
Actual parser or control that is being specialized.
Definition specialize.h:26
cstring name
Name to use for specialized object.
Definition specialize.h:24
const IR::Node * insertBefore
Where in the program should the specialization be inserted.
Definition specialize.h:36
const IR::Node * invocation
Invocation which causes this specialization.
Definition specialize.h:34
IR::IndexedVector< IR::Declaration > declarations
Declarations to insert in the list of locals.
Definition specialize.h:32
const IR::Vector< IR::Type > * typeArguments
Values to substitute for type arguments.
Definition specialize.h:28
IR::Vector< IR::Argument > * constructorArguments
Values to substitute for constructor arguments.
Definition specialize.h:30