P4 source files for BMv2 demo

Change-Id: I3adc57eb346e3cb34f17d54b82505d2d9e89b4ad
diff --git a/tools/test/p4src/wcmp.p4 b/tools/test/p4src/wcmp.p4
new file mode 100644
index 0000000..1cb6a6c
--- /dev/null
+++ b/tools/test/p4src/wcmp.p4
@@ -0,0 +1,102 @@
+#include "include/defines.p4"
+#include "include/headers.p4"
+#include "include/parser.p4"
+#include "include/actions.p4"
+#include "include/port_counters.p4"
+
+#define SELECTOR_WIDTH 64
+
+header_type wcmp_meta_t {
+    fields {
+        groupId : 16;
+        numBits: 8;
+        selector : SELECTOR_WIDTH;
+    }
+}
+
+metadata wcmp_meta_t wcmp_meta;
+
+field_list wcmp_hash_fields {
+    ipv4.srcAddr;
+    ipv4.dstAddr;
+    ipv4.protocol;
+    tcp.srcPort;
+    tcp.dstPort;
+    udp.srcPort;
+    udp.dstPort;
+}
+
+field_list_calculation wcmp_hash {
+    input {
+        wcmp_hash_fields;
+    }
+    algorithm : bmv2_hash;
+    output_width : 64;
+}
+
+action wcmp_group(groupId) {
+    modify_field(wcmp_meta.groupId, groupId);
+    modify_field_with_hash_based_offset(wcmp_meta.numBits, 2, wcmp_hash, (SELECTOR_WIDTH - 2));
+}
+
+action wcmp_set_selector() {
+    modify_field(wcmp_meta.selector,
+                 (((1 << wcmp_meta.numBits) - 1) << (SELECTOR_WIDTH - wcmp_meta.numBits)));
+}
+
+table table0 {
+    reads {
+        standard_metadata.ingress_port : ternary;
+        ethernet.dstAddr : ternary;
+        ethernet.srcAddr : ternary;
+        ethernet.etherType : ternary;
+    }
+    actions {
+        set_egress_port;
+        wcmp_group;
+        send_to_cpu;
+        _drop;
+    }
+    support_timeout: true;
+}
+
+table wcmp_set_selector_table {
+    actions {
+        wcmp_set_selector;
+    }
+}
+
+table wcmp_group_table {
+    reads {
+        wcmp_meta.groupId : exact;
+        wcmp_meta.selector : lpm;
+    }
+    actions {
+        set_egress_port;
+    }
+}
+
+counter table0_counter {
+    type: packets;
+    direct: table0;
+    min_width : 32;
+}
+
+counter wcmp_group_table_counter {
+    type: packets;
+    direct: wcmp_group_table;
+    min_width : 32;
+}
+
+control ingress {
+    apply(table0) {
+        wcmp_group {
+            apply(wcmp_set_selector_table) {
+                wcmp_set_selector {
+                    apply(wcmp_group_table);
+                }
+            }
+        }
+    }
+    process_port_counters();
+}
\ No newline at end of file