P4C
The P4 Compiler
Loading...
Searching...
No Matches
Packing of bridged and fixed-size headers

Overview of passes that adjust packing of bridged headers. More...

Collaboration diagram for Packing of bridged and fixed-size headers:

Classes

class  BridgedPacking
 The pass analyzes the usage of bridged headers and adjusts their packing. More...
 
class  RenameArchParams
 Pass that governs replacement of the user-supplied parameter names with the corresponding parameter names defined in the architecture. More...
 
class  SubstitutePackedHeaders
 The pass substitutes bridged headers with adjusted ones and converts the IR into the backend form. More...
 

Typedefs

using RepackedHeaderTypes = ordered_map<cstring, const IR::Type_StructLike *>
 Adjusted packing of bridged and fixed-size headers; output of BFN::BridgedPacking, input for BFN::SubstitutePackedHeaders.
 

Detailed Description

Overview of passes that adjust packing of bridged headers.

Packing of bridged headers is performed in order to satisfy constraints induced by the processing threads where the bridged headers are used. Bridging can be used from an ingress to an egress processing thread of a possibly different pipe, from an egress to an ingress processing thread of the same pipe in the case of a folded program, or the combination of both.

The egress to ingress bridging is available on Tofino 32Q with loopbacks present at pipes 1 and 3. It is not available on Tofino 64Q with no loopbacks.

The case of the combination of both bridging in a folded program is shown below:

Packets are processed in a "logical" pipe(line) that spans multiple "physical" pipe(line)s. Using the backend's terminology, the packet is processed by four threads of the IR::BFN::Pipe::thread_t type in a run-to-completion manner.

All bridged headers needs to be analyzed in all threads they are used in. They are emitted by the source thread and extracted by the destination thread. In the case above, if a bridged header is used in all threads, the analysis is performed on pairs (pipe0:ingress, pipe1:egress), (pipe1:egress, pipe1:ingress), and (pipe1:ingress, pipe0:egress) (following the arrows).

Packing of bridged headers is performed only for the headers/structs with the @flexible annotation and for resubmit headers, which are fixed-sized (transformed into the IR::BFN::Type_FixedSizeHeader type in midend).

The steps are as follows:

  1. BFN::BridgedPacking: Perform some auxiliary passes and convert the midend IR towards the backend IR (BackendConverter).
  2. BFN::BridgedPacking -> ExtractBridgeInfo::preorder(IR::P4Program): Find usages of bridged headers (CollectBridgedFieldsUse).
  3. BFN::BridgedPacking -> ExtractBridgeInfo::end_apply(): For all pairs of gresses where the bridged headers are used, perform some auxiliary backend passes (under PackFlexibleHeaders) and collect the constraints of bridged headers (FlexiblePacking).
  4. BFN::BridgedPacking -> ExtractBridgeInfo::end_apply() -> PackFlexibleHeaders::solve() -> FlexiblePacking::solve() -> PackWithConstraintSolver::solve() -> ConstraintSolver::solve(): Use Z3 solver to find a satisfying packing of the bridged headers, which is stored in the RepackedHeaderTypes map.
  5. BFN::BridgedPacking -> PadFixedSizeHeaders: Look for fixed-size headers and add their adjusted packing to the RepackedHeaderTypes map.
  6. The modifications of the auxiliary passes performed in 1., the converted backend IR, and the modifications of auxiliary backend passes performed in 3. are thrown away.
  7. BFN::SubstitutePackedHeaders -> ReplaceFlexibleType::postorder: The solution found by the Z3 solver is used to substitute the original bridged headers with adjusted ones. Fixed-size headers are also substituted with adjusted ones.
  8. BFN::SubstitutePackedHeaders: Perform the same auxiliary passes and convert the IR towards the backend IR as in 1. and perform the PostMidEndLast pass.

Class Documentation

◆ BridgedPacking

class BridgedPacking

The pass analyzes the usage of bridged headers and adjusts their packing.

Precondition
Apply this pass manager to IR::P4Program after midend processing.
Postcondition
The RepackedHeaderTypes map filled in with adjusted packing of bridged headers.
Inheritance diagram for BridgedPacking:
[legend]

Public Member Functions

 BridgedPacking (BFN_Options &options, RepackedHeaderTypes &repackMap, CollectSourceInfoLogging &sourceInfoLogging)
 
- Public Member Functions inherited from P4::PassManager
 PassManager (const PassManager &)=default
 
 PassManager (const std::initializer_list< VisitorRef > &init)
 
 PassManager (PassManager &&)=default
 
void addDebugHook (DebugHook h, bool recursive=false)
 
void addDebugHooks (std::vector< DebugHook > hooks, bool recursive=false)
 
void addPasses (const std::initializer_list< VisitorRef > &init)
 
const IR::Nodeapply_visitor (const IR::Node *, const char *=0) override
 
bool backtrack (trigger &trig) override
 
PassManagerclone () const override
 
void early_exit ()
 
void listPasses (std::ostream &, cstring sep) const
 
bool never_backtracks () override
 
void removePasses (const std::vector< cstring > &exclude)
 
void setStopOnError (bool stop)
 
- Public Member Functions inherited from P4::Visitor
virtual bool check_clone (const Visitor *a)
 
