P4C
The P4 Compiler
Loading...
Searching...
No Matches
backends/common/programStructure.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * Copyright 2013-present Barefoot Networks, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_COMMON_PROGRAMSTRUCTURE_H_
9#define BACKENDS_COMMON_PROGRAMSTRUCTURE_H_
10
11#include "backends/common/metermap.h"
12#include "ir/ir.h"
13#include "ir/visitor.h"
14#include "lib/ordered_map.h"
15#include "lib/ordered_set.h"
16
17namespace P4 {
18
20
53
54class DiscoverStructure : public Inspector {
55 public:
56 ProgramStructure *structure;
57
58 explicit DiscoverStructure(ProgramStructure *structure) : structure(structure) {
59 setName("DiscoverStructure");
60 }
61 void postorder(const IR::ParameterList *paramList) override;
62 void postorder(const IR::P4Action *action) override;
63 void postorder(const IR::Declaration_Variable *decl) override;
64 void postorder(const IR::Type_Error *errors) override;
65 void postorder(const IR::Declaration_MatchKind *kind) override;
66};
67
72class BuildResourceMap : public Inspector {
73 ResourceMap *resourceMap;
74
75 public:
76 explicit BuildResourceMap(ResourceMap *resourceMap) : resourceMap(resourceMap) {
77 CHECK_NULL(resourceMap);
78 }
79
80 bool preorder(const IR::ControlBlock *control) override {
81 resourceMap->emplace(control->container, control);
82 for (auto cv : control->constantValue) {
83 resourceMap->emplace(cv.first, cv.second);
84 }
85
86 for (const auto *c : control->container->controlLocals) {
87 if (c->is<IR::InstantiatedBlock>()) {
88 resourceMap->emplace(c, control->getValue(c));
89 }
90 }
91 return false;
92 }
93
94 bool preorder(const IR::ParserBlock *parser) override {
95 resourceMap->emplace(parser->container, parser);
96 for (auto cv : parser->constantValue) {
97 resourceMap->emplace(cv.first, cv.second);
98 if (cv.second->is<IR::Block>()) {
99 visit(cv.second->getNode());
100 }
101 }
102
103 for (const auto *c : parser->container->parserLocals) {
104 if (c->is<IR::InstantiatedBlock>()) {
105 resourceMap->emplace(c, parser->getValue(c));
106 }
107 }
108 return false;
109 }
110
111 bool preorder(const IR::TableBlock *table) override {
112 resourceMap->emplace(table->container, table);
113 for (auto cv : table->constantValue) {
114 resourceMap->emplace(cv.first, cv.second);
115 if (cv.second->is<IR::Block>()) {
116 visit(cv.second->getNode());
117 }
118 }
119 return false;
120 }
121
122 bool preorder(const IR::PackageBlock *package) override {
123 for (auto cv : package->constantValue) {
124 if (cv.second->is<IR::Block>()) {
125 visit(cv.second->getNode());
126 }
127 }
128 return false;
129 }
130
131 bool preorder(const IR::ToplevelBlock *tlb) override {
132 const auto *package = tlb->getMain();
133 visit(package);
134 return false;
135 }
136};
137
138} // namespace P4
139
140#endif /* BACKENDS_COMMON_PROGRAMSTRUCTURE_H_ */
Definition metermap.h:16
Definition visitor.h:418
Definition backends/common/programStructure.h:23
ordered_map< cstring, const IR::P4Table * > directCounterMap
All the direct counters. (TODO: This should be PSA-specific or V1MODEL-specific.)
Definition backends/common/programStructure.h:41
ordered_map< const IR::Parameter *, unsigned > index
Definition backends/common/programStructure.h:29
std::set< cstring > match_kinds
All match kinds.
Definition backends/common/programStructure.h:47
ordered_set< const IR::Parameter * > nonActionParameters
Parameters of controls/parsers.
Definition backends/common/programStructure.h:31
DirectMeterMap directMeterMap
All the direct meters. (TODO: This should be PSA-specific or V1MODEL-specific.)
Definition backends/common/programStructure.h:39
ordered_map< const IR::IDeclaration *, unsigned int > errorCodesMap
All error codes.
Definition backends/common/programStructure.h:37
ordered_map< const IR::StructField *, cstring > scalarMetadataFields
Definition backends/common/programStructure.h:45
std::vector< const IR::Declaration_Variable * > variables
All local variables.
Definition backends/common/programStructure.h:35
ResourceMap resourceMap
map IR node to compile-time allocated resource blocks.
Definition backends/common/programStructure.h:49
ordered_map< const IR::P4Action *, const IR::P4Control * > actions
Map action to parent control.
Definition backends/common/programStructure.h:26
ordered_map< const IR::P4Action *, unsigned > ids
For each action its json id.
Definition backends/common/programStructure.h:33
Definition ordered_map.h:32
Definition ordered_set.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13