P4C
The P4 Compiler
|
#include <table_phv_constraints.h>
Public Member Functions | |
TableFieldPackOptimization (PhvInfo &p) | |
std::list< PHV::FieldSlice > | getPackCandidate (const PHV::FieldSlice &fs) const |
int | getPackScore (const ordered_set< PHV::AllocSlice > &parent, const ordered_set< PHV::AllocSlice > &slices) const |
Public Member Functions inherited from P4::Inspector | |
const IR::Node * | apply_visitor (const IR::Node *, const char *name=0) override |
profile_t | init_apply (const IR::Node *root) override |
virtual void | loop_revisit (const IR::Node *) |
virtual void | postorder (const IR::Node *) |
virtual bool | preorder (const IR::Node *) |
virtual void | revisit (const IR::Node *) |
void | revisit_visited () |
bool | visit_in_progress (const IR::Node *n) const |
void | visitAgain () const override |
void | visitOnce () const override |
Public Member Functions inherited from P4::Visitor | |
virtual bool | check_global (cstring) |
virtual void | clear_globals () |
virtual Visitor * | clone () const |
virtual ControlFlowVisitor * | controlFlowVisitor () |
virtual void | end_apply (const IR::Node *root) |
virtual void | erase_global (cstring) |
template<class T > | |
const T * | findContext () const |
template<class T > | |
const T * | findContext (const Context *&c) const |
template<class T > | |
const T * | findOrigCtxt () const |
template<class T > | |
const T * | findOrigCtxt (const Context *&c) const |
virtual Visitor & | flow_clone () |
virtual void | flow_merge (Visitor &) |
virtual bool | flow_merge_closure (Visitor &) |
virtual void | flow_merge_global_from (cstring) |
virtual void | flow_merge_global_to (cstring) |
const Context * | getChildContext () const |
int | getChildrenVisited () const |
const Context * | getContext () const |
int | getContextDepth () const |
const IR::Node * | getCurrentNode () const |
template<class T > | |
const T * | getCurrentNode () const |
const IR::Node * | getOriginal () const |
template<class T > | |
const T * | getOriginal () const |
template<class T > | |
const T * | getParent () const |
virtual bool | has_flow_joins () const |
profile_t | init_apply (const IR::Node *root, const Context *parent_context) |
bool | isInContext (const IR::Node *n) const |
virtual const char * | name () const |
template<class T > | |
void | parallel_visit (const IR::Vector< T > &v, const char *name, int cidx) |
template<class T > | |
void | parallel_visit (const IR::Vector< T > &v, const char *name=0) |
template<class T > | |
void | parallel_visit (IR::Vector< T > &v, const char *name, int cidx) |
template<class T > | |
void | parallel_visit (IR::Vector< T > &v, const char *name=0) |
void | print_context () const |
const Visitor & | setCalledBy (const Visitor *visitor) |
void | setName (const char *name) |
void | visit (const IR::Node &n, const char *name, int cidx) |
void | visit (const IR::Node &n, const char *name=0) |
void | visit (const IR::Node *&n, const char *name, int cidx) |
void | visit (const IR::Node *&n, const char *name=0) |
void | visit (const IR::Node *const &n, const char *name, int cidx) |
void | visit (const IR::Node *const &n, const char *name=0) |
void | visit (IR::Node &n, const char *name, int cidx) |
void | visit (IR::Node &n, const char *name=0) |
void | visit (IR::Node *&, const char *=0, int=0) |
template<class T , typename = std::enable_if_t<Util::has_SourceInfo_v<T> && !std::is_pointer_v<T>>, class... Args> | |
void | warn (const int kind, const char *format, const T &node, Args &&...args) |
The const ref variant of the above. | |
template<class T , typename = std::enable_if_t<Util::has_SourceInfo_v<T>>, class... Args> | |
void | warn (const int kind, const char *format, const T *node, Args &&...args) |
bool | warning_enabled (int warning_kind) const |
Additional Inherited Members | |
Public Types inherited from P4::Visitor | |
typedef Visitor_Context | Context |
Static Public Member Functions inherited from P4::Visitor | |
static cstring | demangle (const char *) |
static bool | warning_enabled (const Visitor *visitor, int warning_kind) |
Public Attributes inherited from P4::Visitor | |
const Visitor * | called_by = nullptr |
cstring | internalName |
SplitFlowVisit_base *& | split_link |
SplitFlowVisit_base * | split_link_mem = nullptr |
Protected Member Functions inherited from P4::Visitor | |
virtual void | init_join_flows (const IR::Node *) |
virtual bool | join_flows (const IR::Node *) |
virtual void | post_join_flows (const IR::Node *, const IR::Node *) |
void | visit_children (const IR::Node *, std::function< void()> fn) |
Protected Attributes inherited from P4::Visitor | |
bool | dontForwardChildrenBeforePreorder = false |
bool | joinFlows = false |
bool | visitDagOnce = true |
This class gather match field information to optimize XBar, SRAM and TCAM resources. The idea is to share match bytes as much as possible among fields. Small field or flags are the one that should benefit the most from this optimization. On typical compilation mode, scoring is used to compare various super cluster allocation and find the solution that is the most optimal from the match resource perspective. Table size is also part of the score compute such that bigger table that would benefit the most from a specific packing are prioritize over smaller one.
This pass is also used by table first approach to get pack candidate when doing trivial PHV allocation. The idea in this case is to find small field or flag that can be combined on the same match byte to reduce pressure on XBar, SRAM and TCAM.
std::list< PHV::FieldSlice > TableFieldPackOptimization::getPackCandidate | ( | const PHV::FieldSlice & | fs | ) | const |
Return a list of PHV::FieldSlice that are good candidate to be packed with the provided PHV::FieldSlice fs. The returned list is sorted in reverse order such that the first elements are the one that would benefit the most from being packed with the provided PHV::FieldSlice fs. Only Metadata field are considered in this process. The returned list can contains FieldSlice of the same Field as the input FieldSlice but with a range that does not intersect with it. The returned FieldSlice can also specify a range that is different from the PHV slicing, e.g.: f1[2:7] while in PHV this field was sliced like f1[0:1], f1[2:3], f1[4:7]. In this case the caller must map the returned FieldSlice with the current slice for a particular field.
Multiple FieldSlice that refer to the same Field with intersecting range can also be returned, e.g.: f1[0:7], f1[0:3]. In this case the order on which they appear should be considered.
An empty list can be returned if no potential candidate are found.
int TableFieldPackOptimization::getPackScore | ( | const ordered_set< PHV::AllocSlice > & | parent, |
const ordered_set< PHV::AllocSlice > & | slices ) const |
Return the packing score of this new transaction over the committed one for a specific container. The score is based on individual new slices among them plus the score versus the parent transaction.