Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

P4_14 register related fixes #542

Merged
merged 2 commits into from
Apr 28, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion backends/bmv2/jsonconverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2089,7 +2089,7 @@ void JsonConverter::addHeaderStacks(const IR::Type_Struct* headersStruct) {
auto ht = type->to<IR::Type_Header>();
createJsonType(ht);

cstring header_type = stack->elementType->to<IR::Type_Header>()->name;
cstring header_type = extVisibleName(stack->elementType->to<IR::Type_Header>());
json->emplace("header_type", header_type);
auto stackMembers = mkArrayField(json, "header_ids");
for (unsigned i=0; i < stack->getSize(); i++) {
Expand Down
2 changes: 1 addition & 1 deletion frontends/p4-14/typecheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class TypeCheck::AssignInitialTypes : public Transform {
if (auto bbox = prop_ctxt->parent->node->to<IR::Declaration_Instance>()) {
if (auto bbox_type = bbox->type->to<IR::Type_Extern>()) {
auto attr = bbox_type->attributes.get<IR::Attribute>(prop->name);
if (attr->locals && attr->locals->locals.count(ref->path->name)) {
if (attr && attr->locals && attr->locals->locals.count(ref->path->name)) {
return attr->locals->locals.at(ref->path->name); } } } }
if (auto bbox = findContext<IR::Declaration_Instance>()) {
if (auto bbox_type = bbox->type->to<IR::Type_Extern>()) {
Expand Down
17 changes: 8 additions & 9 deletions frontends/p4/fromv1.0/converters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,12 @@ class DiscoverStructure : public Inspector {
explicit DiscoverStructure(ProgramStructure* structure) : structure(structure)
{ CHECK_NULL(structure); setName("DiscoverStructure"); }

void postorder(const IR::Metadata* md) override {
structure->metadata.emplace(md);
structure->types.emplace(md->type); }
void postorder(const IR::Header* hd) override {
structure->headers.emplace(hd);
structure->types.emplace(hd->type); }
void postorder(const IR::Metadata* md) override
{ structure->metadata.emplace(md); }
void postorder(const IR::Header* hd) override
{ structure->headers.emplace(hd); }
void postorder(const IR::Type_StructLike *t) override
{ structure->types.emplace(t); }
void postorder(const IR::V1Control* control) override
{ structure->controls.emplace(control); }
void postorder(const IR::V1Parser* parser) override
Expand All @@ -342,9 +342,8 @@ class DiscoverStructure : public Inspector {
{ structure->tables.emplace(table); }
void postorder(const IR::ActionFunction* action) override
{ structure->actions.emplace(action); }
void postorder(const IR::HeaderStack* stack) override {
structure->stacks.emplace(stack);
structure->types.emplace(stack->type); }
void postorder(const IR::HeaderStack* stack) override
{ structure->stacks.emplace(stack); }
void postorder(const IR::Counter* count) override
{ structure->counters.emplace(count); }
void postorder(const IR::Register* reg) override
Expand Down
36 changes: 31 additions & 5 deletions frontends/p4/fromv1.0/programStructure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ void ProgramStructure::checkHeaderType(const IR::Type_StructLike* hdr, bool meta
}

void ProgramStructure::createTypes() {
// FIXME -- refactor this to reduce the excessive duplication
std::unordered_set<const IR::Type *> converted;
for (auto it : metadata) {
auto type = it.first->type;
Expand All @@ -108,6 +109,23 @@ void ProgramStructure::createTypes() {
declarations->push_back(type);
converted.emplace(type);
}
for (auto it : registers) {
if (it.first->layout) {
auto type = types.get(it.first->layout);
if (converted.count(type))
continue;
converted.emplace(type);
auto type_name = types.get(type);
type = type->apply(TypeConverter(this));
if (type->name.name != type_name) {
auto annos = addNameAnnotation(type->name.name, type->annotations);
type = new IR::Type_Struct(type->srcInfo, type_name, annos, type->fields);
}
checkHeaderType(type, true);
declarations->push_back(type);
converted.emplace(type);
}
}

converted.clear();
for (auto it : headers) {
Expand Down Expand Up @@ -1426,21 +1444,29 @@ const IR::Expression* ProgramStructure::counterType(const IR::CounterOrMeter* cm
const IR::Declaration_Instance*
ProgramStructure::convert(const IR::Register* reg, cstring newName) {
LOG1("Synthesizing " << reg);
int width = reg->width;
if (width <= 0) {
const IR::Type *regElementType = nullptr;
if (reg->width > 0) {
regElementType = IR::Type_Bits::get(reg->width);
} else if (reg->layout) {
regElementType = types.get(reg->layout);
} else {
::warning("%1%: Register width unspecified; using %2%", reg, defaultRegisterWidth);
width = defaultRegisterWidth;
regElementType = IR::Type_Bits::get(defaultRegisterWidth);
}

auto regElementType = IR::Type_Bits::get(width);
IR::ID ext = v1model.registers.Id();
auto typepath = new IR::Path(ext);
auto type = new IR::Type_Name(typepath);
auto typeargs = new IR::Vector<IR::Type>();
typeargs->push_back(regElementType);
auto spectype = new IR::Type_Specialized(type, typeargs);
auto args = new IR::Vector<IR::Expression>();
args->push_back(new IR::Constant(v1model.registers.size_type, reg->instance_count));
if (reg->direct) {
// FIXME -- do we need a direct_register extern in v1model? For now
// using size of 0 to specify a direct register
args->push_back(new IR::Constant(v1model.registers.size_type, 0));
} else {
args->push_back(new IR::Constant(v1model.registers.size_type, reg->instance_count)); }
auto annos = addNameAnnotation(reg->name, reg->annotations);
auto decl = new IR::Declaration_Instance(newName, annos, spectype, args, nullptr);
return decl;
Expand Down
2 changes: 2 additions & 0 deletions midend/validateProperties.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class ValidateTableProperties : public Inspector {
legalProperties.emplace(l);
}
void postorder(const IR::Property* property) override;
/* don't check properties in externs (Declaration_Instances) */
bool preorder(const IR::Declaration_Instance *) override { return false; }
};

} // namespace P4
Expand Down
16 changes: 8 additions & 8 deletions testdata/p4_14_samples_outputs/instruct1-first.p4
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ header data_t {
bit<8> b4;
}

header data2_t {
@name("data2_t") header data2_t_0 {
bit<16> x1;
bit<16> x2;
}
Expand All @@ -22,23 +22,23 @@ struct metadata {

struct headers {
@name("data")
data_t data;
data_t data;
@name("hdr1")
data2_t hdr1;
data2_t_0 hdr1;
@name("hdr2")
data2_t hdr2;
data2_t_0 hdr2;
}

parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("parse_data2") state parse_data2 {
packet.extract<data2_t>(hdr.hdr1);
packet.extract<data2_t_0>(hdr.hdr1);
transition select(hdr.hdr1.x1) {
16w1 &&& 16w1: parse_hdr2;
default: accept;
}
}
@name("parse_hdr2") state parse_hdr2 {
packet.extract<data2_t>(hdr.hdr2);
packet.extract<data2_t_0>(hdr.hdr2);
transition accept;
}
@name("start") state start {
Expand Down Expand Up @@ -81,8 +81,8 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
control DeparserImpl(packet_out packet, in headers hdr) {
apply {
packet.emit<data_t>(hdr.data);
packet.emit<data2_t>(hdr.hdr1);
packet.emit<data2_t>(hdr.hdr2);
packet.emit<data2_t_0>(hdr.hdr1);
packet.emit<data2_t_0>(hdr.hdr2);
}
}

Expand Down
16 changes: 8 additions & 8 deletions testdata/p4_14_samples_outputs/instruct1-frontend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ header data_t {
bit<8> b4;
}

header data2_t {
@name("data2_t") header data2_t_0 {
bit<16> x1;
bit<16> x2;
}
Expand All @@ -22,23 +22,23 @@ struct metadata {

struct headers {
@name("data")
data_t data;
data_t data;
@name("hdr1")
data2_t hdr1;
data2_t_0 hdr1;
@name("hdr2")
data2_t hdr2;
data2_t_0 hdr2;
}

parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("parse_data2") state parse_data2 {
packet.extract<data2_t>(hdr.hdr1);
packet.extract<data2_t_0>(hdr.hdr1);
transition select(hdr.hdr1.x1) {
16w1 &&& 16w1: parse_hdr2;
default: accept;
}
}
@name("parse_hdr2") state parse_hdr2 {
packet.extract<data2_t>(hdr.hdr2);
packet.extract<data2_t_0>(hdr.hdr2);
transition accept;
}
@name("start") state start {
Expand Down Expand Up @@ -81,8 +81,8 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
control DeparserImpl(packet_out packet, in headers hdr) {
apply {
packet.emit<data_t>(hdr.data);
packet.emit<data2_t>(hdr.hdr1);
packet.emit<data2_t>(hdr.hdr2);
packet.emit<data2_t_0>(hdr.hdr1);
packet.emit<data2_t_0>(hdr.hdr2);
}
}

Expand Down
16 changes: 8 additions & 8 deletions testdata/p4_14_samples_outputs/instruct1-midend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ header data_t {
bit<8> b4;
}

header data2_t {
@name("data2_t") header data2_t_0 {
bit<16> x1;
bit<16> x2;
}
Expand All @@ -22,23 +22,23 @@ struct metadata {

struct headers {
@name("data")
data_t data;
data_t data;
@name("hdr1")
data2_t hdr1;
data2_t_0 hdr1;
@name("hdr2")
data2_t hdr2;
data2_t_0 hdr2;
}

parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("parse_data2") state parse_data2 {
packet.extract<data2_t>(hdr.hdr1);
packet.extract<data2_t_0>(hdr.hdr1);
transition select(hdr.hdr1.x1) {
16w1 &&& 16w1: parse_hdr2;
default: accept;
}
}
@name("parse_hdr2") state parse_hdr2 {
packet.extract<data2_t>(hdr.hdr2);
packet.extract<data2_t_0>(hdr.hdr2);
transition accept;
}
@name("start") state start {
Expand Down Expand Up @@ -83,8 +83,8 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
control DeparserImpl(packet_out packet, in headers hdr) {
apply {
packet.emit<data_t>(hdr.data);
packet.emit<data2_t>(hdr.hdr1);
packet.emit<data2_t>(hdr.hdr2);
packet.emit<data2_t_0>(hdr.hdr1);
packet.emit<data2_t_0>(hdr.hdr2);
}
}

Expand Down
8 changes: 4 additions & 4 deletions testdata/p4_14_samples_outputs/instruct1.p4
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ header data_t {
bit<8> b4;
}

header data2_t {
@name("data2_t") header data2_t_0 {
bit<16> x1;
bit<16> x2;
}
Expand All @@ -22,11 +22,11 @@ struct metadata {

struct headers {
@name("data")
data_t data;
data_t data;
@name("hdr1")
data2_t hdr1;
data2_t_0 hdr1;
@name("hdr2")
data2_t hdr2;
data2_t_0 hdr2;
}

parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
Expand Down
10 changes: 5 additions & 5 deletions testdata/p4_14_samples_outputs/instruct5-first.p4
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ header data_t {
bit<8> more;
}

header data2_t {
@name("data2_t") header data2_t_0 {
bit<24> x1;
bit<8> more;
}
Expand All @@ -20,14 +20,14 @@ struct metadata {

struct headers {
@name("data")
data_t data;
data_t data;
@name("extra")
data2_t[4] extra;
data2_t_0[4] extra;
}

parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("parse_extra") state parse_extra {
packet.extract<data2_t>(hdr.extra.next);
packet.extract<data2_t_0>(hdr.extra.next);
transition select(hdr.extra.last.more) {
8w0: accept;
default: parse_extra;
Expand Down Expand Up @@ -99,7 +99,7 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
control DeparserImpl(packet_out packet, in headers hdr) {
apply {
packet.emit<data_t>(hdr.data);
packet.emit<data2_t[4]>(hdr.extra);
packet.emit<data2_t_0[4]>(hdr.extra);
}
}

Expand Down
10 changes: 5 additions & 5 deletions testdata/p4_14_samples_outputs/instruct5-frontend.p4
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ header data_t {
bit<8> more;
}

header data2_t {
@name("data2_t") header data2_t_0 {
bit<24> x1;
bit<8> more;
}
Expand All @@ -20,14 +20,14 @@ struct metadata {

struct headers {
@name("data")
data_t data;
data_t data;
@name("extra")
data2_t[4] extra;
data2_t_0[4] extra;
}

parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
@name("parse_extra") state parse_extra {
packet.extract<data2_t>(hdr.extra.next);
packet.extract<data2_t_0>(hdr.extra.next);
transition select(hdr.extra.last.more) {
8w0: accept;
default: parse_extra;
Expand Down Expand Up @@ -99,7 +99,7 @@ control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t
control DeparserImpl(packet_out packet, in headers hdr) {
apply {
packet.emit<data_t>(hdr.data);
packet.emit<data2_t[4]>(hdr.extra);
packet.emit<data2_t_0[4]>(hdr.extra);
}
}

Expand Down
Loading