19#ifndef BF_P4C_PHV_V2_ALLOCATOR_BASE_H_
20#define BF_P4C_PHV_V2_ALLOCATOR_BASE_H_
22#include "backends/tofino/bf-p4c/phv/phv.h"
23#include "backends/tofino/bf-p4c/phv/phv_fields.h"
24#include "backends/tofino/bf-p4c/phv/utils/utils.h"
25#include "backends/tofino/bf-p4c/phv/v2/allocator_metrics.h"
26#include "backends/tofino/bf-p4c/phv/v2/copacker.h"
27#include "backends/tofino/bf-p4c/phv/v2/phv_kit.h"
28#include "backends/tofino/bf-p4c/phv/v2/utils_v2.h"
38struct ContScopeAllocResult :
public AllocResult {
39 ActionSourceCoPackMap action_hints;
41 bool is_packing =
false;
42 ContScopeAllocResult() : AllocResult(
new AllocError(ErrorCode::NOT_ENOUGH_SPACE,
""_cs)) {}
43 explicit ContScopeAllocResult(
const AllocError *err) : AllocResult(err) {}
46 : AllocResult(tx), action_hints(hints), c(c), is_packing(is_packing) {}
47 bool cont_is_whole_container_set_only()
const {
48 BUG_CHECK(ok(),
"cannot query this status on error");
49 return c.type().kind() == Kind::mocha || c.type().kind() == Kind::dark;
59struct SomeContScopeAllocResult {
61 std::vector<const TxScore *> scores;
62 std::vector<ContScopeAllocResult> results;
63 explicit SomeContScopeAllocResult(
const AllocError *default_err) : err(default_err) {}
65 : scores{score}, results{rst} {}
68 bool ok()
const {
return !results.empty(); }
70 size_t size()
const {
return results.size(); }
103 const std::vector<AllocSlice> &candidates,
108 const std::vector<AllocSlice> &candidates,
127 const std::vector<AllocSlice> &candidates,
const Container &c,
128 ActionSourceCoPackMap &co_pack_hints)
const;
138 const std::vector<AllocSlice> &candidates,
144 const SuperCluster::SliceList *sl,
188 const FieldSliceAllocStartMap &fs_starts,
191 const bool skip_mau_checks =
false)
const;
209 const FieldSliceAllocStartMap &fs_starts,
216 const FieldSliceAllocStartMap &fs_starts,
218 std::optional<Container> c,
225 const ActionSourceCoPackMap &action_hints_map,
234 const SuperCluster::SliceList *lo,
const SuperCluster::SliceList *hi,
250 std::vector<const SuperCluster::SliceList *> allocated;
251 std::vector<const SuperCluster::SliceList *> to_allocate;
253 const std::vector<const SuperCluster::SliceList *> &allocated,
254 const std::vector<const SuperCluster::SliceList *> &to_allocate)
255 : alignment(alignment), allocated(allocated), to_allocate(to_allocate) {}
256 bool done()
const {
return to_allocate.empty(); }
257 const SuperCluster::SliceList *next_to_allocate()
const {
return to_allocate.front(); }
262 class DfsListsAllocator {
263 const AllocatorBase &base;
264 const int n_step_limit;
267 bool caller_pruned =
false;
269 int deepest_depth = -1;
270 bool pruned()
const {
return caller_pruned || n_steps > n_step_limit; }
271 std::string depth_prefix(
const int depth)
const;
272 std::optional<ScAllocAlignment> new_alignment_with_start(
273 const ScoreContext &ctx,
const SuperCluster::SliceList *target,
const int sl_start,
279 DfsListsAllocator(
const AllocatorBase &base,
int n_step_limit)
280 : base(base), n_step_limit(n_step_limit) {}
283 const std::vector<const SuperCluster::SliceList *> &allocated,
284 const std::vector<const SuperCluster::SliceList *> &to_allocate,
286 const AllocError *get_deepest_err()
const {
return deepest_err; }
290 const std::vector<FieldSlice> &stride,
291 const ContainerGroupsBySize &groups,
295 explicit AllocatorBase(
const PhvKit &kit) : kit_i(kit) {
296 kit_i.parser_packing_validator->set_trivial_pass(kit.settings.
trivial_alloc);
313 const ContainerGroupsBySize &groups,
314 AllocatorMetrics &alloc_metrics)
const;
331 const ContainerGroupsBySize &groups,
332 AllocatorMetrics &alloc_metrics,
333 const int max_n_slicings = 64)
const;
Definition ordered_set.h:32
Definition slice_alloc.h:136
Definition phv/utils/utils.h:117
Definition phv/utils/utils.h:37
Definition phv/utils/utils.h:1049
Definition phv/utils/utils.h:561
Definition allocator_base.h:77
std::set< PHV::Size > compute_valid_container_sizes(const SuperCluster *sc) const
Definition allocator_base.cpp:1316
const AllocError * is_container_bytes_ok(const Allocation &alloc, const std::vector< AllocSlice > &candidates, const Container &c) const
Definition allocator_base.cpp:557
std::vector< const SuperCluster::SliceList * > * make_alloc_order(const ScoreContext &ctx, const SuperCluster *sc, const PHV::Size width) const
Definition allocator_base.cpp:1382
AllocResult try_sliced_super_cluster(const ScoreContext &ctx, const Allocation &alloc, const SuperCluster *sc, const ContainerGroupsBySize &groups, AllocatorMetrics &alloc_metrics) const
ALLOCATION functions common to trivial and greedy allocation.
Definition allocator_base.cpp:1436
std::optional< Transaction > try_hints(const ScoreContext &ctx, const Allocation &alloc, const ContainerGroup &group, const ActionSourceCoPackMap &action_hints_map, ordered_set< PHV::FieldSlice > &allocated, ScAllocAlignment &hint_enforced_alignments, AllocatorMetrics &alloc_metrics) const
Definition allocator_base.cpp:856
const AllocError * verify_can_pack(const ScoreContext &ctx, const Allocation &alloc, const SuperCluster *sc, const std::vector< AllocSlice > &candidates, const Container &c, ActionSourceCoPackMap &co_pack_hints) const
Definition allocator_base.cpp:322
Transaction make_speculated_alloc(const ScoreContext &ctx, const Allocation &alloc, const SuperCluster *sc, const std::vector< AllocSlice > &candidates, const Container &candidates_cont) const
Definition allocator_base.cpp:211
const AllocError * is_container_solitary_ok(const Allocation &alloc, const AllocSlice &candidate, const Container &c) const
Definition allocator_base.cpp:511
const AllocError * is_container_gress_ok(const Allocation &alloc, const AllocSlice &sl, const Container &c) const
Definition allocator_base.cpp:406
AllocResult try_super_cluster_to_container_group(const ScoreContext &ctx, const Allocation &alloc, const SuperCluster *sc, const ContainerGroup &group, AllocatorMetrics &alloc_metrics) const
Definition allocator_base.cpp:1187
ContScopeAllocResult try_slices_to_container(const ScoreContext &ctx, const Allocation &alloc, const FieldSliceAllocStartMap &fs_starts, const Container &c, AllocatorMetrics &alloc_metrics, const bool skip_mau_checks=false) const
Definition allocator_base.cpp:650
PHV::Transaction alloc_deparser_zero_cluster(const ScoreContext &ctx, const PHV::Allocation &alloc, const PHV::SuperCluster *sc, PhvInfo &phv) const
Definition allocator_base.cpp:1542
SomeContScopeAllocResult try_slices_adapter(const ScoreContext &ctx, const Allocation &alloc, const FieldSliceAllocStartMap &fs_starts, const ContainerGroup &group, std::optional< Container > c, AllocatorMetrics &alloc_metrics) const
Definition allocator_base.cpp:837
const AllocError * is_container_write_mode_ok(const Allocation &alloc, const AllocSlice &sl, const Container &c) const
Definition allocator_base.cpp:437
AllocResult alloc_strided_super_clusters(const ScoreContext &ctx, const Allocation &alloc, const SuperCluster *sc, const ContainerGroupsBySize &groups, AllocatorMetrics &alloc_metrics, const int max_n_slicings=64) const
Definition allocator_base.cpp:1694
std::vector< int > make_start_positions(const ScoreContext &ctx, const SuperCluster::SliceList *sl, const PHV::Size width) const
Definition allocator_base.cpp:1275
AllocResult try_wide_arith_slices_to_container_group(const ScoreContext &ctx, const Allocation &alloc, const ScAllocAlignment &alignment, const SuperCluster::SliceList *lo, const SuperCluster::SliceList *hi, const ContainerGroup &group, AllocatorMetrics &alloc_metrics) const
Definition allocator_base.cpp:923
SomeContScopeAllocResult try_slices_to_container_group(const ScoreContext &ctx, const Allocation &alloc, const FieldSliceAllocStartMap &fs_starts, const ContainerGroup &group, AllocatorMetrics &alloc_metrics) const
Definition allocator_base.cpp:729
const AllocError * is_container_type_ok(const AllocSlice &sl, const Container &c) const
CONSTRAINT CHECKING Functions common to trivial and greedy allocation.
Definition allocator_base.cpp:361
const AllocError * check_container_scope_constraints(const Allocation &alloc, const std::vector< AllocSlice > &candidates, const Container &c) const
Definition allocator_base.cpp:597
std::function< bool(const Transaction &)> DfsAllocCb
internal type of callback.
Definition allocator_base.h:247
AllocatorMetrics contains metrics useful in tracking Allocator efficiency and debug.
Definition allocator_metrics.h:30
ScoreContext is the allocation context that is updated and passed down during allocation.
Definition utils_v2.h:178
TxScore is the interface of an allocation score.
Definition tx_score.h:28
Definition phv_fields.h:1095
ScoreContext can compute a alloc score for an PHV::Transaction.
Definition allocate_phv.h:307
The namespace encapsulating PHV-related stuff.
Definition gateway.h:32
bool trivial_alloc
Definition alloc_setting.h:30
Size
all possible PHV container sizes in BFN devices
Definition phv.h:110
Definition allocate_phv.h:627
Definition utils_v2.h:120
Definition allocator_base.h:248
Definition allocator_base.h:38
Definition utils_v2.h:134
Definition allocator_base.h:59
void collect(const ContScopeAllocResult &rst, const TxScore *score)
update the result list.
Definition allocator_base.cpp:166