[ONOS-6904] Add ecmp feature to default.p4

Change-Id: I3837b3cc8d931dece030ab30bd4d15a7031fb646
diff --git a/tools/test/p4src/p4-16/default.p4 b/tools/test/p4src/p4-16/default.p4
index e38ec64..302d068 100644
--- a/tools/test/p4src/p4-16/default.p4
+++ b/tools/test/p4src/p4-16/default.p4
@@ -21,6 +21,7 @@
 
 struct metadata_t {
     intrinsic_metadata_t intrinsic_metadata;
+    ecmp_group_id_t ecmp_group_id;
 }
 
 #include "include/parsers.p4"
@@ -30,16 +31,12 @@
 #include "include/packet_io.p4"
 
 control ingress(inout headers_t hdr, inout metadata_t meta, inout standard_metadata_t standard_metadata) {
-
-    /*
-    FIXME:
-    It seems that with BMv2 it is not possible to use the same indirect table (like table0 with the
-    implementation attribute enabled), with table entries that use direct actions (e.g. send_to_cpu()).
-    A separate table for ECMP should be created.
-    */
-
     direct_counter(CounterType.packets) table0_counter;
-    // action_selector(HashAlgorithm.crc16, 32w64, 32w16) ecmp_selector;
+    direct_counter(CounterType.packets) ecmp_counter;
+
+    action do_ecmp(inout metadata_t meta, ecmp_group_id_t ecmp_group_id) {
+        meta.ecmp_group_id = ecmp_group_id;
+    }
 
     table table0 {
         /*
@@ -52,23 +49,37 @@
             hdr.ethernet.dstAddr           : ternary;
             hdr.ethernet.srcAddr           : ternary;
             hdr.ethernet.etherType         : ternary;
+        }
+        actions = {
+            set_egress_port(standard_metadata);
+            send_to_cpu(standard_metadata);
+            do_ecmp(meta);
+            drop(standard_metadata);
+        }
+        counters = table0_counter;
+    }
+
+    action_selector(HashAlgorithm.crc16, 32w64, 32w16) ecmp_selector;
+    table ecmp {
+        support_timeout = false;
+
+        key = {
+            meta.ecmp_group_id             : exact;
             // Not for matching.
             // Inputs to the hash function of the action selector.
-            /* hdr.ipv4.srcAddr               : selector;
+            hdr.ipv4.srcAddr               : selector;
             hdr.ipv4.dstAddr               : selector;
             hdr.ipv4.protocol              : selector;
             hdr.tcp.srcPort                : selector;
             hdr.tcp.dstPort                : selector;
             hdr.udp.srcPort                : selector;
-            hdr.udp.dstPort                : selector; */
+            hdr.udp.dstPort                : selector;
         }
         actions = {
             set_egress_port(standard_metadata);
-            send_to_cpu(standard_metadata);
-            drop(standard_metadata);
         }
-        counters = table0_counter;
-        // implementation = ecmp_selector;
+        implementation = ecmp_selector;
+        counters = ecmp_counter;
     }
 
     PacketIoIngressControl() packet_io_ingress_control;
@@ -77,11 +88,15 @@
     apply {
         packet_io_ingress_control.apply(hdr, standard_metadata);
         if (!hdr.packet_out.isValid()) {
-            table0.apply();
+            switch(table0.apply().action_run) {
+                do_ecmp: {
+                    ecmp.apply();
+                }
+            }
         }
+
         port_counters_control.apply(hdr, meta, standard_metadata);
     }
