17#ifndef FRONTENDS_P4_LOCALIZEACTIONS_H_
18#define FRONTENDS_P4_LOCALIZEACTIONS_H_
20#include "frontends/common/resolveReferences/referenceMap.h"
21#include "frontends/common/resolveReferences/resolveReferences.h"
22#include "frontends/p4/callGraph.h"
23#include "frontends/p4/typeChecking/typeChecker.h"
24#include "frontends/p4/unusedDeclarations.h"
26#include "lib/ordered_set.h"
34 std::map<const IR::P4Control *, ordered_map<const IR::P4Action *, const IR::P4Action *> *> repl;
36 const IR::P4Action *getReplacement(
const IR::P4Action *action,
37 const IR::P4Control *control)
const {
38 auto map = ::P4::get(repl, control);
39 if (map ==
nullptr)
return nullptr;
40 if (map->find(action) != map->end())
return (*map)[action];
43 void addReplacement(
const IR::P4Action *action,
const IR::P4Control *control,
44 const IR::P4Action *replacement) {
45 LOG1(
"Cloning global " << dbp(action) <<
" into " << dbp(replacement) <<
" for "
47 if (repl.find(control) == repl.end())
49 (*repl[control])[action] = replacement;
54class FindGlobalActionUses :
public Inspector,
public ResolutionContext {
57 std::set<const IR::P4Action *> globalActions;
62 setName(
"FindGlobalActionUses");
64 bool preorder(
const IR::PathExpression *path)
override;
65 bool preorder(
const IR::P4Action *action)
override;
71class LocalizeActions :
public Transform,
public ResolutionContext {
78 setName(
"LocalizeActions");
80 const IR::Node *postorder(IR::P4Control *control)
override;
81 const IR::Node *postorder(IR::PathExpression *expression)
override;
88 std::map<const IR::P4Action *, ordered_map<const IR::Node *, const IR::P4Action *> *> toInsert;
89 std::map<const IR::PathExpression *, const IR::P4Action *> repl;
92 const IR::P4Action *getActionUser(
const IR::P4Action *action,
const IR::Node *user) {
93 if (toInsert.find(action) == toInsert.end())
return nullptr;
94 auto map = toInsert[action];
96 if (map->find(user) == map->end())
return nullptr;
99 void createReplacement(
const IR::P4Action *original,
const IR::Node *user,
100 const IR::P4Action *replacement) {
101 auto map = toInsert[original];
102 if (map ==
nullptr) {
104 toInsert[original] = map;
106 (*map)[user] = replacement;
109 void setRefReplacement(
const IR::PathExpression *path,
const IR::P4Action *replacement) {
110 LOG1(
"Adding replacement " << dbp(replacement) <<
" used by " << dbp(path));
111 repl[path] = replacement;
118class FindRepeatedActionUses :
public Inspector,
public ResolutionContext {
125 setName(
"FindRepeatedActionUses");
127 bool preorder(
const IR::PathExpression *expression)
override;
138 visitDagOnce =
false;
140 setName(
"DuplicateActions");
142 const IR::Node *postorder(IR::PathExpression *expression)
override;
143 const IR::Node *postorder(IR::P4Control *control)
override;
149 TagGlobalActions() { setName(
"TagGlobalActions"); }
150 const IR::Node *preorder(IR::P4Action *action)
override;
151 const IR::Node *preorder(IR::P4Parser *parser)
override {
155 const IR::Node *preorder(IR::P4Control *control)
override {
166class LocalizeAllActions :
public PassManager {
181 setName(
"LocalizeAllActions");
Definition localizeActions.h:84
Definition localizeActions.h:133
Definition localizeActions.h:54
Definition localizeActions.h:118
Definition localizeActions.h:30
Definition localizeActions.h:71
Definition referenceMap.h:36
Definition pass_manager.h:145
Class used to encode maps from paths to declarations.
Definition referenceMap.h:66
Iterates RemoveUnusedDeclarations until convergence.
Definition unusedDeclarations.h:146
Definition unusedDeclarations.h:28
Definition resolveReferences.h:121
Definition localizeActions.h:147
Definition ordered_map.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24