P4C
The P4 Compiler
 
Loading...
Searching...
No Matches
P4::KeySideEffect Class Reference
Inheritance diagram for P4::KeySideEffect:

Public Member Functions

 KeySideEffect (ReferenceMap *refMap, TypeMap *typeMap, std::set< const IR::P4Table * > *invokedInKey)
 
virtual const IR::Node * doStatement (const IR::Statement *statement, const IR::Expression *expression)
 
const IR::Node * postorder (IR::AssignmentStatement *statement) override
 
const IR::Node * postorder (IR::IfStatement *statement) override
 
const IR::Node * postorder (IR::KeyElement *element) override
 
const IR::Node * postorder (IR::MethodCallStatement *statement) override
 
const IR::Node * postorder (IR::P4Table *table) override
 
const IR::Node * postorder (IR::SwitchStatement *statement) override
 
const IR::Node * preorder (IR::Key *key) override
 
const IR::Node * preorder (IR::P4Table *table) override
 

Protected Attributes

std::set< const IR::P4Table * > * invokedInKey
 
ReferenceMaprefMap
 
std::map< const IR::P4Table *, TableInsertions * > toInsert
 
TypeMaptypeMap
 

Detailed Description

This pass is an adaptation of the midend code SimplifyKey. If a key computation involves side effects then all key field computations are lifted prior to the table application. We need to lift all key field computations since the order of side-effects needs to be preserved.

table t {
key = { a: exact,
f() : exact; }
...
}
apply {
t.apply();
}

is transformed to

bit<32> key_0;
bit<32> key_1;
table t {
key = { key_0 : exact;
key_1 : exact; }
...
}
apply {
key_0 = a;
key_1 = f();
t.apply();
}
Precondition
none
Postcondition
all complex table key expressions are replaced with a simpler expression.