-
 }
 
 control egress(inout headers_t hdr, inout metadata_t meta, inout standard_metadata_t standard_metadata) {
diff --git a/tools/test/p4src/p4-16/include/defines.p4 b/tools/test/p4src/p4-16/include/defines.p4
index 88256f8..ea6747a 100644
--- a/tools/test/p4src/p4-16/include/defines.p4
+++ b/tools/test/p4src/p4-16/include/defines.p4
@@ -24,6 +24,7 @@
 #define IP_TYPE_UDP 8w17
 
 typedef bit<9> port_t;
+typedef bit<8> ecmp_group_id_t;
 
 const port_t CPU_PORT = 255;
 const port_t DROP_PORT = 511;
diff --git a/tools/test/p4src/p4-16/p4c-out/default.json b/tools/test/p4src/p4-16/p4c-out/default.json
index 7a26032d..94f2125 100644
--- a/tools/test/p4src/p4-16/p4c-out/default.json
+++ b/tools/test/p4src/p4-16/p4c-out/default.json
@@ -10,7 +10,8 @@
       "id" : 0,
       "fields" : [
         ["tmp", 32, false],
-        ["tmp_0", 32, false]
+        ["tmp_0", 32, false],
+        ["metadata_t.ecmp_group_id", 8, false]
       ]
     },
     {
@@ -38,9 +39,19 @@
       ]
     },
     {
-      "name" : "ethernet_t",
+      "name" : "intrinsic_metadata_t",
       "id" : 2,
       "fields" : [
+        ["ingress_global_timestamp", 32, false],
+        ["lf_field_list", 32, false],
+        ["mcast_grp", 16, false],
+        ["egress_rid", 16, false]
+      ]
+    },
+    {
+      "name" : "ethernet_t",
+      "id" : 3,
+      "fields" : [
         ["dstAddr", 48, false],
         ["srcAddr", 48, false],
         ["etherType", 16, false]
@@ -48,7 +59,7 @@
     },
     {
       "name" : "ipv4_t",
-      "id" : 3,
+      "id" : 4,
       "fields" : [
         ["version", 4, false],
         ["ihl", 4, false],
@@ -66,7 +77,7 @@
     },
     {
       "name" : "tcp_t",
-      "id" : 4,
+      "id" : 5,
       "fields" : [
         ["srcPort", 16, false],
         ["dstPort", 16, false],
@@ -83,7 +94,7 @@
     },
     {
       "name" : "udp_t",
-      "id" : 5,
+      "id" : 6,
       "fields" : [
         ["srcPort", 16, false],
         ["dstPort", 16, false],
@@ -93,7 +104,7 @@
     },
     {
       "name" : "packet_out_header_t",
-      "id" : 6,
+      "id" : 7,
       "fields" : [
         ["egress_port", 9, false],
         ["_padding_0", 7, false]
@@ -101,21 +112,11 @@
     },
     {
       "name" : "packet_in_header_t",
-      "id" : 7,
+      "id" : 8,
       "fields" : [
         ["ingress_port", 9, false],
         ["_padding_1", 7, false]
       ]
-    },
-    {
-      "name" : "intrinsic_metadata_t",
-      "id" : 8,
-      "fields" : [
-        ["ingress_global_timestamp", 32, false],
-        ["lf_field_list", 32, false],
-        ["mcast_grp", 16, false],
-        ["egress_rid", 16, false]
-      ]
     }
   ],
   "headers" : [
@@ -141,64 +142,78 @@
       "pi_omit" : true
     },
     {
-      "name" : "scalars",
+      "name" : "standard_metadata_6",
       "id" : 3,
+      "header_type" : "standard_metadata",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "meta_1_intrinsic_metadata",
+      "id" : 4,
+      "header_type" : "intrinsic_metadata_t",
+      "metadata" : true,
+      "pi_omit" : true
+    },
+    {
+      "name" : "scalars",
+      "id" : 5,
       "header_type" : "scalars_0",
       "metadata" : true,
       "pi_omit" : true
     },
     {
       "name" : "standard_metadata",
-      "id" : 4,
+      "id" : 6,
       "header_type" : "standard_metadata",
       "metadata" : true,
       "pi_omit" : true
     },
     {
       "name" : "ethernet",
-      "id" : 5,
+      "id" : 7,
       "header_type" : "ethernet_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "ipv4",
-      "id" : 6,
+      "id" : 8,
       "header_type" : "ipv4_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "tcp",
-      "id" : 7,
+      "id" : 9,
       "header_type" : "tcp_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "udp",
-      "id" : 8,
+      "id" : 10,
       "header_type" : "udp_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "packet_out",
-      "id" : 9,
+      "id" : 11,
       "header_type" : "packet_out_header_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "packet_in",
-      "id" : 10,
+      "id" : 12,
       "header_type" : "packet_in_header_t",
       "metadata" : false,
       "pi_omit" : true
     },
     {
       "name" : "intrinsic_metadata",
-      "id" : 11,
+      "id" : 13,
       "header_type" : "intrinsic_metadata_t",
       "metadata" : true,
       "pi_omit" : true
@@ -210,12 +225,12 @@
   "header_union_stacks" : [],
   "field_lists" : [],
   "errors" : [
-    ["NoError", 1],
-    ["PacketTooShort", 2],
-    ["NoMatch", 3],
-    ["StackOutOfBounds", 4],
-    ["HeaderTooShort", 5],
-    ["ParserTimeout", 6]
+    ["NoError", 0],
+    ["PacketTooShort", 1],
+    ["NoMatch", 2],
+    ["StackOutOfBounds", 3],
+    ["HeaderTooShort", 4],
+    ["ParserTimeout", 5]
   ],
   "enums" : [],
   "parsers" : [
@@ -395,8 +410,8 @@
       "name" : "deparser",
       "id" : 0,
       "source_info" : {
-        "filename" : "include/parsers.p4",
-        "line" : 48,
+        "filename" : "./include/parsers.p4",
+        "line" : 64,
         "column" : 8,
         "source_fragment" : "DeparserImpl"
       },
@@ -412,11 +427,17 @@
       "binding" : "table0"
     },
     {
-      "name" : "port_counters_control.egress_port_counter",
+      "name" : "ecmp_counter",
       "id" : 1,
+      "is_direct" : true,
+      "binding" : "ecmp"
+    },
+    {
+      "name" : "port_counters_control.egress_port_counter",
+      "id" : 2,
       "source_info" : {
-        "filename" : "include/port_counters.p4",
-        "line" : 6,
+        "filename" : "./include/port_counters.p4",
+        "line" : 22,
         "column" : 38,
         "source_fragment" : "egress_port_counter"
       },
@@ -425,10 +446,10 @@
     },
     {
       "name" : "port_counters_control.ingress_port_counter",
-      "id" : 2,
+      "id" : 3,
       "source_info" : {
-        "filename" : "include/port_counters.p4",
-        "line" : 7,
+        "filename" : "./include/port_counters.p4",
+        "line" : 23,
         "column" : 38,
         "source_fragment" : "ingress_port_counter"
       },
@@ -463,8 +484,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -482,8 +503,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -501,8 +522,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -520,8 +541,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -539,8 +560,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -558,8 +579,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -577,8 +598,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -596,8 +617,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -615,8 +636,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -634,8 +655,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -653,8 +674,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -672,8 +693,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -691,8 +712,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -710,8 +731,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -729,8 +750,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -748,8 +769,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -767,8 +788,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -786,8 +807,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 11,
+            "filename" : "./include/actions.p4",
+            "line" : 27,
             "column" : 4,
             "source_fragment" : "standard_metadata.egress_spec = port"
           }
@@ -805,8 +826,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -824,8 +845,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -843,8 +864,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -862,8 +883,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -881,8 +902,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -900,8 +921,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -919,8 +940,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -938,8 +959,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -957,8 +978,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -976,8 +997,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -995,8 +1016,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1014,8 +1035,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1033,8 +1054,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1052,8 +1073,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1071,8 +1092,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1090,8 +1111,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1109,8 +1130,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 10,
+            "filename" : "./include/actions.p4",
+            "line" : 26,
             "column" : 49,
             "source_fragment" : "standard_metadata, port_t port) { ..."
           }
@@ -1118,9 +1139,14 @@
       ]
     },
     {
-      "name" : "send_to_cpu",
+      "name" : "set_egress_port",
       "id" : 1,
-      "runtime_data" : [],
+      "runtime_data" : [
+        {
+          "name" : "port",
+          "bitwidth" : 9
+        }
+      ],
       "primitives" : [
         {
           "op" : "assign",
@@ -1135,10 +1161,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1154,10 +1180,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1173,10 +1199,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1192,10 +1218,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1211,10 +1237,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1230,10 +1256,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1249,10 +1275,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1268,10 +1294,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1287,10 +1313,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1306,10 +1332,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1325,10 +1351,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1344,10 +1370,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1363,10 +1389,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1382,10 +1408,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1401,10 +1427,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1420,10 +1446,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1439,10 +1465,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1453,15 +1479,15 @@
               "value" : ["standard_metadata_4", "egress_spec"]
             },
             {
-              "type" : "hexstr",
-              "value" : "0x00ff"
+              "type" : "runtime_data",
+              "value" : 0
             }
           ],
           "source_info" : {
-            "filename" : "include/defines.p4",
-            "line" : 12,
-            "column" : 24,
-            "source_fragment" : "255; ..."
+            "filename" : "./include/actions.p4",
+            "line" : 27,
+            "column" : 4,
+            "source_fragment" : "standard_metadata.egress_spec = port"
           }
         },
         {
@@ -1477,10 +1503,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1496,10 +1522,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1515,10 +1541,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1534,10 +1560,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1553,10 +1579,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1572,10 +1598,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1591,10 +1617,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1610,10 +1636,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1629,10 +1655,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1648,10 +1674,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1667,10 +1693,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1686,10 +1712,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1705,10 +1731,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1724,10 +1750,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1743,10 +1769,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1762,10 +1788,10 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         },
         {
@@ -1781,16 +1807,16 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 6,
-            "column" : 45,
-            "source_fragment" : "standard_metadata) { ..."
+            "filename" : "./include/actions.p4",
+            "line" : 26,
+            "column" : 49,
+            "source_fragment" : "standard_metadata, port_t port) { ..."
           }
         }
       ]
     },
     {
-      "name" : "drop",
+      "name" : "send_to_cpu",
       "id" : 2,
       "runtime_data" : [],
       "primitives" : [
@@ -1807,9 +1833,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1826,9 +1852,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1845,9 +1871,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1864,9 +1890,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1883,9 +1909,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1902,9 +1928,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1921,9 +1947,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1940,9 +1966,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1959,9 +1985,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1978,9 +2004,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -1997,9 +2023,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2016,9 +2042,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2035,9 +2061,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2054,9 +2080,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2073,9 +2099,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2092,9 +2118,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2111,9 +2137,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2126,14 +2152,14 @@
             },
             {
               "type" : "hexstr",
-              "value" : "0x01ff"
+              "value" : "0x00ff"
             }
           ],
           "source_info" : {
-            "filename" : "include/defines.p4",
-            "line" : 13,
-            "column" : 25,
-            "source_fragment" : "511; ..."
+            "filename" : "./include/defines.p4",
+            "line" : 29,
+            "column" : 24,
+            "source_fragment" : "255; ..."
           }
         },
         {
@@ -2149,9 +2175,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2168,9 +2194,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2187,9 +2213,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2206,9 +2232,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2225,9 +2251,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2244,9 +2270,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2263,9 +2289,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2282,9 +2308,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2301,9 +2327,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2320,9 +2346,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2339,9 +2365,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2358,9 +2384,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2377,9 +2403,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2396,9 +2422,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2415,9 +2441,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2434,9 +2460,9 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
-            "column" : 38,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
             "source_fragment" : "standard_metadata) { ..."
           }
         },
