P4C
The P4 Compiler
Loading...
Searching...
No Matches
TableLayout Class Reference
Inheritance diagram for TableLayout:
[legend]

Public Member Functions

 TableLayout (PhvInfo &p, LayoutChoices &l, SplitAttachedInfo &sia)
 
- 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

Static Public Member Functions

static void check_for_alpm (IR::MAU::Table::Layout &, const IR::MAU::Table *tbl, cstring &partition_index, const PhvInfo &phv)
 
static void check_for_atcam (IR::MAU::Table::Layout &layout, const IR::MAU::Table *tbl, cstring &partition_index, const PhvInfo &phv)
 
static void check_for_ternary (IR::MAU::Table::Layout &layout, const IR::MAU::Table *tbl)
 
- Static Public Member Functions inherited from P4::Visitor
static cstring demangle (const char *)
 
static bool warning_enabled (const Visitor *visitor, int warning_kind)
 

Additional Inherited Members

- Public Types inherited from P4::Visitor
typedef Visitor_Context Context
 
- Public Attributes inherited from P4::Visitor
const Visitorcalled_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_basesplit_link_mem = nullptr
 
- 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
 

Member Function Documentation

◆ check_for_atcam()

void TableLayout::check_for_atcam ( IR::MAU::Table::Layout & layout,
const IR::MAU::Table * tbl,
cstring & partition_index,
const PhvInfo & phv )
static

Algorithmic TCAM is a third type of table, in the same vein as ternary and exact. An ATCAM table is a ternary table that Tofino can implement using exact hardware, specifically the SRAM array.

A ternary match requires two things that a normal exact match cannot. A ternary match must be able to specify a don't care for any bit, and must have a priority system in order to rank the matches. By using particular features of the SRAM array, the Tofino target can create these features.

The don't care bit is possible due by containing any ternary match data twice in the RAM line. The match data is encoded to match as 0, 1, or don't care. This is briefly described in section 6.4.2.2 Algorithmic TCAM section of the Tofino uArch, while the encoding scheme for ternary match in general is described in section 6.3.1 TCAM Data Representation. The terms s0q1 and s1q0 describe these different encodings.

Priority is engineered through the placement of RAMs in a row. If the RAMs are in the same row, and belong to the same ATCAM table, then if multiple tables match, as is possible within a single TCAM table, the one closer to the edge of the chip will have higher priority and will be the match. If the algorithm cannot fit all of the entries within a single row, then the table will be split into multiple logical tables, and will use hit/miss predication of these logical tables in order to generate priority across tables. This is described by section 1.4.5 Algorithmic TCAM Overview in the uArch.

An ATCAM table requires a partition index. This is an field in the key that must be an exact match. This partition index is used as an identity hash to find the correct partition within the massive ATCAM table.

The user can also specify the number of partitions. In a standard TCAM, the size of the table specifies how many entries are looked up (logically) simultaneously. In an ATCAM table, the number of entries that are looked up simultaneously is: table_size / number_of_partitions

If no number of partitions is specified, then the number of partitions is: 2 ^ (partition index bits)