P4C
The P4 Compiler
|
Information about the structure of a P4-14 program, used to convert it to a P4-16 program. More...
#include <programStructure.h>
Public Attributes | |
NamedObjectInfo< const IR::ActionProfile * > | action_profiles |
NamedObjectInfo< const IR::ActionSelector * > | action_selectors |
NamedObjectInfo< const IR::ActionFunction * > | actions |
ordered_set< const IR::FieldList * > | allFieldLists |
Field lists that appear in the program. | |
std::unordered_map< cstring, int > | allNames |
std::vector< const IR::CalculatedField * > | calculated_fields |
P4::CallGraph< cstring > | calledActions |
P4::CallGraph< cstring > | calledControls |
P4::CallGraph< cstring > | calledCounters |
P4::CallGraph< cstring > | calledExterns |
P4::CallGraph< cstring > | calledMeters |
P4::CallGraph< cstring > | calledRegisters |
NamedObjectInfo< const IR::V1Control * > | controls |
ConversionContext * | conversionContext = nullptr |
std::map< cstring, const IR::Declaration_Instance * > | counterMap |
NamedObjectInfo< const IR::Counter * > | counters |
IR::Vector< IR::Node > * | declarations |
std::map< cstring, cstring > | directCounters |
std::map< cstring, const IR::Meter * > | directMeters |
Maps table name to direct meter. | |
IR::Vector< IR::Type > * | emptyTypeArguments = nullptr |
std::map< const IR::Type_Extern *, const IR::Type_Extern * > | extern_remap |
NamedObjectInfo< const IR::Type_Extern * > | extern_types |
NamedObjectInfo< const IR::Declaration_Instance * > | externs |
std::map< cstring, IR::Vector< IR::Expression > > | extracts |
std::map< const IR::MethodCallExpression *, const IR::Type_Header * > | extractsSynthesized |
NamedObjectInfo< const IR::FieldListCalculation * > | field_list_calculations |
NamedObjectInfo< const IR::FieldList * > | field_lists |
cstring | fieldListsEnum |
Name of the serializable enum that holds one id for each field list. | |
std::map< cstring, const IR::Type * > | finalHeaderType |
std::map< const IR::Node *, const IR::Declaration_Instance * > | globalInstances |
std::set< cstring > | headerInstances |
NamedObjectInfo< const IR::Header * > | headers |
std::set< cstring > | headerTypes |
std::vector< const IR::Declaration * > | localInstances |
extra local instances to control created by primitive translation | |
NamedObjectInfo< const IR::HeaderOrMetadata * > | metadata |
std::set< cstring > | metadataInstances |
std::set< cstring > | metadataTypes |
std::map< const IR::Meter *, const IR::Declaration_Instance * > | meterMap |
NamedObjectInfo< const IR::Meter * > | meters |
P4::P4CoreLibrary & | p4lib |
std::set< cstring > | parameterTypes |
std::map< cstring, const IR::ParserState * > | parserEntryPoints |
const IR::Parameter * | parserHeadersOut = nullptr |
const IR::Parameter * | parserPacketIn = nullptr |
P4::CallGraph< cstring > | parsers |
NamedObjectInfo< const IR::V1Parser * > | parserStates |
std::map< cstring, cstring > | registerLayoutType |
NamedObjectInfo< const IR::Register * > | registers |
NamedObjectInfo< const IR::HeaderStack * > | stacks |
std::map< const IR::V1Table *, const IR::Apply * > | tableInvocation |
std::map< const IR::V1Table *, const IR::V1Control * > | tableMapping |
NamedObjectInfo< const IR::V1Table * > | tables |
NamedObjectInfo< const IR::Type_StructLike * > | types |
P4V1::V1Model & | v1model |
NamedObjectInfo< const IR::ParserValueSet * > | value_sets |
std::set< cstring > | value_sets_implemented |
Protected Member Functions | |
virtual void | checkHeaderType (const IR::Type_StructLike *hrd, bool toStruct) |
virtual const IR::Statement * | convertPrimitive (const IR::Primitive *primitive) |
' annotation for the | |||
Extend the provided set of annotations with an ' given name. This is used to preserve the original, P4-14 object names. In general, because P4-14 names do not have the hierarchical structure that P4-16 names do, you should use addGlobalNameAnnotation() rather than this method. The exception is type names; these are already global in P4-16, so there isn't much to be gained, and there is currently some code that doesn't handling "." prefixes in type names well. XXX(seth): For uniformity, we should probably fix the issues with "." in type names and get rid of this method.
| |||
const IR::V1Control * | ingress | ||
IR::ID | ingressReference | ||
const IR::P4Control * | verifyChecksums | ||
const IR::P4Control * | updateChecksums | ||
const IR::P4Control * | deparser | ||
const IR::Expression * | latest | ||
Represents 'latest' P4-14 construct. | |||
const int | defaultRegisterWidth = 32 | ||
void | include (cstring filename, cstring ppoptions=cstring()) | ||
void | populateOutputNames () | ||
const IR::AssignmentStatement * | assign (Util::SourceInfo srcInfo, const IR::Expression *left, const IR::Expression *right, const IR::Type *type) | ||
virtual const IR::Expression * | convertFieldList (const IR::Expression *expression) | ||
virtual const IR::Expression * | convertHashAlgorithm (Util::SourceInfo srcInfo, IR::ID algorithm) | ||
virtual const IR::Expression * | convertHashAlgorithms (const IR::NameList *algorithm) | ||
virtual const IR::Declaration_Instance * | convert (const IR::Register *reg, cstring newName, const IR::Type *regElementType=nullptr) | ||
virtual const IR::Type_Struct * | createFieldListType (const IR::Expression *expression) | ||
virtual const IR::FieldListCalculation * | getFieldListCalculation (const IR::Expression *) | ||
virtual const IR::FieldList * | getFieldLists (const IR::FieldListCalculation *flc) | ||
virtual const IR::Expression * | paramReference (const IR::Parameter *param) | ||
const IR::Statement * | sliceAssign (const IR::Primitive *prim, const IR::Expression *left, const IR::Expression *right, const IR::Expression *mask) | ||
void | tablesReferred (const IR::V1Control *control, std::vector< const IR::V1Table * > &out) | ||
bool | isHeader (const IR::ConcreteHeaderRef *nhr) const | ||
cstring | makeUniqueName (cstring base) | ||
bool | isFieldInList (cstring type, cstring field, const IR::FieldList *fl) const | ||
virtual const IR::Vector< IR::Expression > * | listIndexes (cstring type, cstring field) const | ||
const IR::Expression * | listIndex (const IR::Expression *fl) const | ||
const IR::Type * | explodeType (const std::vector< const IR::Type::Bits * > &fieldTypes) | ||
const IR::Expression * | explodeLabel (const IR::Constant *value, const IR::Constant *mask, const std::vector< const IR::Type::Bits * > &fieldTypes) | ||
virtual IR::Vector< IR::Argument > * | createApplyArguments (cstring n) | ||
virtual void | loadModel () | ||
void | createExterns () | ||
void | createTypes () | ||
virtual const IR::P4Program * | create (Util::SourceInfo info) | ||
virtual const IR::ParserState * | convertParser (const IR::V1Parser *, IR::IndexedVector< IR::Declaration > *) | ||
virtual const IR::Statement * | convertParserStatement (const IR::Expression *expr) | ||
virtual const IR::P4Control * | convertControl (const IR::V1Control *control, cstring newName) | ||
virtual const IR::Declaration_Instance * | convertDirectMeter (const IR::Meter *m, cstring newName) | ||
virtual const IR::Declaration_Instance * | convertDirectCounter (const IR::Counter *c, cstring newName) | ||
virtual const IR::Declaration_Instance * | convert (const IR::CounterOrMeter *cm, cstring newName) | ||
virtual const IR::Declaration_Instance * | convertActionProfile (const IR::ActionProfile *, cstring newName) | ||
virtual const IR::P4Table * | convertTable (const IR::V1Table *table, cstring newName, IR::IndexedVector< IR::Declaration > &stateful, std::map< cstring, cstring > &) | ||
virtual const IR::P4Action * | convertAction (const IR::ActionFunction *action, cstring newName, const IR::Meter *meterToAccess, cstring counterToAccess) | ||
virtual const IR::Statement * | convertMeterCall (const IR::Meter *meterToAccess) | ||
virtual const IR::Statement * | convertCounterCall (cstring counterToAccess) | ||
virtual const IR::Type_Control * | controlType (IR::ID name) | ||
const IR::PathExpression * | getState (IR::ID dest) | ||
virtual const IR::Expression * | counterType (const IR::CounterOrMeter *cm) | ||
virtual void | createChecksumVerifications () | ||
virtual void | createChecksumUpdates () | ||
virtual void | createStructures () | ||
virtual cstring | createType (const IR::Type_StructLike *type, bool header, std::unordered_set< const IR::Type * > *converted) | ||
virtual void | createParser () | ||
virtual void | createControls () | ||
void | createDeparserInternal (IR::ID deparserId, IR::Parameter *packetOut, IR::Parameter *headers, std::vector< IR::Parameter * >, IR::IndexedVector< IR::Declaration > controlLocals, std::function< IR::BlockStatement *(IR::BlockStatement *)>) | ||
virtual void | createDeparser () | ||
virtual void | createMain () | ||
static const IR::Annotations * | addNameAnnotation (cstring name, const IR::Annotations *annos=nullptr) | ||
static const IR::Annotations * | addGlobalNameAnnotation (cstring name, const IR::Annotations *annos=nullptr) | ||
Information about the structure of a P4-14 program, used to convert it to a P4-16 program.
|
staticprotected |
Like addNameAnnotation(), but prefixes a "." to make the name global. You should generally prefer this method;
|
protectedvirtual |
convert a P4-14 parser to P4-16 parser state.
parser | The P4-14 parser IR node to be converted |
stateful | If any declaration is created during the conversion, save to 'stateful' |
|
protectedvirtual |
do not convert control block if it is not invoked by other control block and it is not ingress or egress.
const IR::Expression * P4::P4V1::ProgramStructure::listIndex | ( | const IR::Expression * | fl | ) | const |
Given an expression which is supposed to be a field list return a constant representing its value in the fieldListsEnum.
|
virtual |
A vector with indexes of the field lists that contain this field. Returns nullptr if the field does not appear in any list.
void P4::P4V1::ProgramStructure::populateOutputNames | ( | ) |
This inserts the names of the identifiers used in the output P4-16 programs into allNames, forcing P4-14 names that clash to be renamed.
std::map<cstring, const IR::Meter *> P4::P4V1::ProgramStructure::directMeters |
Maps table name to direct meter.
Maps table to direct counter.
std::map<const IR::MethodCallExpression *, const IR::Type_Header *> P4::P4V1::ProgramStructure::extractsSynthesized |
Maps each inserted extract statement to the type of the header type that is being extracted. The extracts will need another pass to cope with varbit fields.
std::map<cstring, const IR::Type *> P4::P4V1::ProgramStructure::finalHeaderType |
Some types are transformed during conversion; this maps the original P4-14 header type name to the final P4-16 Type_Header. We can't use the P4-14 type object itself as a key, because it keeps changing.