virtual bool check_global (cstring)
 
virtual void clear_globals ()
 
virtual ControlFlowVisitorcontrolFlowVisitor ()
 
virtual void end_apply ()
 
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 Visitorflow_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 ContextgetChildContext () const
 
int getChildrenVisited () const
 
const ContextgetContext () const
 
int getContextDepth () const
 
const IR::NodegetCurrentNode () const
 
template<class T >
const T * getCurrentNode () const
 
const IR::NodegetOriginal () 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 VisitorsetCalledBy (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
 
- Public Member Functions inherited from P4::Backtrack

Public Attributes

IR::Vector< IR::BFN::Pipe > pipe
 
ordered_map< int, const IR::BFN::Pipe * > pipes
 
P4::ReferenceMap refMap
 
P4::TypeMap typeMap
 
- Public Attributes inherited from P4::Visitor
const Visitorcalled_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_basesplit_link_mem = nullptr
 

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)
 
- Protected Member Functions inherited from P4::PassManager
profile_t init_apply (const IR::Node *root) override
 
void runDebugHooks (const char *visitorName, const IR::Node *node)
 
- 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)
 
virtual void visitAgain () const
 
virtual void visitOnce () const
 
- Protected Attributes inherited from P4::PassManager
safe_vector< DebugHookdebugHooks
 
safe_vector< Visitor * > passes
 
bool running = false
 
unsigned seqNo = 0
 
bool stop_on_error = true
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

◆ RenameArchParams

class RenameArchParams

Pass that governs replacement of the user-supplied parameter names with the corresponding parameter names defined in the architecture.

Inheritance diagram for RenameArchParams:
[legend]

Public Member Functions

 RenameArchParams (P4::ReferenceMap *refMap, P4::TypeMap *typeMap)
 

◆ SubstitutePackedHeaders

class SubstitutePackedHeaders

The pass substitutes bridged headers with adjusted ones and converts the IR into the backend form.

Inheritance diagram for SubstitutePackedHeaders:
[legend]

Public Member Functions

 SubstitutePackedHeaders (BFN_Options &options, const RepackedHeaderTypes &repackedMap, CollectSourceInfoLogging &sourceInfoLogging)
 
const BFN::ProgramPipelinesgetPipelines () const
 
const IR::ToplevelBlock * getToplevelBlock () const
 
- Public Member Functions inherited from P4::PassManager
 PassManager (const PassManager &)=default
 
 PassManager (const std::initializer_list< VisitorRef > &init)
 
 PassManager (PassManager &&)=default
 
void addDebugHook (DebugHook h, bool recursive=false)
 
void addDebugHooks (std::vector< DebugHook > hooks, bool recursive=false)
 
void addPasses (const std::initializer_list< VisitorRef > &init)
 
const IR::Nodeapply_visitor (const IR::Node *, const char *=0) override
 
bool backtrack (trigger &trig) override
 
PassManagerclone () const override
 
void early_exit ()
 
void listPasses (std::ostream &, cstring sep) const
 
bool never_backtracks () override
 
void removePasses (const std::vector< cstring > &exclude)
 
void setStopOnError (bool stop)
 
- Public Member Functions inherited from P4::Visitor
virtual bool check_clone (const Visitor *a)
 
virtual bool check_global (cstring)
 
virtual void clear_globals ()
 
virtual ControlFlowVisitorcontrolFlowVisitor ()
 
virtual void end_apply ()
 
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 Visitorflow_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 ContextgetChildContext () const
 
int getChildrenVisited () const
 
const ContextgetContext () const
 
int getContextDepth () const
 
const IR::NodegetCurrentNode () const
 
template<class T >
const T * getCurrentNode () const
 
const IR::NodegetOriginal () 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 VisitorsetCalledBy (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
 
- Public Member Functions inherited from P4::Backtrack

Public Attributes

IR::Vector< IR::BFN::Pipe > pipe
 
ordered_map< int, const IR::BFN::Pipe * > pipes
 
P4::ReferenceMap refMap
 
P4::TypeMap typeMap
 
- Public Attributes inherited from P4::Visitor
const Visitorcalled_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_basesplit_link_mem = nullptr
 

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)
 
- Protected Member Functions inherited from P4::PassManager
profile_t init_apply (const IR::Node *root) override
 
void runDebugHooks (const char *visitorName, const IR::Node *node)
 
- 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)
 
virtual void visitAgain () const
 
virtual void visitOnce () const
 
- Protected Attributes inherited from P4::PassManager
safe_vector< DebugHookdebugHooks
 
safe_vector< Visitor * > passes
 
bool running = false
 
unsigned seqNo = 0
 
bool stop_on_error = true
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

Typedef Documentation

◆ RepackedHeaderTypes

using RepackedHeaderTypes = ordered_map<cstring, const IR::Type_StructLike *>

Adjusted packing of bridged and fixed-size headers; output of BFN::BridgedPacking, input for BFN::SubstitutePackedHeaders.

There are two sources of adjusted packing:

  • PackWithConstraintSolver::solve
  • PadFixedSizeHeaders::preorder

Adjusted packing is then used in the ReplaceFlexibleType pass.