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

Public Member Functions

 EmitAction (const MauAsmOutput &s, std::ostream &o, const IR::MAU::Table *tbl, indent_t i)
 
- Public Member Functions inherited from P4::Inspector
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 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 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 Member Functions inherited from TofinoWriteContext
bool isIxbarRead (bool root_value=false)
 
bool isRead (bool root_value=false)
 
bool isWrite (bool root_value=false)
 

Protected Member Functions

void action_context_json (const IR::MAU::Action *act)
 
void handle_hash_dist (const IR::Expression *expr)
 
void handle_phv_expr (const IR::Expression *expr)
 
void handle_random_number (const IR::Expression *expr)
 
void mod_cond_value (const IR::MAU::Action *act)
 
void next_table (const IR::MAU::Action *act, int mem_code)
 
void postorder (const IR::MAU::Action *) override
 
void postorder (const IR::MAU::Instruction *) override
 
bool preorder (const IR::Annotation *) override
 
bool preorder (const IR::BAnd *e) override
 
bool preorder (const IR::BoolLiteral *c) override
 
bool preorder (const IR::Cast *c) override
 
bool preorder (const IR::Constant *c) override
 
bool preorder (const IR::Expression *exp) override
 
bool preorder (const IR::LAnd *e) override
 
bool preorder (const IR::LNot *) override
 
bool preorder (const IR::LOr *e) override
 
bool preorder (const IR::MAU::Action *act) override
 
bool preorder (const IR::MAU::ActionArg *a) override
 
bool preorder (const IR::MAU::ActionDataConstant *adc) override
 
bool preorder (const IR::MAU::AttachedOutput *att) override
 
bool preorder (const IR::MAU::ConditionalArg *) override
 
bool preorder (const IR::MAU::HashDist *hd) override
 
bool preorder (const IR::MAU::Instruction *inst) override
 
bool preorder (const IR::MAU::IXBarExpression *e) override
 
bool preorder (const IR::MAU::MultiOperand *mo) override
 
bool preorder (const IR::MAU::RandomNumber *rn) override
 
bool preorder (const IR::MAU::SaluAction *act) override
 
bool preorder (const IR::MAU::SaluFunction *fn) override
 
bool preorder (const IR::MAU::SaluReg *r) override
 
bool preorder (const IR::MAU::SaluRegfileRow *srr) override
 
bool preorder (const IR::MAU::StatefulCounter *sc) override
 
bool preorder (const IR::MAU::WrappedSlice *sl) override
 
bool preorder (const IR::Member *m) override
 
bool preorder (const IR::Neg *) override
 
bool preorder (const IR::Node *n) override
 
bool preorder (const IR::Slice *sl) override
 
bool preorder_binop (const IR::Operation::Binary *bin, const char *op)
 
- 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

std::map< cstring, cstringalias
 
indent_t indent
 
bool is_empty = false
 
std::ostream & out
 
const MauAsmOutputself
 
const char * sep = nullptr
 
const IR::MAU::Table * table
 
- Protected Attributes inherited from P4::Visitor
bool dontForwardChildrenBeforePreorder = false
 
bool joinFlows = false
 
bool visitDagOnce = true
 

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 Visitorcalled_by = nullptr
 
cstring internalName
 
SplitFlowVisit_base *& split_link
 
SplitFlowVisit_basesplit_link_mem = nullptr
 

Member Function Documentation

◆ handle_hash_dist()

void MauAsmOutput::EmitAction::handle_hash_dist ( const IR::Expression * expr)
inlineprotected

HashDist IR object have already been converted in InstructionAdjustment

◆ mod_cond_value()

void MauAsmOutput::EmitAction::mod_cond_value ( const IR::MAU::Action * act)
inlineprotected

In order to fill out the context JSON nodes in the pack format:

  • is_mod_field_conditionally_value
  • mod_field_conditionally_mask_field_name

which are required for the src1 & mask, described in action_format.h in the Parameter class, this function is required. This dumps out a map:

  • key - The names of conditional parameters in an action
  • value - The regions of action format that are conditionally controlled by this key

I think this is fairly ugly, but was the only concise way to correctly handle all corner cases, rather than having the assembler have to work through potential bitmasked-set instructions in order to potentially find which regions are controlled.

◆ next_table()

void MauAsmOutput::EmitAction::next_table ( const IR::MAU::Action * act,
int mem_code )
inlineprotected

Outputs the next table configuration for this action: Two possible nodes to be output:

  • next_table: The next table to be run with the table hits. Either a name of a table or an offset into the hit table.
  • next_table_miss: The next table to be run when the table misses.

If the table behavior is identical on hit or miss, then the next_table_miss is not output. If the table is miss_only(), then no next_table node is output.

◆ preorder()

bool MauAsmOutput::EmitAction::preorder ( const IR::MAU::MultiOperand * mo)
inlineoverrideprotected

With instructions now over potential slices, must keep this information passed down through the entirety of the action pass