P4C
The P4 Compiler
Loading...
Searching...
No Matches
bmv2/pna_nic/pnaProgramStructure.h
1/*
2 * Copyright 2024 Marvell Technology, Inc.
3 * SPDX-FileCopyrightText: 2024 Marvell Technology, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_BMV2_PNA_NIC_PNAPROGRAMSTRUCTURE_H_
9#define BACKENDS_BMV2_PNA_NIC_PNAPROGRAMSTRUCTURE_H_
10
11#include "backends/common/portableProgramStructure.h"
12
14namespace P4::BMV2 {
15
16enum pna_block_t {
17 MAIN_PARSER,
18 MAIN_CONTROL,
19 MAIN_DEPARSER,
20};
21
22class PnaProgramStructure : public P4::PortableProgramStructure {
23 public:
26
27 public:
28 PnaProgramStructure(P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
29 : PortableProgramStructure(refMap, typeMap) {}
30
33 static bool isCounterMetadata(cstring ptName) { return ptName == "PNA_CounterType_t"; }
34
37 static bool isStandardMetadata(cstring ptName) {
38 return ptName == "pna_main_parser_input_metadata_t" ||
39 ptName == "pna_main_input_metadata_t" || ptName == "pna_main_output_metadata_t";
40 }
41};
42
43class ParsePnaArchitecture : public P4::ParsePortableArchitecture {
44 PnaProgramStructure *structure;
45
46 public:
47 explicit ParsePnaArchitecture(PnaProgramStructure *structure) : structure(structure) {
48 CHECK_NULL(structure);
49 }
50
51 void modelError(const char *format, const IR::INode *node) {
52 ::P4::error(ErrorType::ERR_MODEL,
53 (cstring(format) + "\nAre you using an up-to-date 'pna.p4'?").c_str(),
54 node->getNode());
55 }
56
57 bool preorder(const IR::PackageBlock *block) override;
58 bool preorder(const IR::ExternBlock *block) override;
59
60 profile_t init_apply(const IR::Node *root) override {
61 structure->block_type.clear();
62 structure->globals.clear();
63 return Inspector::init_apply(root);
64 }
65};
66
67class InspectPnaProgram : public P4::InspectPortableProgram {
69
70 public:
71 InspectPnaProgram(P4::ReferenceMap *refMap, P4::TypeMap *typeMap, PnaProgramStructure *pinfo)
72 : InspectPortableProgram(refMap, typeMap), pinfo(pinfo) {
73 CHECK_NULL(pinfo);
74 setName("InspectPnaProgram");
75 }
76
77 void postorder(const IR::P4Parser *p) override;
78 void postorder(const IR::P4Control *c) override;
79 void postorder(const IR::Declaration_Instance *di) override;
80
81 void addTypesAndInstances(const IR::Type_StructLike *type, bool meta);
82 void addHeaderType(const IR::Type_StructLike *st);
83 void addHeaderInstance(const IR::Type_StructLike *st, cstring name);
84 bool preorder(const IR::Declaration_Variable *dv) override;
85 bool preorder(const IR::Parameter *parameter) override;
86};
87
88} // namespace P4::BMV2
89
90#endif /* BACKENDS_BMV2_PNA_NIC_PNAPROGRAMSTRUCTURE_H_ */
Definition bmv2/pna_nic/pnaProgramStructure.h:22
ordered_map< const IR::Node *, pna_block_t > block_type
Architecture related information.
Definition bmv2/pna_nic/pnaProgramStructure.h:25
static bool isStandardMetadata(cstring ptName)
Definition bmv2/pna_nic/pnaProgramStructure.h:37
static bool isCounterMetadata(cstring ptName)
Definition bmv2/pna_nic/pnaProgramStructure.h:33
Definition inode.h:42
Definition node.h:53
Definition portableProgramStructure.h:75
Definition portableProgramStructure.h:70
Definition portableProgramStructure.h:20
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 action.cpp:9
void error(const char *format, Args &&...args)
Report an error with the given message.
Definition lib/error.h:58