P4C
The P4 Compiler
Loading...
Searching...
No Matches
dpdkMetadata.h
1/*
2 * Copyright 2022 Intel Corp.
3 * SPDX-FileCopyrightText: 2022 Intel Corp.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef BACKENDS_DPDK_DPDKMETADATA_H_
9#define BACKENDS_DPDK_DPDKMETADATA_H_
10
11#include "dpdkUtils.h"
12#include "frontends/common/resolveReferences/referenceMap.h"
13#include "ir/ir.h"
14
15namespace P4::DPDK {
16
17class IsDirectionMetadataUsed : public Inspector {
18 bool &is_direction_used;
19
20 public:
21 explicit IsDirectionMetadataUsed(bool &is_direction_used)
22 : is_direction_used(is_direction_used) {}
23 bool preorder(const IR::Member *m) override {
24 if (!is_direction_used && isDirection(m)) {
25 is_direction_used = true;
26 }
27 return false;
28 }
29};
30
34class DirectionToRegRead : public Transform {
35 ordered_map<cstring, cstring> dirToDirMapping;
36 ordered_map<cstring, cstring> inputToInputPortMapping;
37 ordered_set<cstring> usedNames;
38 cstring registerInstanceName;
39
40 public:
46 dirToDirMapping.insert(std::make_pair(cstring("pna_main_input_metadata_direction"),
47 cstring("pna_main_input_metadata_direction")));
48 dirToDirMapping.insert(std::make_pair(cstring("pna_pre_input_metadata_direction"),
49 cstring("pna_main_input_metadata_direction")));
50 dirToDirMapping.insert(std::make_pair(cstring("pna_main_parser_input_metadata_direction"),
51 cstring("pna_main_input_metadata_direction")));
52 inputToInputPortMapping.insert(
53 std::make_pair(cstring("pna_main_input_metadata_input_port"),
54 cstring("pna_main_input_metadata_input_port")));
55 inputToInputPortMapping.insert(
56 std::make_pair(cstring("pna_pre_input_metadata_direction"),
57 cstring("pna_main_input_metadata_input_port")));
58 inputToInputPortMapping.insert(
59 std::make_pair(cstring("pna_main_parser_input_metadata_direction"),
60 cstring("pna_main_input_metadata_input_port")));
61 }
62 const IR::Node *preorder(IR::DpdkAsmProgram *p) override;
63 const IR::Node *preorder(IR::Member *m) override;
64
65 void uniqueNames(IR::DpdkAsmProgram *p);
66 IR::DpdkExternDeclaration *addRegDeclInstance(cstring instanceName);
67 IR::DpdkListStatement *replaceDirection(IR::DpdkListStatement *l);
68 IR::IndexedVector<IR::DpdkAsmStatement> addRegReadStmtForDirection(
70};
71
75class PrependPassRecircId : public Transform {
77
78 public:
79 PrependPassRecircId() {}
80 bool isPass(const IR::Member *m);
81 const IR::Node *postorder(IR::DpdkAction *a) override;
82 const IR::Node *postorder(IR::DpdkListStatement *l) override;
83 IR::IndexedVector<IR::DpdkAsmStatement> prependPassWithRecircid(
85};
86
87} // namespace P4::DPDK
88#endif // BACKENDS_DPDK_DPDKMETADATA_H_
DirectionToRegRead()
Definition dpdkMetadata.h:41
void uniqueNames(IR::DpdkAsmProgram *p)
Make sure new decls and fields name are unique.
Definition dpdkMetadata.cpp:15
IR::DpdkExternDeclaration * addRegDeclInstance(cstring instanceName)
Create and add register declaration instance to program.
Definition dpdkMetadata.cpp:45
bool isPass(const IR::Member *m)
Definition dpdkMetadata.cpp:89
Definition indexed_vector.h:31
Definition node.h:53
Definition cstring.h:85
Definition ordered_map.h:32
Definition ordered_set.h:32
Definition dpdk/backend.cpp:26