Skip to content
Open
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
3 changes: 2 additions & 1 deletion midend/eliminateActionRun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ const IR::Expression *ElimActionRun::RewriteActionRun::postorder(IR::Member *mem
BUG_CHECK(parent && parent->is<IR::SwitchStatement>(), "action_run not in switch");
auto &pps = self.prepend_statement[parent];
pps.push_back(new IR::MethodCallStatement(mce));
self.add_to_control.push_back(info.action_run);
if (!self.add_to_control.getDeclaration(info.action_run->name))
self.add_to_control.push_back(info.action_run);
return new IR::PathExpression(new IR::Type_Name(info.action_tags->name), info.action_run->name);
}

Expand Down
2 changes: 1 addition & 1 deletion midend/eliminateActionRun.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ class ElimActionRun : public PassManager {
std::map<cstring, atinfo_t> actionRunTables;
std::map<cstring, atinfo_t *> actionsToModify;
std::map<const IR::Statement *, IR::IndexedVector<IR::StatOrDecl>> prepend_statement;
IR::Vector<IR::Declaration> add_to_control;
IR::IndexedVector<IR::Declaration> add_to_control;

class ActionTableUse : public Inspector, public ResolutionContext {
ElimActionRun &self;
Expand Down
62 changes: 62 additions & 0 deletions testdata/p4_16_samples/elimActRun2.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <core.p4>

@command_line("--preferSwitch")

header ethernet_t {
bit<48> dst_addr;
bit<48> src_addr;
bit<16> eth_type;
}

struct Headers {
ethernet_t eth_hdr;
}

control ingress(inout Headers h) {
action dummy_action() { }
action other_action() { h.eth_hdr.dst_addr |= 1; }
table simple_table_1 {
key = {
48w1 : exact @name("key") ;
}
actions = {
other_action();
dummy_action();
}
}
table simple_table_2 {
key = {
48w1 : exact @name("key") ;
}
actions = {
dummy_action();
}
}
apply {
switch (simple_table_1.apply().action_run) {
dummy_action: {
switch (simple_table_2.apply().action_run) {
dummy_action: {
h.eth_hdr.src_addr = 4;
return;
}
}
}
other_action: {
h.eth_hdr.dst_addr |= 2;
switch (simple_table_2.apply().action_run) {
dummy_action: {
h.eth_hdr.src_addr = 5;
return;
}
}
}
}
exit;

}
}

control c<H>(inout H h);
package top<H>(c<H> c);
top(ingress()) main;
72 changes: 72 additions & 0 deletions testdata/p4_16_samples_outputs/elimActRun2-first.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include <core.p4>

@command_line("--preferSwitch") header ethernet_t {
bit<48> dst_addr;
bit<48> src_addr;
bit<16> eth_type;
}

struct Headers {
ethernet_t eth_hdr;
}

control ingress(inout Headers h) {
action dummy_action() {
}
action other_action() {
h.eth_hdr.dst_addr |= 48w1;
}
table simple_table_1 {
key = {
48w1: exact @name("key");
}
actions = {
other_action();
dummy_action();
@defaultonly NoAction();
}
default_action = NoAction();
}
table simple_table_2 {
key = {
48w1: exact @name("key");
}
actions = {
dummy_action();
@defaultonly NoAction();
}
default_action = NoAction();
}
apply {
switch (simple_table_1.apply().action_run) {
dummy_action: {
switch (simple_table_2.apply().action_run) {
dummy_action: {
h.eth_hdr.src_addr = 48w4;
return;
}
default: {
}
}
}
other_action: {
h.eth_hdr.dst_addr |= 48w2;
switch (simple_table_2.apply().action_run) {
dummy_action: {
h.eth_hdr.src_addr = 48w5;
return;
}
default: {
}
}
}
default: {
}
}
exit;
}
}

control c<H>(inout H h);
package top<H>(c<H> c);
top<Headers>(ingress()) main;
84 changes: 84 additions & 0 deletions testdata/p4_16_samples_outputs/elimActRun2-frontend.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#include <core.p4>

@command_line("--preferSwitch") header ethernet_t {
bit<48> dst_addr;
bit<48> src_addr;
bit<16> eth_type;
}

struct Headers {
ethernet_t eth_hdr;
}

control ingress(inout Headers h) {
@name("ingress.hasReturned") bool hasReturned;
@noWarn("unused") @name(".NoAction") action NoAction_1() {
}
@noWarn("unused") @name(".NoAction") action NoAction_2() {
}
@name("ingress.dummy_action") action dummy_action() {
}
@name("ingress.dummy_action") action dummy_action_1() {
}
@name("ingress.other_action") action other_action() {
h.eth_hdr.dst_addr = h.eth_hdr.dst_addr | 48w1;
}
@name("ingress.simple_table_1") table simple_table {
key = {
48w1: exact @name("key");
}
actions = {
other_action();
dummy_action();
@defaultonly NoAction_1();
}
default_action = NoAction_1();
}
@name("ingress.simple_table_2") table simple_table_0 {
key = {
48w1: exact @name("key");
}
actions = {
dummy_action_1();
@defaultonly NoAction_2();
}
default_action = NoAction_2();
}
apply {
hasReturned = false;
switch (simple_table.apply().action_run) {
dummy_action: {
switch (simple_table_0.apply().action_run) {
dummy_action_1: {
h.eth_hdr.src_addr = 48w4;
hasReturned = true;
}
default: {
}
}
}
other_action: {
h.eth_hdr.dst_addr = h.eth_hdr.dst_addr | 48w2;
switch (simple_table_0.apply().action_run) {
dummy_action_1: {
h.eth_hdr.src_addr = 48w5;
hasReturned = true;
}
default: {
}
}
}
default: {
}
}
if (hasReturned) {
;
} else {
exit;
}
}
}

control c<H>(inout H h);
package top<H>(c<H> c);
top<Headers>(ingress()) main;
150 changes: 150 additions & 0 deletions testdata/p4_16_samples_outputs/elimActRun2-midend.p4
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
enum simple_table_action_run_t {
simple_table_other_action,
simple_table_dummy_action,
simple_table_NoAction
}

enum simple_table_0_action_run_t {
simple_table_0_dummy_action,
simple_table_0_NoAction
}

#include <core.p4>

@command_line("--preferSwitch") header ethernet_t {
bit<48> dst_addr;
bit<48> src_addr;
bit<16> eth_type;
}

struct Headers {
ethernet_t eth_hdr;
}

control ingress(inout Headers h) {
simple_table_action_run_t simple_table_action_run;
simple_table_0_action_run_t simple_table_0_action_run;
@name("ingress.hasReturned") bool hasReturned;
bit<48> key_0;
bit<48> key_1;
@noWarn("unused") @name(".NoAction") action NoAction_1() {
simple_table_action_run = simple_table_action_run_t.simple_table_NoAction;
}
@noWarn("unused") @name(".NoAction") action NoAction_2() {
simple_table_0_action_run = simple_table_0_action_run_t.simple_table_0_NoAction;
}
@name("ingress.dummy_action") action dummy_action() {
simple_table_action_run = simple_table_action_run_t.simple_table_dummy_action;
}
@name("ingress.dummy_action") action dummy_action_1() {
simple_table_0_action_run = simple_table_0_action_run_t.simple_table_0_dummy_action;
}
@name("ingress.other_action") action other_action() {
simple_table_action_run = simple_table_action_run_t.simple_table_other_action;
h.eth_hdr.dst_addr = h.eth_hdr.dst_addr | 48w1;
}
@name("ingress.simple_table_1") table simple_table {
key = {
key_0: exact @name("key");
}
actions = {
other_action();
dummy_action();
@defaultonly NoAction_1();
}
default_action = NoAction_1();
}
@name("ingress.simple_table_2") table simple_table_0 {
key = {
key_1: exact @name("key");
}
actions = {
dummy_action_1();
@defaultonly NoAction_2();
}
default_action = NoAction_2();
}
@hidden action elimActRun2l20() {
hasReturned = false;
key_0 = 48w1;
}
@hidden action elimActRun2l29() {
key_1 = 48w1;
}
@hidden action elimActRun2l40() {
h.eth_hdr.src_addr = 48w4;
hasReturned = true;
}
@hidden action elimActRun2l29_0() {
h.eth_hdr.dst_addr = h.eth_hdr.dst_addr | 48w2;
key_1 = 48w1;
}
@hidden action elimActRun2l49() {
h.eth_hdr.src_addr = 48w5;
hasReturned = true;
}
@hidden table tbl_elimActRun2l20 {
actions = {
elimActRun2l20();
}
const default_action = elimActRun2l20();
}
@hidden table tbl_elimActRun2l29 {
actions = {
elimActRun2l29();
}
const default_action = elimActRun2l29();
}
@hidden table tbl_elimActRun2l40 {
actions = {
elimActRun2l40();
}
const default_action = elimActRun2l40();
}
@hidden table tbl_elimActRun2l29_0 {
actions = {
elimActRun2l29_0();
}
const default_action = elimActRun2l29_0();
}
@hidden table tbl_elimActRun2l49 {
actions = {
elimActRun2l49();
}
const default_action = elimActRun2l49();
}
apply {
tbl_elimActRun2l20.apply();
simple_table.apply();
switch (simple_table_action_run) {
simple_table_action_run_t.simple_table_dummy_action: {
tbl_elimActRun2l29.apply();
simple_table_0.apply();
switch (simple_table_0_action_run) {
simple_table_0_action_run_t.simple_table_0_dummy_action: {
tbl_elimActRun2l40.apply();
}
default: {
}
}
}
simple_table_action_run_t.simple_table_other_action: {
tbl_elimActRun2l29_0.apply();
simple_table_0.apply();
switch (simple_table_0_action_run) {
simple_table_0_action_run_t.simple_table_0_dummy_action: {
tbl_elimActRun2l49.apply();
}
default: {
}
}
}
default: {
}
}
}
}

control c<H>(inout H h);
package top<H>(c<H> c);
top<Headers>(ingress()) main;
Loading
Loading