P4C
The P4 Compiler
|
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::Node * | apply_visitor (const IR::Node *, const char *=0) override |
bool | backtrack (trigger &trig) override |
PassManager * | clone () 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 ControlFlowVisitor * | controlFlowVisitor () |
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 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 |
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 Visitor * | called_by = nullptr |
cstring | internalName |
SplitFlowVisit_base *& | split_link |
SplitFlowVisit_base * | split_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< DebugHook > | debugHooks |
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 |
|
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)