Skip to content

Commit

Permalink
WIP: partial fix for issue p4lang#386
Browse files Browse the repository at this point in the history
  • Loading branch information
mbudiu-vmw committed Mar 24, 2017
1 parent b45a1dd commit 80ea11b
Show file tree
Hide file tree
Showing 630 changed files with 7,685 additions and 8,157 deletions.
46 changes: 26 additions & 20 deletions backends/bmv2/jsonconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,12 @@ class ErrorCodesVisitor : public Inspector {
}
};

static cstring extVisibleName(const IR::IDeclaration* decl) {
cstring name = decl->externalName();
if (name.startsWith("."))
return name.substr(1);
return name;
}

// This pass makes sure that when several match tables share a selector, they use the same input for
// the selection algorithm. This is because bmv2 considers that the selection key is part of the
Expand Down Expand Up @@ -160,7 +166,7 @@ class SharedActionSelectorCheck : public Inspector {
::error("%1%: expected a reference to an instance", pathe);
return false;
}
const auto &apname = decl->externalName();
const auto &apname = extVisibleName(decl);
auto dcltype = typeMap->getType(pathe, true);
if (!dcltype->is<IR::Type_Extern>()) {
::error("%1%: unexpected type for implementation", dcltype);
Expand Down Expand Up @@ -441,7 +447,7 @@ class ExpressionConverter : public Inspector {
auto field = st->getField(expression->member);
if (field != nullptr)
// field could be a method call, i.e., isValid.
fieldName = field->externalName();
fieldName = extVisibleName(field);
}

// handle the 'error' type
Expand Down Expand Up @@ -908,7 +914,7 @@ JsonConverter::convertActionBody(const IR::Vector<IR::StatOrDecl>* body,
auto parameters = mkParameters(primitive);
auto ctr = new Util::JsonObject();
ctr->emplace("type", "counter_array");
ctr->emplace("value", em->object->externalName());
ctr->emplace("value", extVisibleName(em->object));
parameters->append(ctr);
auto index = conv->convert(mc->arguments->at(0));
parameters->append(index);
Expand All @@ -921,7 +927,7 @@ JsonConverter::convertActionBody(const IR::Vector<IR::StatOrDecl>* body,
auto parameters = mkParameters(primitive);
auto mtr = new Util::JsonObject();
mtr->emplace("type", "meter_array");
mtr->emplace("value", em->object->externalName());
mtr->emplace("value", extVisibleName(em->object));
parameters->append(mtr);
auto index = conv->convert(mc->arguments->at(0));
parameters->append(index);
Expand All @@ -933,7 +939,7 @@ JsonConverter::convertActionBody(const IR::Vector<IR::StatOrDecl>* body,
BUG_CHECK(mc->arguments->size() == 2, "Expected 2 arguments for %1%", mc);
auto reg = new Util::JsonObject();
reg->emplace("type", "register_array");
cstring name = em->object->externalName();
cstring name = extVisibleName(em->object);
reg->emplace("value", name);
if (em->method->name == v1model.registers.read.name) {
auto primitive = mkPrimitive("register_read", result);
Expand Down Expand Up @@ -1035,7 +1041,7 @@ JsonConverter::convertActionBody(const IR::Vector<IR::StatOrDecl>* body,
BUG_CHECK(origType->is<IR::Type_Struct>(),
"%1%: expected a struct type", origType);
auto st = origType->to<IR::Type_Struct>();
listName = st->externalName();
listName = extVisibleName(st);
}
}
int id = createFieldList(mc->arguments->at(1), "learn_lists",
Expand Down Expand Up @@ -1063,7 +1069,7 @@ JsonConverter::convertActionBody(const IR::Vector<IR::StatOrDecl>* body,
BUG_CHECK(origType->is<IR::Type_Struct>(),
"%1%: expected a struct type", origType);
auto st = origType->to<IR::Type_Struct>();
listName = st->externalName();
listName = extVisibleName(st);
}
}
int id = createFieldList(mc->arguments->at(0), "field_lists",
Expand Down Expand Up @@ -1163,7 +1169,7 @@ Util::JsonArray* JsonConverter::createActions(Util::JsonArray* fieldLists,
v1model.ingress.metadataParam.index);
}

cstring name = action->externalName();
cstring name = extVisibleName(action);
auto jact = new Util::JsonObject();
jact->emplace("name", name);
unsigned id = nextId("actions");
Expand Down Expand Up @@ -1304,7 +1310,7 @@ bool JsonConverter::handleTableImplementation(const IR::Property* implementation
::error("%1%: expected a reference to an instance", pathe);
return false;
}
apname = decl->externalName();
apname = extVisibleName(decl);
auto dcltype = typeMap->getType(pathe, true);
if (!dcltype->is<IR::Type_Extern>()) {
::error("%1%: unexpected type for implementation", dcltype);
Expand Down Expand Up @@ -1355,7 +1361,7 @@ JsonConverter::convertTable(const CFG::TableNode* node,
auto table = node->table;
LOG1("Processing " << table);
auto result = new Util::JsonObject();
cstring name = table->externalName();
cstring name = extVisibleName(table);
result->emplace("name", name);
result->emplace("id", nextId("tables"));
cstring table_match_type = "exact";
Expand Down Expand Up @@ -1495,7 +1501,7 @@ JsonConverter::convertTable(const CFG::TableNode* node,
meterMap.setSize(decl, size);
BUG_CHECK(decl->is<IR::Declaration_Instance>(),
"%1%: expected an instance", decl->getNode());
cstring name = decl->externalName();
cstring name = extVisibleName(decl);
result->emplace("direct_meters", name);
}
} else {
Expand All @@ -1521,7 +1527,7 @@ JsonConverter::convertTable(const CFG::TableNode* node,
auto action = decl->to<IR::P4Action>();
unsigned id = get(structure.ids, action);
action_ids->append(id);
auto name = action->externalName();
auto name = extVisibleName(action);
actions->append(name);
useActionName.emplace(action->name, name);
}
Expand Down Expand Up @@ -1691,7 +1697,7 @@ Util::IJson* JsonConverter::convertControl(const IR::ControlBlock* block, cstrin
if (c->is<IR::Declaration_Instance>()) {
auto bl = block->getValue(c);
CHECK_NULL(bl);
cstring name = c->externalName();
cstring name = extVisibleName(c);
if (bl->is<IR::ExternBlock>()) {
auto eb = bl->to<IR::ExternBlock>();
if (eb->type->name == v1model.counter.name) {
Expand Down Expand Up @@ -1771,7 +1777,7 @@ Util::IJson* JsonConverter::convertControl(const IR::ControlBlock* block, cstrin
type = "both";
jmtr->emplace("type", type);
jmtr->emplace("size", info->tableSize);
cstring tblname = info->table->externalName();
cstring tblname = extVisibleName(info->table);
jmtr->emplace("binding", tblname);
auto result = conv->convert(info->destinationField);
jmtr->emplace("result_target", result->to<Util::JsonObject>()->get("value"));
Expand Down Expand Up @@ -1834,7 +1840,7 @@ void JsonConverter::addHeaderStacks(const IR::Type_Struct* headersStruct) {

LOG1("Creating " << stack);
auto json = new Util::JsonObject();
json->emplace("name", f->externalName());
json->emplace("name", extVisibleName(f));
json->emplace("id", nextId("stack"));
json->emplace("size", stack->getSize());
auto type = typeMap->getTypeType(stack->elementType, true);
Expand All @@ -1849,7 +1855,7 @@ void JsonConverter::addHeaderStacks(const IR::Type_Struct* headersStruct) {
unsigned id = nextId("headers");
stackMembers->append(id);
auto header = new Util::JsonObject();
cstring name = f->externalName() + "[" + Util::toString(i) + "]";
cstring name = extVisibleName(f) + "[" + Util::toString(i) + "]";
header->emplace("name", name);
header->emplace("id", id);
header->emplace("header_type", header_type);
Expand Down Expand Up @@ -2200,9 +2206,9 @@ void JsonConverter::addTypesAndInstances(const IR::Type_StructLike* type, bool m
auto ft = typeMap->getType(f, true);
if (ft->is<IR::Type_StructLike>()) {
auto json = new Util::JsonObject();
json->emplace("name", f->externalName());
json->emplace("name", extVisibleName(f));
json->emplace("id", nextId("headers"));
json->emplace("header_type", ft->to<IR::Type_StructLike>()->externalName());
json->emplace("header_type", extVisibleName(ft->to<IR::Type_StructLike>()));
json->emplace("metadata", meta);
headerInstances->append(json);
} else if (ft->is<IR::Type_Stack>()) {
Expand Down Expand Up @@ -2276,7 +2282,7 @@ void JsonConverter::pushFields(cstring prefix, const IR::Type_StructLike *st,
cstring JsonConverter::createJsonType(const IR::Type_StructLike *st) {
if (headerTypesCreated.count(st->name)) return headerTypesCreated[st->name];
auto typeJson = new Util::JsonObject();
cstring name = st->externalName();
cstring name = extVisibleName(st);
headerTypesCreated[st->name] = name;
typeJson->emplace("name", name);
typeJson->emplace("id", nextId("header_types"));
Expand Down Expand Up @@ -2558,7 +2564,7 @@ Util::IJson* JsonConverter::toJson(const IR::ParserState* state) {
return nullptr;

auto result = new Util::JsonObject();
result->emplace("name", state->externalName());
result->emplace("name", extVisibleName(state));
result->emplace("id", nextId("parse_states"));
auto operations = mkArrayField(result, "parser_ops");
for (auto s : *state->components) {
Expand Down
2 changes: 2 additions & 0 deletions backends/p4test/midend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ limitations under the License.
#include "midend/copyStructures.h"
#include "midend/predication.h"
#include "midend/noMatch.h"
#include "midend/tableHit.h"
#include "midend/expandLookahead.h"
#include "frontends/p4/simplifyParsers.h"
#include "frontends/p4/typeMap.h"
Expand Down Expand Up @@ -132,6 +133,7 @@ MidEnd::MidEnd(CompilerOptions& options) {
new P4::MoveDeclarations(), // more may have been introduced
new P4::SimplifyControlFlow(&refMap, &typeMap),
new P4::CompileTimeOperations(),
new P4::TableHit(&refMap, &typeMap),
new P4::SynthesizeActions(&refMap, &typeMap, new SkipControls(v1controls)),
new P4::MoveActionsToTables(&refMap, &typeMap),
evaluator,
Expand Down
2 changes: 1 addition & 1 deletion backends/p4test/run-p4-sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ def process_file(options, argv):
# We rely on the fact that these keys are in alphabetical order.
rename = { "FrontEnd_12_SimplifyControlFlow": "first",
"FrontEnd_27_FrontEndLast": "frontend",
"MidEnd_35_Evaluator": "midend" }
"MidEnd_34_Evaluator": "midend" }

if options.verbose:
print("Writing temporary files into ", tmpdir)
Expand Down
5 changes: 3 additions & 2 deletions frontends/p4/fromv1.0/programStructure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1385,8 +1385,9 @@ ProgramStructure::convertAction(const IR::ActionFunction* action, cstring newNam
body->push_back(stat);
}

// Save the original action name in an annotation
auto annos = addNameAnnotation(action->name, action->annotations);
// Save the original action name in an annotation.
// The leading dot indicates a global annotation
auto annos = addNameAnnotation(cstring(".") + action->name, action->annotations);
auto result = new IR::P4Action(
action->srcInfo, newName, annos, new IR::ParameterList(params),
new IR::BlockStatement(body->srcInfo, IR::Annotations::empty, body));
Expand Down
8 changes: 7 additions & 1 deletion midend/inlining.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ class ComputeNewNames : public Inspector {
cstring prefix;
P4::ReferenceMap* refMap;
SymRenameMap* renameMap;

public:
ComputeNewNames(cstring prefix, P4::ReferenceMap* refMap, SymRenameMap* renameMap) :
prefix(prefix), refMap(refMap), renameMap(renameMap) {
Expand All @@ -194,7 +195,12 @@ class ComputeNewNames : public Inspector {
void rename(const IR::Declaration* decl) {
BUG_CHECK(decl->is<IR::IAnnotated>(), "%1%: no annotations", decl);
cstring name = decl->externalName();
cstring extName = prefix + "." + name;
cstring extName;
if (name.startsWith("."))
// Do not change the external name of objects starting with a leading dot
extName = name;
else
extName = prefix + "." + name;
cstring baseName = extName.replace('.', '_');
cstring newName = refMap->newName(baseName);
renameMap->setNewName(decl, newName, extName);
Expand Down
12 changes: 6 additions & 6 deletions testdata/p4_14_samples_outputs/01-BigMatch-first.p4
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout
}

control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("nop") action nop() {
@name(".nop") action nop() {
}
@name("e_t1") table e_t1 {
actions = {
Expand All @@ -61,18 +61,18 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
}

control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("nop") action nop() {
@name(".nop") action nop() {
}
@name("set_f1") action set_f1(bit<1024> f1) {
@name(".set_f1") action set_f1(bit<1024> f1) {
meta.ing_metadata.f1 = f1;
}
@name("set_f2") action set_f2(bit<512> f2) {
@name(".set_f2") action set_f2(bit<512> f2) {
meta.ing_metadata.f2 = f2;
}
@name("set_f3") action set_f3(bit<256> f3) {
@name(".set_f3") action set_f3(bit<256> f3) {
meta.ing_metadata.f3 = f3;
}
@name("set_f4") action set_f4(bit<128> f4) {
@name(".set_f4") action set_f4(bit<128> f4) {
meta.ing_metadata.f4 = f4;
}
@name("i_t1") table i_t1 {
Expand Down
12 changes: 6 additions & 6 deletions testdata/p4_14_samples_outputs/01-BigMatch-frontend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout
}

control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("nop") action nop_0() {
@name(".nop") action nop_0() {
}
@name("e_t1") table e_t1_0 {
actions = {
Expand All @@ -61,18 +61,18 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
}

control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("nop") action nop_1() {
@name(".nop") action nop_1() {
}
@name("set_f1") action set_f1_0(bit<1024> f1) {
@name(".set_f1") action set_f1_0(bit<1024> f1) {
meta.ing_metadata.f1 = f1;
}
@name("set_f2") action set_f2_0(bit<512> f2) {
@name(".set_f2") action set_f2_0(bit<512> f2) {
meta.ing_metadata.f2 = f2;
}
@name("set_f3") action set_f3_0(bit<256> f3) {
@name(".set_f3") action set_f3_0(bit<256> f3) {
meta.ing_metadata.f3 = f3;
}
@name("set_f4") action set_f4_0(bit<128> f4) {
@name(".set_f4") action set_f4_0(bit<128> f4) {
meta.ing_metadata.f4 = f4;
}
@name("i_t1") table i_t1_0 {
Expand Down
24 changes: 12 additions & 12 deletions testdata/p4_14_samples_outputs/01-BigMatch-midend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ header vag_t {
}

struct metadata {
@name("ing_metadata")
@name("ing_metadata")
ingress_metadata_t ing_metadata;
}

struct headers {
@name("ethernet")
@name("ethernet")
ethernet_t ethernet;
@name("vag")
@name("vag")
vag_t vag;
}

Expand All @@ -45,7 +45,7 @@ parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout
control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("NoAction") action NoAction_0() {
}
@name("nop") action nop_0() {
@name(".nop") action nop_0() {
}
@name("e_t1") table e_t1 {
actions = {
Expand All @@ -71,24 +71,24 @@ control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_
}
@name("NoAction") action NoAction_9() {
}
@name("nop") action nop_1() {
@name(".nop") action nop_1() {
}
@name("nop") action nop_6() {
@name(".nop") action nop_6() {
}
@name("nop") action nop_7() {
@name(".nop") action nop_7() {
}
@name("nop") action nop_8() {
@name(".nop") action nop_8() {
}
@name("set_f1") action set_f1_0(bit<1024> f1) {
@name(".set_f1") action set_f1_0(bit<1024> f1) {
meta.ing_metadata.f1 = f1;
}
@name("set_f2") action set_f2_0(bit<512> f2) {
@name(".set_f2") action set_f2_0(bit<512> f2) {
meta.ing_metadata.f2 = f2;
}
@name("set_f3") action set_f3_0(bit<256> f3) {
@name(".set_f3") action set_f3_0(bit<256> f3) {
meta.ing_metadata.f3 = f3;
}
@name("set_f4") action set_f4_0(bit<128> f4) {
@name(".set_f4") action set_f4_0(bit<128> f4) {
meta.ing_metadata.f4 = f4;
}
@name("i_t1") table i_t1 {
Expand Down
Loading

0 comments on commit 80ea11b

Please sign in to comment.