19#ifndef BACKENDS_TOFINO_BF_P4C_SPECS_PHV_SPEC_H_
20#define BACKENDS_TOFINO_BF_P4C_SPECS_PHV_SPEC_H_
25#include "backends/tofino/bf-p4c/specs/phv.h"
26#include "lib/bitvec.h"
27#include "lib/ordered_map.h"
45 enum ArchBlockType_t { PARSER, MAU, DEPARSER };
59 using AddressSpec = std::map<PHV::Type, RangeSpec>;
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;
84 std::map<PHV::Size, std::set<PHV::Type>> sizeToTypeMap;
90 std::map<PHV::Type, unsigned> types;
93 explicit MauGroupType(
unsigned n, std::map<PHV::Type, unsigned> t)
94 : numGroups(n), types(t) {}
96 explicit MauGroupType(
unsigned n) : numGroups(n) {}
98 MauGroupType() : numGroups(0) {}
100 void addType(
PHV::Type t,
unsigned n) { types.emplace(t, n); }
117 std::map<PHV::Size, std::vector<unsigned>> ingressOnlyMauGroupIds;
119 std::map<PHV::Size, std::vector<unsigned>> egressOnlyMauGroupIds;
121 std::map<PHV::Type, unsigned> tagalongCollectionSpec;
123 unsigned numTagalongCollections = 0;
125 std::map<PHV::Type, unsigned> deparserGroupSize;
127 std::map<PHV::Type, std::pair<unsigned, unsigned>> deparserGroupSpec;
129 unsigned numPovBits = 0;
139 const std::map<PHV::Size, unsigned> &numContainersPerGroup)
const;
142 PhVCache &mutablePhvCache()
const {
return cache_; }
159 const std::map<PHV::Size, std::set<PHV::Type>>
groupsToTypes()
const;
247 const std::map<
PHV::Size, std::vector<unsigned>> &gressOnlyMauGroupIds)
const;
259 const std::map<PHV::Size, std::vector<bitvec>> &
mauGroups()
const;
279 const std::map<PHV::Type, unsigned> getTagalongCollectionSpec()
const {
280 return tagalongCollectionSpec;
283 unsigned getNumTagalongCollections()
const {
return numTagalongCollections; }
305 virtual unsigned physicalAddress(
unsigned container_id, ArchBlockType_t interface)
const = 0;
317 ArchBlockType_t interface)
const;
322 TofinoPhvSpec(
float phv_scale_factor,
bool no_tagalong);
346 unsigned physicalAddress(
unsigned container_id, ArchBlockType_t )
const override;
351 return _physicalAddresses;
355 static AddressSpec _physicalAddresses;
360 explicit JBayPhvSpec(
float phv_scale_factor);
384 unsigned physicalAddress(
unsigned container_id, ArchBlockType_t interface)
const override;
390 return _physicalMauAddresses;
391 case PhvSpec::PARSER:
392 return _physicalParserAddresses;
393 case PhvSpec::DEPARSER:
394 return _physicalDeparserAddresses;
396 BUG(
"Invalid interface");
401 static AddressSpec _physicalMauAddresses;
402 static AddressSpec _physicalParserAddresses;
403 static AddressSpec _physicalDeparserAddresses;
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 ordered_map.h:32
Definition bf-p4c/specs/phv.h:171
Definition bf-p4c/specs/phv.h:109
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
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