P4C
The P4 Compiler
Loading...
Searching...
No Matches
phv_spec.h
1
18
19#ifndef BACKENDS_TOFINO_BF_P4C_SPECS_PHV_SPEC_H_
20#define BACKENDS_TOFINO_BF_P4C_SPECS_PHV_SPEC_H_
21
22#include <optional>
23#include <vector>
24
25#include "backends/tofino/bf-p4c/specs/phv.h"
26#include "lib/bitvec.h"
27#include "lib/ordered_map.h"
28
29namespace P4 {
30class cstring;
31}
32
33namespace P4 {
34namespace IR {
35class Annotation;
36} // end namespace IR
37} // end namespace P4
38
39using namespace P4;
40
41class PhvSpec {
42 public:
43 // We should reuse the definition from arch/arch.h, however, because of circular includes
44 // (arch.h, phv_spec.h, device.h) that is not currently workable
45 enum ArchBlockType_t { PARSER, MAU, DEPARSER };
46
51 struct RangeSpec {
52 unsigned start;
53 unsigned blocks;
54 unsigned blockSize;
55 unsigned incr;
56 unsigned shl;
57 unsigned shr;
58 };
59 using AddressSpec = std::map<PHV::Type, RangeSpec>;
60
61 // All cache fields
62 struct PhVCache {
63 bitvec physical_containers_i;
64 std::map<PHV::Size, std::vector<bitvec>> mau_groups_i;
65 bitvec ingress_only_containers_i;
66 bitvec egress_only_containers_i;
67 std::vector<bitvec> tagalong_collections_i;
68 bitvec individually_assigned_containers_i;
69 };
70
71 protected:
72 // All cache fields
73 mutable PhVCache cache_;
74
76 std::vector<PHV::Type> definedTypes;
78 std::set<PHV::Size> definedSizes;
80 std::set<PHV::Kind> definedKinds;
81
83
84 std::map<PHV::Size, std::set<PHV::Type>> sizeToTypeMap;
85
88 struct MauGroupType {
89 unsigned numGroups; // Number of MAU groups
90 std::map<PHV::Type, unsigned> types;
91 // Type and number of containers in each group
92
93 explicit MauGroupType(unsigned n, std::map<PHV::Type, unsigned> t)
94 : numGroups(n), types(t) {}
95
96 explicit MauGroupType(unsigned n) : numGroups(n) {}
97
98 MauGroupType() : numGroups(0) {}
99
100 void addType(PHV::Type t, unsigned n) { types.emplace(t, n); }
101 };
102
111 std::map<PHV::Size, MauGroupType> mauGroupSpec;
112
115 unsigned containersPerGroup = 0;
116
117 std::map<PHV::Size, std::vector<unsigned>> ingressOnlyMauGroupIds;
118
119 std::map<PHV::Size, std::vector<unsigned>> egressOnlyMauGroupIds;
120
121 std::map<PHV::Type, unsigned> tagalongCollectionSpec;
122
123 unsigned numTagalongCollections = 0;
124
125 std::map<PHV::Type, unsigned> deparserGroupSize;
126
127 std::map<PHV::Type, std::pair<unsigned, unsigned>> deparserGroupSpec;
128
129 unsigned numPovBits = 0;
130
135 void addType(PHV::Type t);
136
138 unsigned getContainersPerGroup(
139 const std::map<PHV::Size, unsigned> &numContainersPerGroup) const;
140
141 public:
142 PhVCache &mutablePhvCache() const { return cache_; }
143
144 const ordered_map<PHV::Type, unsigned> &typeIdMap() const { return typeIdMap_; }
145
147 const std::vector<PHV::Type> &containerTypes() const;
148
150 const std::set<PHV::Size> &containerSizes() const;
151
153 const std::set<PHV::Kind> &containerKinds() const;
154
156 bool hasContainerKind(PHV::Kind kind) const;
157
159 const std::map<PHV::Size, std::set<PHV::Type>> groupsToTypes() const;
160
163 unsigned numContainerTypes() const;
164
167 unsigned numContainersInGroup() const { return containersPerGroup; }
168
172 PHV::Type idToContainerType(unsigned id) const;
173
178 unsigned containerTypeToId(PHV::Type type) const;
179
183 PHV::Container idToContainer(unsigned id) const;
184
188 unsigned containerToId(PHV::Container container) const;
189
191 bitvec filterContainerSet(const bitvec &set, PHV::Kind kind) const;
192 bitvec filterContainerSet(const bitvec &set, PHV::Type type) const;
193
195 cstring containerSetToString(const bitvec &set) const;
196
208 virtual bitvec parserGroup(unsigned id) const = 0;
209
213 virtual bool hasParserExtractGroups() const = 0;
214
220 virtual bitvec parserExtractGroup(unsigned id) const = 0;
221
223 virtual unsigned parserGroupId(const PHV::Container &c) const = 0;
224
227 bitvec deparserGroup(unsigned id) const;
228
230 virtual unsigned deparserGroupId(const PHV::Container &c) const = 0;
231
243 bitvec range(PHV::Type t, unsigned start, unsigned length) const;
244
247 const std::map<PHV::Size, std::vector<unsigned>> &gressOnlyMauGroupIds) const;
248
250 const bitvec &ingressOnly() const;
251
253 const bitvec &egressOnly() const;
254
256 const std::vector<bitvec> &mauGroups(PHV::Size sz) const;
257
259 const std::map<PHV::Size, std::vector<bitvec>> &mauGroups() const;
260
263 bitvec mauGroup(unsigned container_id) const;
264
266 virtual unsigned mauGroupId(const PHV::Container &c) const = 0;
267
270 const std::pair<int, int> mauGroupNumAndSize(const PHV::Type t) const;
271
274 const std::pair<int, int> deparserGroupNumAndSize(const PHV::Type t) const;
275
277 unsigned getTagalongCollectionId(PHV::Container c) const;
278
279 const std::map<PHV::Type, unsigned> getTagalongCollectionSpec() const {
280 return tagalongCollectionSpec;
281 }
282
283 unsigned getNumTagalongCollections() const { return numTagalongCollections; }
284
286 const std::vector<bitvec> &tagalongCollections() const;
287
290 bitvec tagalongCollection(unsigned container_id) const;
291
293 unsigned getNumPovBits() const { return numPovBits; }
294
297 virtual const bitvec &individuallyAssignedContainers() const = 0;
298
301 const bitvec &physicalContainers() const;
302
305 virtual unsigned physicalAddress(unsigned container_id, ArchBlockType_t interface) const = 0;
306
309 unsigned physicalAddress(const PHV::Container &c, ArchBlockType_t interface) const;
310
312 virtual AddressSpec &physicalAddressSpec(ArchBlockType_t interface) const = 0;
313
316 std::optional<PHV::Container> physicalAddressToContainer(unsigned address,
317 ArchBlockType_t interface) const;
318};
319
320class TofinoPhvSpec : public PhvSpec {
321 public:
322 TofinoPhvSpec(float phv_scale_factor, bool no_tagalong);
323
325 bitvec parserGroup(unsigned id) const override;
326
328 bool hasParserExtractGroups() const override;
329
331 bitvec parserExtractGroup(unsigned id) const override;
332
334 unsigned parserGroupId(const PHV::Container &c) const override;
335
337 unsigned mauGroupId(const PHV::Container &c) const override;
338
340 unsigned deparserGroupId(const PHV::Container &c) const override;
341
342 const bitvec &individuallyAssignedContainers() const override;
343
346 unsigned physicalAddress(unsigned container_id, ArchBlockType_t /*interface*/) const override;
347
350 AddressSpec &physicalAddressSpec(ArchBlockType_t /* interface */) const override {
351 return _physicalAddresses;
352 }
353
354 private:
355 static AddressSpec _physicalAddresses;
356};
357
358class JBayPhvSpec : public PhvSpec {
359 public:
360 explicit JBayPhvSpec(float phv_scale_factor);
361
363 bitvec parserGroup(unsigned id) const override;
364
366 bool hasParserExtractGroups() const override;
367
369 bitvec parserExtractGroup(unsigned id) const override;
370
372 unsigned parserGroupId(const PHV::Container &c) const override;
373
375 unsigned mauGroupId(const PHV::Container &c) const override;
376
378 unsigned deparserGroupId(const PHV::Container &c) const override;
379
380 const bitvec &individuallyAssignedContainers() const override;
381
384 unsigned physicalAddress(unsigned container_id, ArchBlockType_t interface) const override;
385
387 AddressSpec &physicalAddressSpec(ArchBlockType_t interface) const override {
388 switch (interface) {
389 case PhvSpec::MAU:
390 return _physicalMauAddresses;
391 case PhvSpec::PARSER:
392 return _physicalParserAddresses;
393 case PhvSpec::DEPARSER:
394 return _physicalDeparserAddresses;
395 default:
396 BUG("Invalid interface");
397 }
398 }
399
400 private:
401 static AddressSpec _physicalMauAddresses;
402 static AddressSpec _physicalParserAddresses;
403 static AddressSpec _physicalDeparserAddresses;
404};
405
406#endif /* BACKENDS_TOFINO_BF_P4C_SPECS_PHV_SPEC_H_ */
AddressSpec & physicalAddressSpec(ArchBlockType_t interface) const override
Definition phv_spec.h:387
bitvec parserGroup(unsigned id) const override
Definition phv_spec.cpp:588
unsigned physicalAddress(unsigned container_id, ArchBlockType_t interface) const override
Definition phv_spec.cpp:681
bitvec parserExtractGroup(unsigned id) const override
Definition phv_spec.cpp:601
unsigned parserGroupId(const PHV::Container &c) const override
Definition phv_spec.cpp:603
unsigned mauGroupId(const PHV::Container &c) const override
Definition phv_spec.cpp:633
bool hasParserExtractGroups() const override
Definition phv_spec.cpp:599
unsigned deparserGroupId(const PHV::Container &c) const override
Definition phv_spec.cpp:672
const bitvec & individuallyAssignedContainers() const override
Definition phv_spec.cpp:677
Definition bitvec.h:120
Definition cstring.h:85
Definition ordered_map.h:32
Definition bf-p4c/specs/phv.h:171
Definition bf-p4c/specs/phv.h:109
Definition phv_spec.h:41
bitvec tagalongCollection(unsigned container_id) const
Definition phv_spec.cpp:264
void addType(PHV::Type t)
Definition phv_spec.cpp:29
virtual unsigned physicalAddress(unsigned container_id, ArchBlockType_t interface) const =0
const std::vector< PHV::Type > & containerTypes() const
Definition phv_spec.cpp:37
unsigned getNumPovBits() const
Definition phv_spec.h:293
std::set< PHV::Size > definedSizes
All sizes of containers supported by the device.
Definition phv_spec.h:78
virtual bitvec parserExtractGroup(unsigned id) const =0
const bitvec & physicalContainers() const
Definition phv_spec.cpp:148
bitvec deparserGroup(unsigned id) const
Definition phv_spec.cpp:299
std::map< PHV::Size, MauGroupType > mauGroupSpec
Definition phv_spec.h:111
PHV::Type idToContainerType(unsigned id) const
Definition phv_spec.cpp:51
bitvec filterContainerSet(const bitvec &set, PHV::Kind kind) const
Filters a set of containers for a single container kind or type.
Definition phv_spec.cpp:73
virtual const bitvec & individuallyAssignedContainers() const =0
unsigned getTagalongCollectionId(PHV::Container c) const
Definition phv_spec.cpp:237
unsigned containerTypeToId(PHV::Type type) const
Definition phv_spec.cpp:56
virtual bitvec parserGroup(unsigned id) const =0
const std::pair< int, int > deparserGroupNumAndSize(const PHV::Type t) const
Definition phv_spec.cpp:294
const std::set< PHV::Size > & containerSizes() const
Definition phv_spec.cpp:39
virtual AddressSpec & physicalAddressSpec(ArchBlockType_t interface) const =0
bitvec ingressOrEgressOnlyContainers(const std::map< PHV::Size, std::vector< unsigned > > &gressOnlyMauGroupIds) const
Definition phv_spec.cpp:209
unsigned getContainersPerGroup(const std::map< PHV::Size, unsigned > &numContainersPerGroup) const
Return the number of containers in an MAU group.
Definition phv_spec.cpp:323
std::set< PHV::Kind > definedKinds
All kinds of containers supported by the device.
Definition phv_spec.h:80
unsigned numContainersInGroup() const
Definition phv_spec.h:167
const std::map< PHV::Size, std::vector< bitvec > > & mauGroups() const
Definition phv_spec.cpp:177
const std::vector< bitvec > & tagalongCollections() const
Definition phv_spec.cpp:246
const std::pair< int, int > mauGroupNumAndSize(const PHV::Type t) const
Definition phv_spec.cpp:283
const std::map< PHV::Size, std::set< PHV::Type > > groupsToTypes() const
Definition phv_spec.cpp:45
virtual unsigned mauGroupId(const PHV::Container &c) const =0
const std::set< PHV::Kind > & containerKinds() const
Definition phv_spec.cpp:41
bitvec range(PHV::Type t, unsigned start, unsigned length) const
Definition phv_spec.cpp:141
unsigned containerToId(PHV::Container container) const
Definition phv_spec.cpp:68
virtual unsigned deparserGroupId(const PHV::Container &c) const =0
unsigned numContainerTypes() const
Definition phv_spec.cpp:49
virtual unsigned parserGroupId(const PHV::Container &c) const =0
bool hasContainerKind(PHV::Kind kind) const
Determines whether the device has the given kind of PHV container.
Definition phv_spec.cpp:43
std::optional< PHV::Container > physicalAddressToContainer(unsigned address, ArchBlockType_t interface) const
Definition phv_spec.cpp:343
const bitvec & egressOnly() const
Definition phv_spec.cpp:231
PHV::Container idToContainer(unsigned id) const
Definition phv_spec.cpp:58
cstring containerSetToString(const bitvec &set) const
Definition phv_spec.cpp:97
virtual bool hasParserExtractGroups() const =0
bitvec mauGroup(unsigned container_id) const
Definition phv_spec.cpp:158
std::vector< PHV::Type > definedTypes
All types of containers supported by the device.
Definition phv_spec.h:76
unsigned containersPerGroup
Definition phv_spec.h:115
const bitvec & ingressOnly() const
Definition phv_spec.cpp:225
Definition phv_spec.h:62
Definition phv_spec.h:51
bool hasParserExtractGroups() const override
Definition phv_spec.cpp:448
bitvec parserGroup(unsigned id) const override
Definition phv_spec.cpp:446
unsigned mauGroupId(const PHV::Container &c) const override
Definition phv_spec.cpp:457
unsigned parserGroupId(const PHV::Container &c) const override
Definition phv_spec.cpp:452
unsigned deparserGroupId(const PHV::Container &c) const override
Definition phv_spec.cpp:477
const bitvec & individuallyAssignedContainers() const override
Definition phv_spec.cpp:482
bitvec parserExtractGroup(unsigned id) const override
Definition phv_spec.cpp:450
unsigned physicalAddress(unsigned container_id, ArchBlockType_t) const override
Definition phv_spec.cpp:490
AddressSpec & physicalAddressSpec(ArchBlockType_t) const override
Definition phv_spec.h:350
Definition constantParsing.h:22
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24
Size
all possible PHV container sizes in BFN devices
Definition bf-p4c/specs/phv.h:105
Kind
Definition bf-p4c/specs/phv.h:39