@@ -2453,8 +2479,680 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/actions.p4",
-            "line" : 14,
+            "filename" : "./include/actions.p4",
+            "line" : 22,
+            "column" : 45,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        }
+      ]
+    },
+    {
+      "name" : "drop",
+      "id" : 3,
+      "runtime_data" : [],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "ingress_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "ingress_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_spec"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "clone_spec"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "clone_spec"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "instance_type"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "instance_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "drop"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "drop"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "recirculate_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "recirculate_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "packet_length"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "packet_length"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "enq_timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "enq_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "enq_qdepth"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "enq_qdepth"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "deq_timedelta"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "deq_timedelta"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "deq_qdepth"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "deq_qdepth"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "ingress_global_timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "ingress_global_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "lf_field_list"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "lf_field_list"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "mcast_grp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "mcast_grp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "resubmit_flag"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "resubmit_flag"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_rid"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_rid"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_spec"]
+            },
+            {
+              "type" : "hexstr",
+              "value" : "0x01ff"
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/defines.p4",
+            "line" : 30,
+            "column" : 25,
+            "source_fragment" : "511; ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "ingress_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "ingress_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_spec"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_spec"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "clone_spec"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "clone_spec"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "instance_type"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "instance_type"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "drop"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "drop"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "recirculate_port"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "recirculate_port"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "packet_length"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "packet_length"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "enq_timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "enq_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "enq_qdepth"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "enq_qdepth"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "deq_timedelta"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "deq_timedelta"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "deq_qdepth"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "deq_qdepth"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "ingress_global_timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "ingress_global_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "lf_field_list"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "lf_field_list"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "mcast_grp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "mcast_grp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "resubmit_flag"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "resubmit_flag"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
+            "column" : 38,
+            "source_fragment" : "standard_metadata) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["standard_metadata", "egress_rid"]
+            },
+            {
+              "type" : "field",
+              "value" : ["standard_metadata_6", "egress_rid"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "./include/actions.p4",
+            "line" : 30,
             "column" : 38,
             "source_fragment" : "standard_metadata) { ..."
           }
@@ -2463,13 +3161,202 @@
     },
     {
       "name" : "NoAction",
-      "id" : 3,
+      "id" : 4,
       "runtime_data" : [],
       "primitives" : []
     },
     {
+      "name" : "NoAction",
+      "id" : 5,
+      "runtime_data" : [],
+      "primitives" : []
+    },
+    {
+      "name" : "do_ecmp",
+      "id" : 6,
+      "runtime_data" : [
+        {
+          "name" : "ecmp_group_id",
+          "bitwidth" : 8
+        }
+      ],
+      "primitives" : [
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "ingress_global_timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "ingress_global_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "lf_field_list"]
+            },
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "lf_field_list"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "mcast_grp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "mcast_grp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "egress_rid"]
+            },
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "egress_rid"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "ingress_global_timestamp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "ingress_global_timestamp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "lf_field_list"]
+            },
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "lf_field_list"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "mcast_grp"]
+            },
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "mcast_grp"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["intrinsic_metadata", "egress_rid"]
+            },
+            {
+              "type" : "field",
+              "value" : ["meta_1_intrinsic_metadata", "egress_rid"]
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 37,
+            "column" : 36,
+            "source_fragment" : "meta, ecmp_group_id_t ecmp_group_id) { ..."
+          }
+        },
+        {
+          "op" : "assign",
+          "parameters" : [
+            {
+              "type" : "field",
+              "value" : ["scalars", "metadata_t.ecmp_group_id"]
+            },
+            {
+              "type" : "runtime_data",
+              "value" : 0
+            }
+          ],
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 38,
+            "column" : 29,
+            "source_fragment" : "ecmp_group_id; ..."
+          }
+        }
+      ]
+    },
+    {
       "name" : "act",
-      "id" : 4,
+      "id" : 7,
       "runtime_data" : [],
       "primitives" : [
         {
@@ -2485,7 +3372,7 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/packet_io.p4",
+            "filename" : "./include/packet_io.p4",
             "line" : 23,
             "column" : 12,
             "source_fragment" : "standard_metadata.egress_spec = hdr.packet_out.egress_port"
@@ -2495,7 +3382,7 @@
     },
     {
       "name" : "act_0",
-      "id" : 5,
+      "id" : 8,
       "runtime_data" : [],
       "primitives" : [
         {
@@ -2537,8 +3424,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/port_counters.p4",
-            "line" : 11,
+            "filename" : "./include/port_counters.p4",
+            "line" : 27,
             "column" : 12,
             "source_fragment" : "ingress_port_counter.count((bit<32>)standard_metadata.ingress_port)"
           }
@@ -2582,8 +3469,8 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/port_counters.p4",
-            "line" : 12,
+            "filename" : "./include/port_counters.p4",
+            "line" : 28,
             "column" : 12,
             "source_fragment" : "egress_port_counter.count((bit<32>)standard_metadata.egress_spec)"
           }
@@ -2592,7 +3479,7 @@
     },
     {
       "name" : "act_1",
-      "id" : 6,
+      "id" : 9,
       "runtime_data" : [],
       "primitives" : [
         {
@@ -2604,7 +3491,7 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/packet_io.p4",
+            "filename" : "./include/packet_io.p4",
             "line" : 32,
             "column" : 12,
             "source_fragment" : "hdr.packet_in.setValid()"
@@ -2623,7 +3510,7 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/packet_io.p4",
+            "filename" : "./include/packet_io.p4",
             "line" : 33,
             "column" : 12,
             "source_fragment" : "hdr.packet_in.ingress_port = standard_metadata.ingress_port"
@@ -2633,7 +3520,7 @@
     },
     {
       "name" : "act_2",
-      "id" : 7,
+      "id" : 10,
       "runtime_data" : [],
       "primitives" : [
         {
@@ -2645,7 +3532,7 @@
             }
           ],
           "source_info" : {
-            "filename" : "include/packet_io.p4",
+            "filename" : "./include/packet_io.p4",
             "line" : 30,
             "column" : 8,
             "source_fragment" : "hdr.packet_out.setInvalid()"
@@ -2660,7 +3547,7 @@
       "id" : 0,
       "source_info" : {
         "filename" : "default.p4",
-        "line" : 32,
+        "line" : 33,
         "column" : 8,
         "source_fragment" : "ingress"
       },
@@ -2676,14 +3563,14 @@
           "with_counters" : false,
           "support_timeout" : false,
           "direct_meters" : null,
-          "action_ids" : [4],
+          "action_ids" : [7],
           "actions" : ["act"],
           "base_default_next" : "node_4",
           "next_tables" : {
             "act" : "node_4"
           },
           "default_entry" : {
-            "action_id" : 4,
+            "action_id" : 7,
             "action_const" : true,
             "action_data" : [],
             "action_entry_const" : true
@@ -2694,7 +3581,7 @@
           "id" : 1,
           "source_info" : {
             "filename" : "default.p4",
-            "line" : 44,
+            "line" : 41,
             "column" : 10,
             "source_fragment" : "table0"
           },
@@ -2725,25 +3612,56 @@
           "max_size" : 1024,
           "support_timeout" : false,
           "direct_meters" : null,
-          "action_ids" : [0, 1, 2, 3],
-          "actions" : ["set_egress_port", "send_to_cpu", "drop", "NoAction"],
-          "base_default_next" : "node_6",
+          "action_ids" : [0, 2, 6, 3, 4],
+          "actions" : ["set_egress_port", "send_to_cpu", "do_ecmp", "drop", "NoAction"],
+          "base_default_next" : "node_7",
           "next_tables" : {
-            "set_egress_port" : "node_6",
-            "send_to_cpu" : "node_6",
-            "drop" : "node_6",
-            "NoAction" : "node_6"
+            "do_ecmp" : "ecmp",
+            "set_egress_port" : "node_7",
+            "send_to_cpu" : "node_7",
+            "drop" : "node_7",
+            "NoAction" : "node_7"
           },
           "default_entry" : {
-            "action_id" : 3,
+            "action_id" : 4,
             "action_const" : false,
             "action_data" : [],
             "action_entry_const" : false
           }
         },
         {
-          "name" : "tbl_act_0",
+          "name" : "ecmp",
           "id" : 2,
+          "source_info" : {
+            "filename" : "default.p4",
+            "line" : 63,
+            "column" : 10,
+            "source_fragment" : "ecmp"
+          },
+          "key" : [
+            {
+              "match_type" : "exact",
+              "target" : ["scalars", "metadata_t.ecmp_group_id"],
+              "mask" : null
+            }
+          ],
+          "match_type" : "exact",
+          "type" : "indirect_ws",
+          "action_profile" : "ecmp_selector",
+          "max_size" : 1024,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [1, 5],
+          "actions" : ["set_egress_port", "NoAction"],
+          "base_default_next" : "node_7",
+          "next_tables" : {
+            "set_egress_port" : "node_7",
+            "NoAction" : "node_7"
+          }
+        },
+        {
+          "name" : "tbl_act_0",
+          "id" : 3,
           "key" : [],
           "match_type" : "exact",
           "type" : "simple",
@@ -2751,27 +3669,66 @@
           "with_counters" : false,
           "support_timeout" : false,
           "direct_meters" : null,
-          "action_ids" : [5],
+          "action_ids" : [8],
           "actions" : ["act_0"],
           "base_default_next" : null,
           "next_tables" : {
             "act_0" : null
           },
           "default_entry" : {
-            "action_id" : 5,
+            "action_id" : 8,
             "action_const" : true,
             "action_data" : [],
             "action_entry_const" : true
           }
         }
       ],
-      "action_profiles" : [],
+      "action_profiles" : [
+        {
+          "name" : "ecmp_selector",
+          "id" : 0,
+          "max_size" : 64,
+          "selector" : {
+            "algo" : "crc16",
+            "input" : [
+              {
+                "type" : "field",
+                "value" : ["ipv4", "srcAddr"]
+              },
+              {
+                "type" : "field",
+                "value" : ["ipv4", "dstAddr"]
+              },
+              {
+                "type" : "field",
+                "value" : ["ipv4", "protocol"]
+              },
+              {
+                "type" : "field",
+                "value" : ["tcp", "srcPort"]
+              },
+              {
+                "type" : "field",
+                "value" : ["tcp", "dstPort"]
+              },
+              {
+                "type" : "field",
+                "value" : ["udp", "srcPort"]
+              },
+              {
+                "type" : "field",
+                "value" : ["udp", "dstPort"]
+              }
+            ]
+          }
+        }
+      ],
       "conditionals" : [
         {
           "name" : "node_2",
           "id" : 0,
           "source_info" : {
-            "filename" : "include/packet_io.p4",
+            "filename" : "./include/packet_io.p4",
             "line" : 22,
             "column" : 12,
             "source_fragment" : "hdr.packet_out.isValid()"
@@ -2798,7 +3755,7 @@
           "id" : 1,
           "source_info" : {
             "filename" : "default.p4",
-            "line" : 79,
+            "line" : 90,
             "column" : 13,
             "source_fragment" : "hdr.packet_out.isValid()"
           },
@@ -2817,14 +3774,14 @@
             }
           },
           "true_next" : "table0",
-          "false_next" : "node_6"
+          "false_next" : "node_7"
         },
         {
-          "name" : "node_6",
+          "name" : "node_7",
           "id" : 2,
           "source_info" : {
-            "filename" : "include/port_counters.p4",
-            "line" : 10,
+            "filename" : "./include/port_counters.p4",
+            "line" : 26,
             "column" : 12,
             "source_fragment" : "standard_metadata.egress_spec < 254"
           },
@@ -2852,7 +3809,7 @@
       "id" : 1,
       "source_info" : {
         "filename" : "default.p4",
-        "line" : 87,
+        "line" : 102,
         "column" : 8,
         "source_fragment" : "egress"
       },
@@ -2860,29 +3817,6 @@
       "tables" : [
         {
           "name" : "tbl_act_1",
-          "id" : 3,
-          "key" : [],
-          "match_type" : "exact",
-          "type" : "simple",
-          "max_size" : 1024,
-          "with_counters" : false,
-          "support_timeout" : false,
-          "direct_meters" : null,
-          "action_ids" : [7],
-          "actions" : ["act_2"],
-          "base_default_next" : "node_11",
-          "next_tables" : {
-            "act_2" : "node_11"
-          },
-          "default_entry" : {
-            "action_id" : 7,
-            "action_const" : true,
-            "action_data" : [],
-            "action_entry_const" : true
-          }
-        },
-        {
-          "name" : "tbl_act_2",
           "id" : 4,
           "key" : [],
           "match_type" : "exact",
@@ -2891,14 +3825,37 @@
           "with_counters" : false,
           "support_timeout" : false,
           "direct_meters" : null,
-          "action_ids" : [6],
+          "action_ids" : [10],
+          "actions" : ["act_2"],
+          "base_default_next" : "node_12",
+          "next_tables" : {
+            "act_2" : "node_12"
+          },
+          "default_entry" : {
+            "action_id" : 10,
+            "action_const" : true,
+            "action_data" : [],
+            "action_entry_const" : true
+          }
+        },
+        {
+          "name" : "tbl_act_2",
+          "id" : 5,
+          "key" : [],
+          "match_type" : "exact",
+          "type" : "simple",
+          "max_size" : 1024,
+          "with_counters" : false,
+          "support_timeout" : false,
+          "direct_meters" : null,
+          "action_ids" : [9],
           "actions" : ["act_1"],
           "base_default_next" : null,
           "next_tables" : {
             "act_1" : null
           },
           "default_entry" : {
-            "action_id" : 6,
+            "action_id" : 9,
             "action_const" : true,
             "action_data" : [],
             "action_entry_const" : true
@@ -2908,10 +3865,10 @@
       "action_profiles" : [],
       "conditionals" : [
         {
-          "name" : "node_11",
+          "name" : "node_12",
           "id" : 3,
           "source_info" : {
-            "filename" : "include/packet_io.p4",
+            "filename" : "./include/packet_io.p4",
             "line" : 31,
             "column" : 12,
             "source_fragment" : "standard_metadata.egress_port == CPU_PORT"
diff --git a/tools/test/p4src/p4-16/p4c-out/default.p4info b/tools/test/p4src/p4-16/p4c-out/default.p4info
index bf37f15..7c0211e 100644
--- a/tools/test/p4src/p4-16/p4c-out/default.p4info
+++ b/tools/test/p4src/p4-16/p4c-out/default.p4info
@@ -35,6 +35,9 @@
     id: 16829080
   }
   action_refs {
+    id: 16824896
+  }
+  action_refs {
     id: 16793508
   }
   action_refs {
@@ -44,6 +47,29 @@
   direct_resource_ids: 301990488
   size: 1024
 }
+tables {
+  preamble {
+    id: 33573767
+    name: "ecmp"
+    alias: "ecmp"
+  }
+  match_fields {
+    id: 1
+    name: "meta.ecmp_group_id"
+    bitwidth: 8
+    match_type: EXACT
+  }
+  action_refs {
+    id: 16794308
+  }
+  action_refs {
+    id: 16800567
+    annotations: "@defaultonly()"
+  }
+  implementation_id: 285227860
+  direct_resource_ids: 302048161
+  size: 1024
+}
 actions {
   preamble {
     id: 16794308
@@ -77,6 +103,28 @@
     alias: "NoAction"
   }
 }
+actions {
+  preamble {
+    id: 16824896
+    name: "do_ecmp"
+    alias: "do_ecmp"
+  }
+  params {
+    id: 1
+    name: "ecmp_group_id"
+    bitwidth: 8
+  }
+}
+action_profiles {
+  preamble {
+    id: 285227860
+    name: "ecmp_selector"
+    alias: "ecmp_selector"
+  }
+  table_ids: 33573767
+  with_selector: true
+  size: 64
+}
 counters {
   preamble {
     id: 302025528
@@ -110,6 +158,17 @@
   }
   direct_table_id: 33617813
 }
+direct_counters {
+  preamble {
+    id: 302048161
+    name: "ecmp_counter"
+    alias: "ecmp_counter"
+  }
+  spec {
+    unit: PACKETS
+  }
+  direct_table_id: 33573767
+}
 controller_packet_metadata {
   preamble {
     id: 2868941301