P4_16使用table实现通用的switch分支语句

0 背景

v1.2.1 以及更早版本的P4_16编程语言中,尽管在Control中支持switch分支语句,但是switch中的选择条件是受限的,仅支持 table_name.apply().action_run 作为switch的选择条件。为了解决此限制,将尝试使用P4_16 Table+switch来实现一个通用的switch语句。

1 目标

使用P4中的table_name.apply().action_run实现如下伪代码

bit<16> x;switch (x) {1: { /* body 1 here */ }2:3: { /* body 23 here */ }4: { /* body 4 here */ }default: { /* body D here */ }
}

2 使用if-else实现

if (x == 1) {/* body 1 here */
} else if ((x == 2) || (x == 3)) {/* body 23 here */
} else if (x == 4) {/* body 4 here */
} else {/* body D here */
}

这种实现方法逻辑没问题,功能实现没问题,但是效率极低。

3 使用table实现

原理:

使用table的Match-Action机制+P4_16中的switch语句来判断执行了哪个Action,进而判断具体是匹配到了table中的哪一项。

具体代码:


bit<16> x; //选择条件
//table中的Action 仅需声明即可,使用@hidden注解指示编译器该部分需要向控制面隐藏
@hidden action switch1_case_1 () {// no statements here, by design
}
@hidden action switch1_case_23 () {// no statements here, by design
}
@hidden action switch1_case_4 () {// no statements here, by design
}
@hidden action switch1_case_default () {// no statements here, by design
}@hidden table switch1_table {key = {x : exact; //精确匹配}//table中的所有actionactions = {switch1_case_1;switch1_case_23;switch1_case_4;switch1_case_default;}//table的表项。注:此处具体的表项并不是从控制面添加的,而是写进代码中编译。//主要是因为这个table对控制面是不可见的const entries = {1 : switch1_case_1;2 : switch1_case_23;3 : switch1_case_23;4 : switch1_case_4;}const default_action = switch1_case_default;
}// later in the control's apply block, where the original switch
// statement appeared:
apply(){//根据执行table中执行了哪个action来确定match到哪一项switch (switch1_table.apply().action_run) {switch1_case_1:       { /* body 1 here */ }switch1_case_23:      { /* body 23 here */ }switch1_case_4:       { /* body 4 here */ }switch1_case_default: { /* body D here */ }}
}

使用table的Match-Action来实现的通用switch执行效率极高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式websocket IM即时通讯聊天开源项目如何启动

前言 自己之前分享了分布式websocket的视频有同学去fork项目了&#xff0c;自己启动一下更方便理解项目嘛。然后把项目启动需要的东西全部梳理出来。支持群聊单聊,表情包以及发送图片。 支持消息可靠&#xff0c;消息防重&#xff0c;消息有序。同时基础架构有分布式权限&…

深入教程:在STM32上实现能源管理系统

引言 能源管理系统&#xff08;EMS&#xff09;在提高能源效率、减少能源消耗和支持可持续发展方面起着关键作用。本教程将介绍如何在STM32微控制器上开发一个能源管理系统&#xff0c;这种系统能够监控和控制能源使用&#xff0c;适用于家庭自动化、工业控制系统以及任何需要…

jQuery Moblie 笔记14 开发跨平台移动设备网页

相关内容&#xff1a;jQuery Moblie基础、操作、移动设备仿真器、jQuery Moblie网页实例、jQuery Moblie的UI组件、…… jQuery推出了一套新的函数库jQuery Mobile&#xff0c;目的是希望能够统一当前移动设备的用户界面(UI)。 移动设备开发应用程序目前大致分为两种&#xff…

MLP手写数字识别(3)-使用tf.data.Dataset模块制作模型输入(tensorflow)

1、tensorflow版本查看 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、MNIST数据集下载与预处理 (train_images,train_labels),(test_images,test_labels) tf.keras.datasets.mnist.load_data()…

第IV章-Ⅰ Vue3组件与组件通信

第IV章-Ⅰ Vue3组件与组件通信 Vue组件根组件全局组件局部组件组件模板父子组件 组件间通信子组件获取父组件数据数据传递选项prop传值校验单向数据流 父组件获取子组件数据emit 方法 多级组件通信provide 声明要传递的数据inject 接收数据 总结应用场景单向数据流&#xff08;…

强大而简洁:初学Python必须掌握的14个单行代码

Python的魅力与单行代码的重要性 Python&#xff0c;作为一种高级编程语言&#xff0c;自诞生以来就以其简洁、易读、易学的特性而广受开发者喜爱。其魅力不仅在于其强大的功能和广泛的应用领域&#xff0c;更在于其能够用简洁的代码实现复杂的功能&#xff0c;这种能力在很大…

Unity对接科大讯飞实时语音转写WebAPI(Windows平台)

科大讯飞官方文档&#xff1a;实时语音转写 API 文档 | 讯飞开放平台文档中心 (xfyun.cn) 参考文章&#xff1a;unity通过WebAPI连接Websocket实现讯飞语音识别与合成。_unity websocket audio-CSDN博客 要实现语音转文字。首先我们需要从麦克风获取到语音数据&#xff0c;这里…

Redisson 分布式锁和同步器

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 redisson 是基于redis的扩展库,使得redis除了应用于缓存以外,还能做队列…

FloodFill-----洪水灌溉算法(DFS例题详解)

目录 一.图像渲染&#xff1a; 代码详解&#xff1a; 二.岛屿数量&#xff1a; 代码详解&#xff1a; 三.岛屿的最大面积&#xff1a; 代码详解&#xff1a; 四.被围绕的区域&#xff1a; 代码详解&#xff1a; 五.太平洋大西洋水流问题&#xff1a; 代码详解&#x…

基于SpringBoot的教务管理系统 - 源码免费(私信领取)

1. 研究目的 本项目旨在设计并实现一个基于Spring Boot的教务管理系统&#xff0c;以提升学校教务管理效率&#xff0c;优化教学资源配置&#xff0c;提高教学质量&#xff0c;满足学生、教师和管理人员的需求。 2. 研究要求 a. 需求分析 通过调研学校教务管理流程和现有系…

嵌入式单片机中必会的50个电路分享

单片机 电源 声音模块 收音机 485

操作系统-进程管理

1.进程的定义 2.进程的组成 3.进程的特点 4.进程控制结构 5.进程状态 6.进程挂起 6.线程优缺点 7.线程进程的比较 8 .为什么要使用线程 9.用户线程 9.内核线程 10.进程上下文切换信息储存在PCB中 11.fork()

83. 删除排序链表中的重复元素

Problem: 83. 删除排序链表中的重复元素 文章目录 思路解题方法复杂度Code 思路 遍历 解题方法 节点数范围[0, 300] 需要判断节点数是否为0 如果为0则直接返回设置当前节点指针cur&#xff0c;初始化curhead当cur.next非空时&#xff1a; 判断cur.val 与 cur.next.val 是否相等…

typescript-字面量

typescript-字面量 在计算机科学中&#xff0c;字面量用于在源代码中表示某个固定值。在JavaScript程序中&#xff0c;字面量不是变量&#xff0c;它是直接给出的固定值。 Null字面量 Null字面量只有一个&#xff0c;记作null Boolean字面量 Boolean的字面量有两个&#x…

JavaEE初阶Day 15:文件IO(1)

目录 Day 15&#xff1a;文件IO&#xff08;1&#xff09;IO文件1. 路径2. 文件的分类3. 使用Java针对文件系统进行操作3.1 属性3.2 构造方法3.3 方法 Day 15&#xff1a;文件IO&#xff08;1&#xff09; IO I&#xff1a;Input输入 O&#xff1a;Output输出 输入输出规则…

深入解析Spring Boot中的JWT令牌校验:安全身份验证与授权实践

在现代的Web应用程序中&#xff0c;身份验证和授权是至关重要的功能。 JSON Web Token&#xff08;JWT&#xff09;是一种用于安全传输信息的开放标准&#xff0c;它通过在用户和服务器之间传递被声明的对象来安全地传输信息。Spring Boot作为一种流行的Java开发框架&#xff…

golang 确保并发安全性

golang并发安全性 在Golang中&#xff0c;并发安全性通常指的是当多个goroutines同时访问同一个数据结构或资源时&#xff0c;能够保证数据的一致性和完整性&#xff0c;避免数据竞争、死锁等问题 并发安全性案例 案例1 创建 count&#xff0c;起1000个goroutines&#xff0c;…

Java中自定义异常指南

在Java编程中&#xff0c;异常处理是一个非常重要的部分&#xff0c;它允许我们在程序运行时捕获和处理错误情况。除了Java标准库提供的异常类外&#xff0c;我们还可以根据实际需要创建自定义的异常类。自定义异常可以帮助我们更好地描述和处理特定的错误情况。下面&#xff0…

【python的魅力】:教你如何用几行代码实现文本语音识别

文章目录 引言一、运行效果二、文本转换为语音2.1 使用pyttsx32.2 使用SAPI实现文本转换语音2.3 使用 SpeechLib实现文本转换语音 三、语音转换为文本3.1 使用 PocketSphinx实现语音转换文本 引言 语音识别技术&#xff0c;也被称为自动语音识别&#xff0c;目标是以电脑自动将…

Tomcat启动闪退怎么解决(文末附终极解决方案)

AI是这么告诉我的 Tomcat启动时出现闪退问题可能由多种原因引起&#xff0c;以下是解决此类问题的一些通用方法&#xff1a; 检查环境变量&#xff1a; 确保已经正确设置了JAVA_HOME和JRE_HOME环境变量&#xff0c;并指向正确的Java安装路径。将Java的bin目录添加到系统的PATH…