From 2336889e82b97d79e04d0d2f15ea4b86ced9b5b6 Mon Sep 17 00:00:00 2001 From: Keesjan Karsten Date: Tue, 22 May 2018 10:46:01 +0000 Subject: [PATCH] Make the Basic pipeline more portable This change makes the Basic pipeline compile better with different compilers. One change is this: the type parameter for a v1model meter instance cannot be a programmer-defined enum. This is because in P4_16, enums don't necessarily have underlying bitstring types and the language doesn't specify that enum members should be assigned a numerical value in any given way. Change-Id: Id2b758eb2b6e76aa708c2e03e7a001667efddb3d --- .../net/pi/impl/PiTranslatorServiceTest.java | 6 +- .../pipelines/basic/BasicConstants.java | 8 +- .../pipelines/basic/BasicInterpreterImpl.java | 18 +- .../src/main/resources/include/actions.p4 | 8 - .../main/resources/include/custom_headers.p4 | 1 - .../src/main/resources/include/defines.p4 | 5 +- .../src/main/resources/include/headers.p4 | 2 + .../resources/include/host_meter_table.p4 | 9 +- .../src/main/resources/include/port_meters.p4 | 12 +- .../src/main/resources/include/table0.p4 | 16 +- .../basic/src/main/resources/include/wcmp.p4 | 6 +- .../main/resources/p4c-out/bmv2/basic.json | 646 ++++++------------ .../main/resources/p4c-out/bmv2/basic.p4info | 66 +- .../src/main/resources/p4c-out/bmv2/int.json | 174 ++--- .../main/resources/p4c-out/bmv2/int.p4info | 52 +- 15 files changed, 422 insertions(+), 607 deletions(-) diff --git a/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java b/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java index e55ec2555c..9faeabaa50 100644 --- a/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java +++ b/core/net/src/test/java/org/onosproject/net/pi/impl/PiTranslatorServiceTest.java @@ -68,7 +68,7 @@ import static org.onlab.util.ImmutableByteSequence.copyFrom; import static org.onosproject.net.group.GroupDescription.Type.SELECT; import static org.onosproject.pipelines.basic.BasicConstants.ACT_PRF_WCMP_SELECTOR_ID; import static org.onosproject.pipelines.basic.BasicConstants.ACT_PRM_PORT_ID; -import static org.onosproject.pipelines.basic.BasicConstants.ACT_SET_EGRESS_PORT_ID; +import static org.onosproject.pipelines.basic.BasicConstants.ACT_SET_EGRESS_PORT_WCMP_ID; import static org.onosproject.pipelines.basic.BasicConstants.HDR_ETH_DST_ID; import static org.onosproject.pipelines.basic.BasicConstants.HDR_ETH_SRC_ID; import static org.onosproject.pipelines.basic.BasicConstants.HDR_ETH_TYPE_ID; @@ -222,7 +222,7 @@ public class PiTranslatorServiceTest { private static GroupBucket outputBucket(int portNum) { ImmutableByteSequence paramVal = copyFrom(portNum); PiActionParam param = new PiActionParam(ACT_PRM_PORT_ID, paramVal); - PiTableAction action = PiAction.builder().withId(ACT_SET_EGRESS_PORT_ID).withParameter(param).build(); + PiTableAction action = PiAction.builder().withId(ACT_SET_EGRESS_PORT_WCMP_ID).withParameter(param).build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder() .add(Instructions.piTableAction(action)) .build(); @@ -233,7 +233,7 @@ public class PiTranslatorServiceTest { throws ImmutableByteSequence.ByteSequenceTrimException { PiActionParam param = new PiActionParam(ACT_PRM_PORT_ID, copyFrom(portNum).fit(PORT_BITWIDTH)); PiAction piAction = PiAction.builder() - .withId(ACT_SET_EGRESS_PORT_ID) + .withId(ACT_SET_EGRESS_PORT_WCMP_ID) .withParameter(param).build(); return PiActionGroupMember.builder() .withAction(piAction) diff --git a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicConstants.java b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicConstants.java index 6182e18f21..0a4e7d96c7 100644 --- a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicConstants.java +++ b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicConstants.java @@ -81,12 +81,14 @@ public final class BasicConstants { PiActionId.of("NoAction"); public static final PiActionId ACT_DROP_ID = PiActionId.of("_drop"); - public static final PiActionId ACT_SET_EGRESS_PORT_ID = - PiActionId.of("set_egress_port"); + public static final PiActionId ACT_SET_EGRESS_PORT_TABLE0_ID = + PiActionId.of(TABLE0_CTRL + DOT + "set_egress_port"); + public static final PiActionId ACT_SET_EGRESS_PORT_WCMP_ID = + PiActionId.of(WCMP_CTRL + DOT + "set_egress_port"); public static final PiActionId ACT_SET_NEXT_HOP_ID = PiActionId.of(TABLE0_CTRL + DOT + "set_next_hop_id"); public static final PiActionId ACT_SEND_TO_CPU_ID = - PiActionId.of("send_to_cpu"); + PiActionId.of(TABLE0_CTRL + DOT + "send_to_cpu"); // Action Param IDs public static final PiActionParamId ACT_PRM_PORT_ID = PiActionParamId.of("port"); diff --git a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicInterpreterImpl.java b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicInterpreterImpl.java index d5e917b4df..15474f45b8 100644 --- a/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicInterpreterImpl.java +++ b/pipelines/basic/src/main/java/org/onosproject/pipelines/basic/BasicInterpreterImpl.java @@ -35,6 +35,7 @@ import org.onosproject.net.packet.OutboundPacket; import org.onosproject.net.pi.model.PiMatchFieldId; import org.onosproject.net.pi.model.PiPipelineInterpreter; import org.onosproject.net.pi.model.PiTableId; +import org.onosproject.net.pi.model.PiActionId; import org.onosproject.net.pi.runtime.PiAction; import org.onosproject.net.pi.runtime.PiActionParam; import org.onosproject.net.pi.runtime.PiControlMetadata; @@ -57,7 +58,8 @@ import static org.onosproject.pipelines.basic.BasicConstants.ACT_DROP_ID; import static org.onosproject.pipelines.basic.BasicConstants.ACT_NOACTION_ID; import static org.onosproject.pipelines.basic.BasicConstants.ACT_PRM_PORT_ID; import static org.onosproject.pipelines.basic.BasicConstants.ACT_SEND_TO_CPU_ID; -import static org.onosproject.pipelines.basic.BasicConstants.ACT_SET_EGRESS_PORT_ID; +import static org.onosproject.pipelines.basic.BasicConstants.ACT_SET_EGRESS_PORT_TABLE0_ID; +import static org.onosproject.pipelines.basic.BasicConstants.ACT_SET_EGRESS_PORT_WCMP_ID; import static org.onosproject.pipelines.basic.BasicConstants.HDR_ETH_DST_ID; import static org.onosproject.pipelines.basic.BasicConstants.HDR_ETH_SRC_ID; import static org.onosproject.pipelines.basic.BasicConstants.HDR_ETH_TYPE_ID; @@ -68,6 +70,7 @@ import static org.onosproject.pipelines.basic.BasicConstants.PKT_META_EGRESS_POR import static org.onosproject.pipelines.basic.BasicConstants.PKT_META_INGRESS_PORT_ID; import static org.onosproject.pipelines.basic.BasicConstants.PORT_BITWIDTH; import static org.onosproject.pipelines.basic.BasicConstants.TBL_TABLE0_ID; +import static org.onosproject.pipelines.basic.BasicConstants.TBL_WCMP_TABLE_ID; /** * Interpreter implementation for basic.p4. @@ -104,7 +107,14 @@ public class BasicInterpreterImpl extends AbstractHandlerBehaviour Instruction instruction = treatment.allInstructions().get(0); switch (instruction.type()) { case OUTPUT: - return outputPiAction((OutputInstruction) instruction); + if (piTableId == TBL_TABLE0_ID) { + return outputPiAction((OutputInstruction) instruction, ACT_SET_EGRESS_PORT_TABLE0_ID); + } else if (piTableId == TBL_WCMP_TABLE_ID) { + return outputPiAction((OutputInstruction) instruction, ACT_SET_EGRESS_PORT_WCMP_ID); + } else { + throw new PiInterpreterException( + "Output instruction not supported in table " + piTableId); + } case NOACTION: return PiAction.builder().withId(ACT_NOACTION_ID).build(); default: @@ -113,13 +123,13 @@ public class BasicInterpreterImpl extends AbstractHandlerBehaviour } } - private PiAction outputPiAction(OutputInstruction outInstruction) + private PiAction outputPiAction(OutputInstruction outInstruction, PiActionId piActionId) throws PiInterpreterException { PortNumber port = outInstruction.port(); if (!port.isLogical()) { try { return PiAction.builder() - .withId(ACT_SET_EGRESS_PORT_ID) + .withId(piActionId) .withParameter(new PiActionParam(ACT_PRM_PORT_ID, copyFrom(port.toLong()).fit(PORT_BITWIDTH))) .build(); diff --git a/pipelines/basic/src/main/resources/include/actions.p4 b/pipelines/basic/src/main/resources/include/actions.p4 index d1f83b82f7..95048793ae 100644 --- a/pipelines/basic/src/main/resources/include/actions.p4 +++ b/pipelines/basic/src/main/resources/include/actions.p4 @@ -20,14 +20,6 @@ #include "headers.p4" #include "defines.p4" -action send_to_cpu(inout standard_metadata_t standard_metadata) { - standard_metadata.egress_spec = CPU_PORT; -} - -action set_egress_port(inout standard_metadata_t standard_metadata, port_t port) { - standard_metadata.egress_spec = port; -} - action _drop() { mark_to_drop(); } diff --git a/pipelines/basic/src/main/resources/include/custom_headers.p4 b/pipelines/basic/src/main/resources/include/custom_headers.p4 index a57b076eae..9928412bab 100644 --- a/pipelines/basic/src/main/resources/include/custom_headers.p4 +++ b/pipelines/basic/src/main/resources/include/custom_headers.p4 @@ -29,7 +29,6 @@ struct local_metadata_t { bit<16> l4_src_port; bit<16> l4_dst_port; next_hop_id_t next_hop_id; - bit<32> meter_tag; } #endif diff --git a/pipelines/basic/src/main/resources/include/defines.p4 b/pipelines/basic/src/main/resources/include/defines.p4 index d9ec28d9f6..ba5952ee13 100644 --- a/pipelines/basic/src/main/resources/include/defines.p4 +++ b/pipelines/basic/src/main/resources/include/defines.p4 @@ -27,5 +27,8 @@ typedef bit<16> next_hop_id_t; const port_t CPU_PORT = 255; -enum MeterColor_t {GREEN, YELLOW, RED}; +typedef bit<8> MeterColor; +const MeterColor MeterColor_GREEN = 8w0; +const MeterColor MeterColor_YELLOW = 8w1; +const MeterColor MeterColor_RED = 8w2; #endif diff --git a/pipelines/basic/src/main/resources/include/headers.p4 b/pipelines/basic/src/main/resources/include/headers.p4 index e45c9153c3..167664698e 100644 --- a/pipelines/basic/src/main/resources/include/headers.p4 +++ b/pipelines/basic/src/main/resources/include/headers.p4 @@ -22,11 +22,13 @@ @controller_header("packet_in") header packet_in_header_t { bit<9> ingress_port; + bit<7> _padding; } @controller_header("packet_out") header packet_out_header_t { bit<9> egress_port; + bit<7> _padding; } header ethernet_t { diff --git a/pipelines/basic/src/main/resources/include/host_meter_table.p4 b/pipelines/basic/src/main/resources/include/host_meter_table.p4 index 6f581e15a4..9aa2dfcfff 100644 --- a/pipelines/basic/src/main/resources/include/host_meter_table.p4 +++ b/pipelines/basic/src/main/resources/include/host_meter_table.p4 @@ -23,11 +23,11 @@ control host_meter_control(inout headers_t hdr, inout local_metadata_t local_metadata, inout standard_metadata_t standard_metadata) { - - direct_meter>(MeterType.bytes) host_meter; + MeterColor meter_tag = MeterColor_GREEN; + direct_meter(MeterType.bytes) host_meter; action read_meter() { - host_meter.read(local_metadata.meter_tag); + host_meter.read(meter_tag); } table host_meter_table { @@ -43,7 +43,8 @@ control host_meter_control(inout headers_t hdr, } apply { - if (host_meter_table.apply().hit && local_metadata.meter_tag == 2) { + host_meter_table.apply(); + if (meter_tag == MeterColor_RED) { mark_to_drop(); } } diff --git a/pipelines/basic/src/main/resources/include/port_meters.p4 b/pipelines/basic/src/main/resources/include/port_meters.p4 index 710d19a813..b9cb2dbcee 100644 --- a/pipelines/basic/src/main/resources/include/port_meters.p4 +++ b/pipelines/basic/src/main/resources/include/port_meters.p4 @@ -21,11 +21,11 @@ control port_meters_ingress(inout headers_t hdr, inout standard_metadata_t standard_metadata) { meter(MAX_PORTS, MeterType.bytes) ingress_port_meter; - MeterColor_t ingress_color = MeterColor_t.GREEN; + MeterColor ingress_color = MeterColor_GREEN; apply { - ingress_port_meter.execute_meter((bit<32>)standard_metadata.ingress_port, ingress_color); - if (ingress_color == MeterColor_t.RED) { + ingress_port_meter.execute_meter((bit<32>)standard_metadata.ingress_port, ingress_color); + if (ingress_color == MeterColor_RED) { mark_to_drop(); } } @@ -35,11 +35,11 @@ control port_meters_egress(inout headers_t hdr, inout standard_metadata_t standard_metadata) { meter(MAX_PORTS, MeterType.bytes) egress_port_meter; - MeterColor_t egress_color = MeterColor_t.GREEN; + MeterColor egress_color = MeterColor_GREEN; apply { - egress_port_meter.execute_meter((bit<32>)standard_metadata.egress_port, egress_color); - if (egress_color == MeterColor_t.RED) { + egress_port_meter.execute_meter((bit<32>)standard_metadata.egress_port, egress_color); + if (egress_color == MeterColor_RED) { mark_to_drop(); } } diff --git a/pipelines/basic/src/main/resources/include/table0.p4 b/pipelines/basic/src/main/resources/include/table0.p4 index a004fbb477..27e1f8ad72 100644 --- a/pipelines/basic/src/main/resources/include/table0.p4 +++ b/pipelines/basic/src/main/resources/include/table0.p4 @@ -30,6 +30,14 @@ control table0_control(inout headers_t hdr, local_metadata.next_hop_id = next_hop_id; } + action send_to_cpu() { + standard_metadata.egress_spec = CPU_PORT; + } + + action set_egress_port(port_t port) { + standard_metadata.egress_spec = port; + } + table table0 { key = { standard_metadata.ingress_port : ternary; @@ -43,10 +51,10 @@ control table0_control(inout headers_t hdr, local_metadata.l4_dst_port : ternary; } actions = { - set_egress_port(standard_metadata); - send_to_cpu(standard_metadata); - set_next_hop_id(); - _drop(); + set_egress_port; + send_to_cpu; + set_next_hop_id; + _drop; } const default_action = _drop(); counters = table0_counter; diff --git a/pipelines/basic/src/main/resources/include/wcmp.p4 b/pipelines/basic/src/main/resources/include/wcmp.p4 index 9d6e00fccf..7bc533267c 100644 --- a/pipelines/basic/src/main/resources/include/wcmp.p4 +++ b/pipelines/basic/src/main/resources/include/wcmp.p4 @@ -27,6 +27,10 @@ control wcmp_control(inout headers_t hdr, direct_counter(CounterType.packets_and_bytes) wcmp_table_counter; action_selector(HashAlgorithm.crc16, 32w64, 32w16) wcmp_selector; + action set_egress_port(port_t port) { + standard_metadata.egress_spec = port; + } + table wcmp_table { support_timeout = false; key = { @@ -38,7 +42,7 @@ control wcmp_control(inout headers_t hdr, local_metadata.l4_dst_port : selector; } actions = { - set_egress_port(standard_metadata); + set_egress_port; } implementation = wcmp_selector; counters = wcmp_table_counter; diff --git a/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.json b/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.json index e9378ef135..ad8843a140 100644 --- a/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.json +++ b/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.json @@ -11,17 +11,14 @@ "fields" : [ ["tmp", 32, false], ["tmp_0", 32, false], - ["port_meters_ingress_ingress_color_0", 32, false], - ["host_meter_control_tmp_1", 1, false], - ["host_meter_control_tmp_2", 1, false], + ["port_meters_ingress_ingress_color_0", 8, false], + ["host_meter_control_meter_tag_0", 8, false], ["tmp_1", 32, false], ["tmp_2", 32, false], - ["port_meters_egress_egress_color_0", 32, false], + ["port_meters_egress_egress_color_0", 8, false], ["local_metadata_t.l4_src_port", 16, false], ["local_metadata_t.l4_dst_port", 16, false], - ["local_metadata_t.next_hop_id", 16, false], - ["local_metadata_t.meter_tag", 32, false], - ["_padding_2", 6, false] + ["local_metadata_t.next_hop_id", 16, false] ] }, { @@ -37,7 +34,7 @@ "id" : 2, "fields" : [ ["ingress_port", 9, false], - ["_padding_0", 7, false] + ["_padding", 7, false] ] }, { @@ -119,7 +116,7 @@ ["egress_rid", 16, false], ["checksum_error", 1, false], ["recirculate_flag", 32, false], - ["_padding_1", 5, false] + ["_padding_0", 5, false] ] } ], @@ -194,16 +191,7 @@ ["HeaderTooShort", 5], ["ParserTimeout", 6] ], - "enums" : [ - { - "name" : "MeterColor_t", - "entries" : [ - ["GREEN", 0], - ["RED", 2], - ["YELLOW", 1] - ] - } - ], + "enums" : [], "parsers" : [ { "name" : "parser", @@ -467,7 +455,7 @@ "source_info" : { "filename" : "include/host_meter_table.p4", "line" : 27, - "column" : 43, + "column" : 46, "source_fragment" : "host_meter" }, "is_direct" : true, @@ -475,7 +463,7 @@ "type" : "bytes", "size" : 1024, "binding" : "ingress.host_meter_control.host_meter_table", - "result_target" : ["scalars", "local_metadata_t.meter_tag"] + "result_target" : ["scalars", "host_meter_control_meter_tag_0"] }, { "name" : "egress.port_meters_egress.egress_port_meter", @@ -534,97 +522,9 @@ "calculations" : [], "learn_lists" : [], "actions" : [ - { - "name" : "set_egress_port", - "id" : 0, - "runtime_data" : [ - { - "name" : "port", - "bitwidth" : 9 - } - ], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "runtime_data", - "value" : 0 - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 28, - "column" : 36, - "source_fragment" : "port; ..." - } - } - ] - }, - { - "name" : "set_egress_port", - "id" : 1, - "runtime_data" : [ - { - "name" : "port", - "bitwidth" : 9 - } - ], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "runtime_data", - "value" : 0 - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 28, - "column" : 36, - "source_fragment" : "port; ..." - } - } - ] - }, - { - "name" : "send_to_cpu", - "id" : 2, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "hexstr", - "value" : "0x00ff" - } - ], - "source_info" : { - "filename" : "include/defines.p4", - "line" : 28, - "column" : 24, - "source_fragment" : "255; ..." - } - } - ] - }, { "name" : "_drop", - "id" : 3, + "id" : 0, "runtime_data" : [], "primitives" : [ { @@ -632,7 +532,7 @@ "parameters" : [], "source_info" : { "filename" : "include/actions.p4", - "line" : 32, + "line" : 24, "column" : 4, "source_fragment" : "mark_to_drop()" } @@ -641,19 +541,19 @@ }, { "name" : "NoAction", - "id" : 4, + "id" : 1, "runtime_data" : [], "primitives" : [] }, { "name" : "NoAction", - "id" : 5, + "id" : 2, "runtime_data" : [], "primitives" : [] }, { "name" : "ingress.table0_control.set_next_hop_id", - "id" : 6, + "id" : 3, "runtime_data" : [ { "name" : "next_hop_id", @@ -682,12 +582,100 @@ } ] }, + { + "name" : "ingress.table0_control.send_to_cpu", + "id" : 4, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x00ff" + } + ], + "source_info" : { + "filename" : "include/defines.p4", + "line" : 28, + "column" : 24, + "source_fragment" : "255; ..." + } + } + ] + }, + { + "name" : "ingress.table0_control.set_egress_port", + "id" : 5, + "runtime_data" : [ + { + "name" : "port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "include/table0.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "standard_metadata.egress_spec = port" + } + } + ] + }, { "name" : "ingress.host_meter_control.read_meter", - "id" : 7, + "id" : 6, "runtime_data" : [], "primitives" : [] }, + { + "name" : "ingress.wcmp_control.set_egress_port", + "id" : 7, + "runtime_data" : [ + { + "name" : "port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "include/wcmp.p4", + "line" : 31, + "column" : 8, + "source_fragment" : "standard_metadata.egress_spec = port" + } + } + ] + }, { "name" : "act", "id" : 8, @@ -801,7 +789,7 @@ "filename" : "include/port_meters.p4", "line" : 27, "column" : 8, - "source_fragment" : "ingress_port_meter.execute_meter((bit<32>)standard_metadata.ingress_port, ingress_color)" + "source_fragment" : "ingress_port_meter.execute_meter((bit<32>)standard_metadata.ingress_port, ingress_color)" } } ] @@ -857,23 +845,19 @@ "parameters" : [ { "type" : "field", - "value" : ["scalars", "host_meter_control_tmp_1"] + "value" : ["scalars", "host_meter_control_meter_tag_0"] }, { - "type" : "expression", - "value" : { - "type" : "expression", - "value" : { - "op" : "b2d", - "left" : null, - "right" : { - "type" : "bool", - "value" : true - } - } - } + "type" : "hexstr", + "value" : "0x00" } - ] + ], + "source_info" : { + "filename" : "include/defines.p4", + "line" : 31, + "column" : 36, + "source_fragment" : "8w0; ..." + } } ] }, @@ -881,125 +865,13 @@ "name" : "act_3", "id" : 12, "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["scalars", "host_meter_control_tmp_1"] - }, - { - "type" : "expression", - "value" : { - "type" : "expression", - "value" : { - "op" : "b2d", - "left" : null, - "right" : { - "type" : "bool", - "value" : false - } - } - } - } - ] - } - ] - }, - { - "name" : "act_4", - "id" : 13, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["scalars", "host_meter_control_tmp_2"] - }, - { - "type" : "expression", - "value" : { - "type" : "expression", - "value" : { - "op" : "b2d", - "left" : null, - "right" : { - "type" : "bool", - "value" : false - } - } - } - } - ], - "source_info" : { - "filename" : "include/host_meter_table.p4", - "line" : 46, - "column" : 12, - "source_fragment" : "host_meter_table.apply().hit && local_metadata.meter_tag == 2" - } - } - ] - }, - { - "name" : "act_5", - "id" : 14, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["scalars", "host_meter_control_tmp_2"] - }, - { - "type" : "expression", - "value" : { - "type" : "expression", - "value" : { - "op" : "b2d", - "left" : null, - "right" : { - "type" : "expression", - "value" : { - "op" : "==", - "left" : { - "type" : "field", - "value" : ["scalars", "local_metadata_t.meter_tag"] - }, - "right" : { - "type" : "hexstr", - "value" : "0x00000002" - } - } - } - } - } - } - ], - "source_info" : { - "filename" : "include/host_meter_table.p4", - "line" : 46, - "column" : 12, - "source_fragment" : "host_meter_table.apply().hit && local_metadata.meter_tag == 2" - } - } - ] - }, - { - "name" : "act_6", - "id" : 15, - "runtime_data" : [], "primitives" : [ { "op" : "drop", "parameters" : [], "source_info" : { "filename" : "include/host_meter_table.p4", - "line" : 47, + "line" : 48, "column" : 12, "source_fragment" : "mark_to_drop()" } @@ -1007,8 +879,8 @@ ] }, { - "name" : "act_7", - "id" : 16, + "name" : "act_4", + "id" : 13, "runtime_data" : [], "primitives" : [ { @@ -1024,8 +896,8 @@ ] }, { - "name" : "act_8", - "id" : 17, + "name" : "act_5", + "id" : 14, "runtime_data" : [], "primitives" : [ { @@ -1119,14 +991,14 @@ "filename" : "include/port_meters.p4", "line" : 41, "column" : 8, - "source_fragment" : "egress_port_meter.execute_meter((bit<32>)standard_metadata.egress_port, egress_color)" + "source_fragment" : "egress_port_meter.execute_meter((bit<32>)standard_metadata.egress_port, egress_color)" } } ] }, { - "name" : "act_9", - "id" : 18, + "name" : "act_6", + "id" : 15, "runtime_data" : [], "primitives" : [ { @@ -1252,7 +1124,7 @@ "id" : 3, "source_info" : { "filename" : "include/table0.p4", - "line" : 33, + "line" : 41, "column" : 10, "source_fragment" : "table0" }, @@ -1318,17 +1190,40 @@ "with_counters" : true, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [0, 2, 6, 3], - "actions" : ["set_egress_port", "send_to_cpu", "ingress.table0_control.set_next_hop_id", "_drop"], - "base_default_next" : "ingress.host_meter_control.host_meter_table", + "action_ids" : [5, 4, 3, 0], + "actions" : ["ingress.table0_control.set_egress_port", "ingress.table0_control.send_to_cpu", "ingress.table0_control.set_next_hop_id", "_drop"], + "base_default_next" : "tbl_act_2", "next_tables" : { - "set_egress_port" : "ingress.host_meter_control.host_meter_table", - "send_to_cpu" : "ingress.host_meter_control.host_meter_table", - "ingress.table0_control.set_next_hop_id" : "ingress.host_meter_control.host_meter_table", - "_drop" : "ingress.host_meter_control.host_meter_table" + "ingress.table0_control.set_egress_port" : "tbl_act_2", + "ingress.table0_control.send_to_cpu" : "tbl_act_2", + "ingress.table0_control.set_next_hop_id" : "tbl_act_2", + "_drop" : "tbl_act_2" }, "default_entry" : { - "action_id" : 3, + "action_id" : 0, + "action_const" : true, + "action_data" : [], + "action_entry_const" : true + } + }, + { + "name" : "tbl_act_2", + "id" : 4, + "key" : [], + "match_type" : "exact", + "type" : "simple", + "max_size" : 1024, + "with_counters" : false, + "support_timeout" : false, + "direct_meters" : null, + "action_ids" : [11], + "actions" : ["act_2"], + "base_default_next" : "ingress.host_meter_control.host_meter_table", + "next_tables" : { + "act_2" : "ingress.host_meter_control.host_meter_table" + }, + "default_entry" : { + "action_id" : 11, "action_const" : true, "action_data" : [], "action_entry_const" : true @@ -1336,7 +1231,7 @@ }, { "name" : "ingress.host_meter_control.host_meter_table", - "id" : 4, + "id" : 5, "source_info" : { "filename" : "include/host_meter_table.p4", "line" : 33, @@ -1357,43 +1252,20 @@ "with_counters" : false, "support_timeout" : false, "direct_meters" : "ingress.host_meter_control.host_meter", - "action_ids" : [7, 4], + "action_ids" : [6, 1], "actions" : ["ingress.host_meter_control.read_meter", "NoAction"], - "base_default_next" : null, + "base_default_next" : "node_10", "next_tables" : { - "__HIT__" : "tbl_act_2", - "__MISS__" : "tbl_act_3" + "ingress.host_meter_control.read_meter" : "node_10", + "NoAction" : "node_10" }, "default_entry" : { - "action_id" : 4, + "action_id" : 1, "action_const" : false, "action_data" : [], "action_entry_const" : false } }, - { - "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" : [11], - "actions" : ["act_2"], - "base_default_next" : "node_11", - "next_tables" : { - "act_2" : "node_11" - }, - "default_entry" : { - "action_id" : 11, - "action_const" : true, - "action_data" : [], - "action_entry_const" : true - } - }, { "name" : "tbl_act_3", "id" : 6, @@ -1406,9 +1278,9 @@ "direct_meters" : null, "action_ids" : [12], "actions" : ["act_3"], - "base_default_next" : "node_11", + "base_default_next" : "node_12", "next_tables" : { - "act_3" : "node_11" + "act_3" : "node_12" }, "default_entry" : { "action_id" : 12, @@ -1417,81 +1289,12 @@ "action_entry_const" : true } }, - { - "name" : "tbl_act_4", - "id" : 7, - "key" : [], - "match_type" : "exact", - "type" : "simple", - "max_size" : 1024, - "with_counters" : false, - "support_timeout" : false, - "direct_meters" : null, - "action_ids" : [13], - "actions" : ["act_4"], - "base_default_next" : "node_14", - "next_tables" : { - "act_4" : "node_14" - }, - "default_entry" : { - "action_id" : 13, - "action_const" : true, - "action_data" : [], - "action_entry_const" : true - } - }, - { - "name" : "tbl_act_5", - "id" : 8, - "key" : [], - "match_type" : "exact", - "type" : "simple", - "max_size" : 1024, - "with_counters" : false, - "support_timeout" : false, - "direct_meters" : null, - "action_ids" : [14], - "actions" : ["act_5"], - "base_default_next" : "node_14", - "next_tables" : { - "act_5" : "node_14" - }, - "default_entry" : { - "action_id" : 14, - "action_const" : true, - "action_data" : [], - "action_entry_const" : true - } - }, - { - "name" : "tbl_act_6", - "id" : 9, - "key" : [], - "match_type" : "exact", - "type" : "simple", - "max_size" : 1024, - "with_counters" : false, - "support_timeout" : false, - "direct_meters" : null, - "action_ids" : [15], - "actions" : ["act_6"], - "base_default_next" : "node_16", - "next_tables" : { - "act_6" : "node_16" - }, - "default_entry" : { - "action_id" : 15, - "action_const" : true, - "action_data" : [], - "action_entry_const" : true - } - }, { "name" : "ingress.wcmp_control.wcmp_table", - "id" : 10, + "id" : 7, "source_info" : { "filename" : "include/wcmp.p4", - "line" : 30, + "line" : 34, "column" : 10, "source_fragment" : "wcmp_table" }, @@ -1510,11 +1313,11 @@ "with_counters" : true, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [1, 5], - "actions" : ["set_egress_port", "NoAction"], + "action_ids" : [7, 2], + "actions" : ["ingress.wcmp_control.set_egress_port", "NoAction"], "base_default_next" : null, "next_tables" : { - "set_egress_port" : null, + "ingress.wcmp_control.set_egress_port" : null, "NoAction" : null } } @@ -1559,7 +1362,7 @@ "filename" : "include/port_meters.p4", "line" : 28, "column" : 12, - "source_fragment" : "ingress_color == MeterColor_t.RED" + "source_fragment" : "ingress_color == MeterColor_RED" }, "expression" : { "type" : "expression", @@ -1571,7 +1374,7 @@ }, "right" : { "type" : "hexstr", - "value" : "0x00000002" + "value" : "0x02" } } }, @@ -1605,52 +1408,37 @@ "false_next" : "ingress.table0_control.table0" }, { - "name" : "node_11", + "name" : "node_10", "id" : 2, - "expression" : { - "type" : "expression", - "value" : { - "op" : "not", - "left" : null, - "right" : { - "type" : "expression", - "value" : { - "op" : "d2b", - "left" : null, - "right" : { - "type" : "field", - "value" : ["scalars", "host_meter_control_tmp_1"] - } - } - } - } + "source_info" : { + "filename" : "include/host_meter_table.p4", + "line" : 47, + "column" : 12, + "source_fragment" : "meter_tag == MeterColor_RED" }, - "true_next" : "tbl_act_4", - "false_next" : "tbl_act_5" - }, - { - "name" : "node_14", - "id" : 3, "expression" : { "type" : "expression", "value" : { - "op" : "d2b", - "left" : null, - "right" : { + "op" : "==", + "left" : { "type" : "field", - "value" : ["scalars", "host_meter_control_tmp_2"] + "value" : ["scalars", "host_meter_control_meter_tag_0"] + }, + "right" : { + "type" : "hexstr", + "value" : "0x02" } } }, - "true_next" : "tbl_act_6", - "false_next" : "node_16" + "true_next" : "tbl_act_3", + "false_next" : "node_12" }, { - "name" : "node_16", - "id" : 4, + "name" : "node_12", + "id" : 3, "source_info" : { "filename" : "include/wcmp.p4", - "line" : 48, + "line" : 52, "column" : 12, "source_fragment" : "local_metadata.next_hop_id != 0" }, @@ -1682,11 +1470,11 @@ "column" : 8, "source_fragment" : "egress" }, - "init_table" : "tbl_act_7", + "init_table" : "tbl_act_4", "tables" : [ { - "name" : "tbl_act_7", - "id" : 11, + "name" : "tbl_act_4", + "id" : 8, "key" : [], "match_type" : "exact", "type" : "simple", @@ -1694,22 +1482,22 @@ "with_counters" : false, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [17], - "actions" : ["act_8"], - "base_default_next" : "node_21", + "action_ids" : [14], + "actions" : ["act_5"], + "base_default_next" : "node_17", "next_tables" : { - "act_8" : "node_21" + "act_5" : "node_17" }, "default_entry" : { - "action_id" : 17, + "action_id" : 14, "action_const" : true, "action_data" : [], "action_entry_const" : true } }, { - "name" : "tbl_act_8", - "id" : 12, + "name" : "tbl_act_5", + "id" : 9, "key" : [], "match_type" : "exact", "type" : "simple", @@ -1717,22 +1505,22 @@ "with_counters" : false, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [16], - "actions" : ["act_7"], - "base_default_next" : "node_23", + "action_ids" : [13], + "actions" : ["act_4"], + "base_default_next" : "node_19", "next_tables" : { - "act_7" : "node_23" + "act_4" : "node_19" }, "default_entry" : { - "action_id" : 16, + "action_id" : 13, "action_const" : true, "action_data" : [], "action_entry_const" : true } }, { - "name" : "tbl_act_9", - "id" : 13, + "name" : "tbl_act_6", + "id" : 10, "key" : [], "match_type" : "exact", "type" : "simple", @@ -1740,14 +1528,14 @@ "with_counters" : false, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [18], - "actions" : ["act_9"], + "action_ids" : [15], + "actions" : ["act_6"], "base_default_next" : null, "next_tables" : { - "act_9" : null + "act_6" : null }, "default_entry" : { - "action_id" : 18, + "action_id" : 15, "action_const" : true, "action_data" : [], "action_entry_const" : true @@ -1757,13 +1545,13 @@ "action_profiles" : [], "conditionals" : [ { - "name" : "node_21", - "id" : 5, + "name" : "node_17", + "id" : 4, "source_info" : { "filename" : "include/port_meters.p4", "line" : 42, "column" : 12, - "source_fragment" : "egress_color == MeterColor_t.RED" + "source_fragment" : "egress_color == MeterColor_RED" }, "expression" : { "type" : "expression", @@ -1775,16 +1563,16 @@ }, "right" : { "type" : "hexstr", - "value" : "0x00000002" + "value" : "0x02" } } }, - "true_next" : "tbl_act_8", - "false_next" : "node_23" + "true_next" : "tbl_act_5", + "false_next" : "node_19" }, { - "name" : "node_23", - "id" : 6, + "name" : "node_19", + "id" : 5, "source_info" : { "filename" : "include/packet_io.p4", "line" : 37, @@ -1806,7 +1594,7 @@ } }, "false_next" : null, - "true_next" : "tbl_act_9" + "true_next" : "tbl_act_6" } ] } diff --git a/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.p4info b/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.p4info index 8d39c131ec..7c66b7394b 100644 --- a/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.p4info +++ b/pipelines/basic/src/main/resources/p4c-out/bmv2/basic.p4info @@ -59,10 +59,10 @@ tables { match_type: TERNARY } action_refs { - id: 16794308 + id: 16822046 } action_refs { - id: 16829080 + id: 16783057 } action_refs { id: 16777316 @@ -108,7 +108,7 @@ tables { match_type: EXACT } action_refs { - id: 16794308 + id: 16796092 } action_refs { id: 16800567 @@ -118,25 +118,6 @@ tables { direct_resource_ids: 302034578 size: 1024 } -actions { - preamble { - id: 16794308 - name: "set_egress_port" - alias: "set_egress_port" - } - params { - id: 1 - name: "port" - bitwidth: 9 - } -} -actions { - preamble { - id: 16829080 - name: "send_to_cpu" - alias: "send_to_cpu" - } -} actions { preamble { id: 16784184 @@ -163,6 +144,25 @@ actions { bitwidth: 16 } } +actions { + preamble { + id: 16783057 + name: "ingress.table0_control.send_to_cpu" + alias: "send_to_cpu" + } +} +actions { + preamble { + id: 16822046 + name: "ingress.table0_control.set_egress_port" + alias: "table0_control.set_egress_port" + } + params { + id: 1 + name: "port" + bitwidth: 9 + } +} actions { preamble { id: 16823832 @@ -170,6 +170,18 @@ actions { alias: "read_meter" } } +actions { + preamble { + id: 16796092 + name: "ingress.wcmp_control.set_egress_port" + alias: "wcmp_control.set_egress_port" + } + params { + id: 1 + name: "port" + bitwidth: 9 + } +} action_profiles { preamble { id: 285253634 @@ -268,6 +280,11 @@ controller_packet_metadata { name: "ingress_port" bitwidth: 9 } + metadata { + id: 2 + name: "_padding" + bitwidth: 7 + } } controller_packet_metadata { preamble { @@ -280,4 +297,9 @@ controller_packet_metadata { name: "egress_port" bitwidth: 9 } + metadata { + id: 2 + name: "_padding" + bitwidth: 7 + } } diff --git a/pipelines/basic/src/main/resources/p4c-out/bmv2/int.json b/pipelines/basic/src/main/resources/p4c-out/bmv2/int.json index 650ea3af74..9a67fcb369 100644 --- a/pipelines/basic/src/main/resources/p4c-out/bmv2/int.json +++ b/pipelines/basic/src/main/resources/p4c-out/bmv2/int.json @@ -18,7 +18,7 @@ ["local_metadata_t.l4_dst_port", 16, false], ["local_metadata_t.next_hop_id", 16, false], ["local_metadata_t.selector", 16, false], - ["_padding_3", 6, false] + ["_padding_2", 6, false] ] }, { @@ -34,7 +34,7 @@ "id" : 2, "fields" : [ ["ingress_port", 9, false], - ["_padding_0", 7, false] + ["_padding", 7, false] ] }, { @@ -208,7 +208,7 @@ ["mirror_id", 8, false], ["flow_id", 16, false], ["metadata_len", 8, false], - ["_padding_1", 6, false] + ["_padding_0", 6, false] ] }, { @@ -235,7 +235,7 @@ ["egress_rid", 16, false], ["checksum_error", 1, false], ["recirculate_flag", 32, false], - ["_padding_2", 5, false] + ["_padding_1", 5, false] ] } ], @@ -1037,66 +1037,9 @@ "calculations" : [], "learn_lists" : [], "actions" : [ - { - "name" : "set_egress_port", - "id" : 0, - "runtime_data" : [ - { - "name" : "port", - "bitwidth" : 9 - } - ], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "runtime_data", - "value" : 0 - } - ], - "source_info" : { - "filename" : "include/actions.p4", - "line" : 28, - "column" : 36, - "source_fragment" : "port; ..." - } - } - ] - }, - { - "name" : "send_to_cpu", - "id" : 1, - "runtime_data" : [], - "primitives" : [ - { - "op" : "assign", - "parameters" : [ - { - "type" : "field", - "value" : ["standard_metadata", "egress_spec"] - }, - { - "type" : "hexstr", - "value" : "0x00ff" - } - ], - "source_info" : { - "filename" : "include/defines.p4", - "line" : 28, - "column" : 24, - "source_fragment" : "255; ..." - } - } - ] - }, { "name" : "_drop", - "id" : 2, + "id" : 0, "runtime_data" : [], "primitives" : [ { @@ -1104,7 +1047,7 @@ "parameters" : [], "source_info" : { "filename" : "include/actions.p4", - "line" : 32, + "line" : 24, "column" : 4, "source_fragment" : "mark_to_drop()" } @@ -1113,7 +1056,7 @@ }, { "name" : "ingress.table0_control.set_next_hop_id", - "id" : 3, + "id" : 1, "runtime_data" : [ { "name" : "next_hop_id", @@ -1142,6 +1085,63 @@ } ] }, + { + "name" : "ingress.table0_control.send_to_cpu", + "id" : 2, + "runtime_data" : [], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "hexstr", + "value" : "0x00ff" + } + ], + "source_info" : { + "filename" : "include/defines.p4", + "line" : 28, + "column" : 24, + "source_fragment" : "255; ..." + } + } + ] + }, + { + "name" : "ingress.table0_control.set_egress_port", + "id" : 3, + "runtime_data" : [ + { + "name" : "port", + "bitwidth" : 9 + } + ], + "primitives" : [ + { + "op" : "assign", + "parameters" : [ + { + "type" : "field", + "value" : ["standard_metadata", "egress_spec"] + }, + { + "type" : "runtime_data", + "value" : 0 + } + ], + "source_info" : { + "filename" : "include/table0.p4", + "line" : 38, + "column" : 8, + "source_fragment" : "standard_metadata.egress_spec = port" + } + } + ] + }, { "name" : "act", "id" : 4, @@ -6076,7 +6076,7 @@ "id" : 2, "source_info" : { "filename" : "include/table0.p4", - "line" : 33, + "line" : 41, "column" : 10, "source_fragment" : "table0" }, @@ -6142,17 +6142,17 @@ "with_counters" : true, "support_timeout" : false, "direct_meters" : null, - "action_ids" : [0, 1, 3, 2], - "actions" : ["set_egress_port", "send_to_cpu", "ingress.table0_control.set_next_hop_id", "_drop"], + "action_ids" : [3, 2, 1, 0], + "actions" : ["ingress.table0_control.set_egress_port", "ingress.table0_control.send_to_cpu", "ingress.table0_control.set_next_hop_id", "_drop"], "base_default_next" : null, "next_tables" : { - "set_egress_port" : null, - "send_to_cpu" : null, + "ingress.table0_control.set_egress_port" : null, + "ingress.table0_control.send_to_cpu" : null, "ingress.table0_control.set_next_hop_id" : null, "_drop" : null }, "default_entry" : { - "action_id" : 2, + "action_id" : 0, "action_const" : true, "action_data" : [], "action_entry_const" : true @@ -6613,9 +6613,9 @@ "direct_meters" : null, "action_ids" : [55], "actions" : ["act_2"], - "base_default_next" : "node_29", + "base_default_next" : "node_28", "next_tables" : { - "act_2" : "node_29" + "act_2" : "node_28" }, "default_entry" : { "action_id" : 55, @@ -6871,38 +6871,12 @@ } } }, - "true_next" : "node_25", - "false_next" : "tbl_act_1" - }, - { - "name" : "node_25", - "id" : 8, - "source_info" : { - "filename" : "include/int_sink.p4", - "line" : 51, - "column" : 12, - "source_fragment" : "local_metadata.int_meta.sink == 1" - }, - "expression" : { - "type" : "expression", - "value" : { - "op" : "==", - "left" : { - "type" : "field", - "value" : ["userMetadata.int_meta", "sink"] - }, - "right" : { - "type" : "hexstr", - "value" : "0x01" - } - } - }, "true_next" : "tbl_process_int_sink_restore_header", "false_next" : "tbl_act_1" }, { - "name" : "node_29", - "id" : 9, + "name" : "node_28", + "id" : 8, "source_info" : { "filename" : "include/packet_io.p4", "line" : 37, diff --git a/pipelines/basic/src/main/resources/p4c-out/bmv2/int.p4info b/pipelines/basic/src/main/resources/p4c-out/bmv2/int.p4info index a3d6b8525e..93a86460c1 100644 --- a/pipelines/basic/src/main/resources/p4c-out/bmv2/int.p4info +++ b/pipelines/basic/src/main/resources/p4c-out/bmv2/int.p4info @@ -59,10 +59,10 @@ tables { match_type: TERNARY } action_refs { - id: 16794308 + id: 16822046 } action_refs { - id: 16829080 + id: 16783057 } action_refs { id: 16777316 @@ -308,25 +308,6 @@ tables { direct_resource_ids: 301998415 size: 16 } -actions { - preamble { - id: 16794308 - name: "set_egress_port" - alias: "set_egress_port" - } - params { - id: 1 - name: "port" - bitwidth: 9 - } -} -actions { - preamble { - id: 16829080 - name: "send_to_cpu" - alias: "send_to_cpu" - } -} actions { preamble { id: 16784184 @@ -346,6 +327,25 @@ actions { bitwidth: 16 } } +actions { + preamble { + id: 16783057 + name: "ingress.table0_control.send_to_cpu" + alias: "send_to_cpu" + } +} +actions { + preamble { + id: 16822046 + name: "ingress.table0_control.set_egress_port" + alias: "set_egress_port" + } + params { + id: 1 + name: "port" + bitwidth: 9 + } +} actions { preamble { id: 16800567 @@ -782,6 +782,11 @@ controller_packet_metadata { name: "ingress_port" bitwidth: 9 } + metadata { + id: 2 + name: "_padding" + bitwidth: 7 + } } controller_packet_metadata { preamble { @@ -794,4 +799,9 @@ controller_packet_metadata { name: "egress_port" bitwidth: 9 } + metadata { + id: 2 + name: "_padding" + bitwidth: 7 + } }