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

Public Member Functions

 ReplaceHeaders (P4::TypeMap *typeMap, FindHeaderTypesToReplace *findHeaderTypesToReplace)
 
const IR::Node * postorder (IR::Member *expression) override
 
const IR::Node * postorder (IR::Type_Header *type) override
 
const IR::Node * preorder (IR::P4Program *program) override
 

Detailed Description

This pass flattens any nested struct inside a P4 header. This pass will fail if a header with nested fields is used as a left-value.

Should be run before the flattenInterfaceStructs pass.

For example, see the data structures below.

struct alt_t { bit<1> valid; bit<7> port; };

struct row_t { alt_t alt0; alt_t alt1; };

header bitvec_hdr { row_t row; }

struct col_t { bitvec_hdr bvh; }

struct local_metadata_t { row_t row0; row_t row1; col_t col; bitvec_hdr bvh0; bitvec_hdr bvh1; };

The flattened data structures are shown below.

struct alt_t { bit<1> valid; bit<7> port; }

struct row_t { alt_t alt0; alt_t alt1; }

header bitvec_hdr { bit<1> _row_alt0_valid0; bit<7> _row_alt0_port1; bit<1> _row_alt1_valid2; bit<7> _row_alt1_port3; }

struct col_t { bitvec_hdr bvh; }

struct local_metadata_t { bit<1> _row0_alt0_valid0; bit<7> _row0_alt0_port1; bit<1> _row0_alt1_valid2; bit<7> _row0_alt1_port3; bit<1> _row1_alt0_valid4; bit<7> _row1_alt0_port5; bit<1> _row1_alt1_valid6; bit<7> _row1_alt1_port7; bitvec_hdr _col_bvh8; bitvec_hdr _bvh09; bitvec_hdr _bvh110; }