P4C
The P4 Compiler
Loading...
Searching...
No Matches
P4::DPDK::SplitP4TableCommon Class Reference

#include <dpdkArch.h>

Inheritance diagram for P4::DPDK::SplitP4TableCommon:
[legend]

Public Types

enum class  TableImplementation { DEFAULT , ACTION_PROFILE , ACTION_SELECTOR }
 
- Public Types inherited from P4::Visitor
typedef Visitor_Context Context
 

Public Member Functions

 SplitP4TableCommon (P4::ReferenceMap *refMap, P4::TypeMap *typeMap, DpdkProgramStructure *structure, SwitchHandler &sw)
 
const IR::P4Action * create_action (cstring, cstring, cstring)
 
const IR::P4Table * create_group_table (const IR::P4Table *, cstring, cstring, cstring, unsigned, unsigned)
 
std::tuple< const IR::P4Table *, cstring, cstringcreate_match_table (const IR::P4Table *)
 
const IR::P4Table * create_member_table (const IR::P4Table *, cstring, cstring)
 
IR::Expression * initializeMemberAndGroupId (cstring tableName, IR::IndexedVector< IR::StatOrDecl > *decls)
 
const IR::Nodepostorder (IR::IfStatement *) override
 assume the RemoveMiss and SimplifyControlFlow pass is applied
 
const IR::Nodepostorder (IR::MethodCallStatement *) override
 
const IR::Nodepostorder (IR::P4Control *) override
 
const IR::Nodepostorder (IR::SwitchStatement *) override
 
- Public Member Functions inherited from P4::Transform
const IR::Nodeapply_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 const IR::Nodepostorder (IR::Node *n)
 
virtual const IR::Nodepreorder (IR::Node *n)
 
void prune ()
 
virtual void revisit (const IR::Node *, const IR::Node *)
 
void revisit_visited ()
 
bool visit_in_progress (const IR::Node *) 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 Visitorclone () const
 
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 Attributes

std::map< cstring, cstringgroup_ids
 
std::map< cstring, cstringgroup_tables
 
TableImplementation implementation
 
std::set< cstringmatch_tables
 
std::map< cstring, cstringmember_ids
 
std::map< cstring, cstringmember_tables
 
P4::ReferenceMaprefMap
 
DpdkProgramStructurestructure
 
SwitchHandlersw
 
P4::TypeMaptypeMap
 
- Public Attributes inherited from P4::Visitor
const Visitorcalled_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_basesplit_link_mem = nullptr
 

Additional Inherited Members

- 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::Transform
const IR::Nodetransform_child (const IR::Node *child)
 
- 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::Transform
bool forceClone = false
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

Detailed Description

Common code between SplitActionSelectorTable and SplitActionProfileTable

Member Function Documentation

◆ create_match_table()

std::tuple< const IR::P4Table *, cstring, cstring > P4::DPDK::SplitP4TableCommon::create_match_table ( const IR::P4Table * tbl)

create P4Table object that represents the matching part of the original P4 table. This table sets the internal group_id or member_id which are used for subsequent table lookup.

◆ initializeMemberAndGroupId()

IR::Expression * P4::DPDK::SplitP4TableCommon::initializeMemberAndGroupId ( cstring tableName,
IR::IndexedVector< IR::StatOrDecl > * decls )

Member_id and/or group_id must be initialized prior to member table apply. An action selector table can either set a group_id which in turns set the member_id or it can directly set a member_id. Member table is always applied in either case. Hence, we initialize member_id with 0 as it will always have a valid value based on the base table match Since the values of member_id and group_id are set during run-time, to make a decision whether to apply the group table or not, we initialize group_id with the maximum possible value (this is 32-bit as per PSA specification) and compare this initial value with the group_id at run-time.