P4C
The P4 Compiler
Loading...
Searching...
No Matches
psaProgramStructure.h
1/*
2 * SPDX-FileCopyrightText: 2013 Barefoot Networks, Inc.
3 * SPDX-FileCopyrightText: 2022 VMware Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_COMMON_PSAPROGRAMSTRUCTURE_H_
9#define BACKENDS_COMMON_PSAPROGRAMSTRUCTURE_H_
10
11#include "portableProgramStructure.h"
12
13namespace P4 {
14
15enum psa_gress_t {
16 INGRESS,
17 EGRESS,
18};
19
20enum block_t {
21 PARSER,
22 PIPELINE,
23 DEPARSER,
24};
25
26class PsaProgramStructure : public PortableProgramStructure {
27 public:
30
31 public:
32 PsaProgramStructure(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
33 : PortableProgramStructure(refMap, typeMap) {}
34
37 static bool isCounterMetadata(cstring ptName) { return ptName == "PSA_CounterType_t"; }
38
41 static bool isStandardMetadata(cstring ptName) {
42 return (ptName == "psa_ingress_parser_input_metadata_t" ||
43 ptName == "psa_egress_parser_input_metadata_t" ||
44 ptName == "psa_ingress_input_metadata_t" ||
45 ptName == "psa_ingress_output_metadata_t" ||
46 ptName == "psa_egress_input_metadata_t" ||
47 ptName == "psa_egress_deparser_input_metadata_t" ||
48 ptName == "psa_egress_output_metadata_t");
49 }
50};
51
52class ParsePsaArchitecture : public ParsePortableArchitecture {
53 PsaProgramStructure *structure;
54
55 public:
56 explicit ParsePsaArchitecture(PsaProgramStructure *structure) : structure(structure) {
57 CHECK_NULL(structure);
58 }
59
60 void modelError(const char *format, const IR::INode *node) {
61 ::P4::error(ErrorType::ERR_MODEL,
62 (cstring(format) + "\nAre you using an up-to-date 'psa.p4'?").c_str(),
63 node->getNode());
64 }
65
66 bool preorder(const IR::PackageBlock *block) override;
67 bool preorder(const IR::ExternBlock *block) override;
68
69 profile_t init_apply(const IR::Node *root) override {
70 structure->block_type.clear();
71 structure->globals.clear();
72 return Inspector::init_apply(root);
73 }
74};
75
76class InspectPsaProgram : public InspectPortableProgram {
78
79 public:
80 InspectPsaProgram(P4::ReferenceMap *refMap, P4::TypeMap *typeMap, PsaProgramStructure *pinfo)
81 : InspectPortableProgram(refMap, typeMap), pinfo(pinfo) {
82 CHECK_NULL(pinfo);
83 setName("InspectPsaProgram");
84 }
85
86 void postorder(const IR::P4Parser *p) override;
87 void postorder(const IR::P4Control *c) override;
88 void postorder(const IR::Declaration_Instance *di) override;
89
90 void addTypesAndInstances(const IR::Type_StructLike *type, bool meta);
91 void addHeaderType(const IR::Type_StructLike *st);
92 void addHeaderInstance(const IR::Type_StructLike *st, cstring name);
93 bool preorder(const IR::Declaration_Variable *dv) override;
94 bool preorder(const IR::Parameter *parameter) override;
95};
96
97} // namespace P4
98
99#endif /* BACKENDS_COMMON_PSAPROGRAMSTRUCTURE_H_ */
Definition inode.h:42
Definition node.h:53
Definition portableProgramStructure.h:70
Definition psaProgramStructure.h:26
static bool isCounterMetadata(cstring ptName)
Definition psaProgramStructure.h:37
ordered_map< const IR::Node *, std::pair< psa_gress_t, block_t > > block_type
Architecture related information.
Definition psaProgramStructure.h:29
static bool isStandardMetadata(cstring ptName)
Definition psaProgramStructure.h:41
Class used to encode maps from paths to declarations.
Definition referenceMap.h:67
Definition typeMap.h:32
Definition visitor.h:78
Definition cstring.h:85
Definition ordered_map.h:32
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:13
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58