(1).behavioral-model

简称bmv2

P4程序首先经过p4c-bm模块编译成JSON格式的配置文件,然后将配置文件载入到bmv2中,转化成能实现交换机功能的数据结构。

behavioral-model模块最重要的是simple-switch,即实现P4语言标准中抽象交换机模型,另外两个目标是(simple_router,l2_switch)

(2)p4-hlir

将P4代码转换成高级中间表示的前端编译器,该编译器的目的是使得后端编译器开发者从语法分析和目标无关的语义检查的负担中解放出来。

(3)p4c-bm

behavior model的后端编译器,建立在p4-hilr的顶部,该模块以P4程序作为输入,输出一个可以载入到behavioral model的JSON配置文件

(4) P4-build

需要手动生成的基础设施库,为执行P4程序编译、安装PD库

(5)switch

内含switch.p4程序样例以及通过SAI、SwitchAPI和Switchlink操作交换机所需的所有库,可独立于p

4factory运行

(6)ntf(Network Test Framework)

网络测试框架,内含用以执行bmv2上应用的网络测试样例,该框架中集成了mininet和docker,方便用户进行测试

(7)p4factory
内含整套用以运行和开发基于behavioral model的P4程序环境的代码,帮助用户快速开发P4程序。

(8)ptf
数据平面测试框架,基于unittest框架实现,内含标准Python版本。该框架中的大部分代码从floodlight项目中的OFTest框架移植而来,框架的实现和开发可参考OFTest框架文档。

(9)scapy-vxlan
基于Scapy项目,barefoot对其进行了定制,支持更多协议的数据包包头的伪造和解析,目前支持 VXLAN和ERSPAN-like(Scapy本身并不支持)。

2.1 基础数据类型及操作

P4语言中定义了5种基础数据类型,分别是:bool、bit、int、varbit、int。(注:此处W代表长度,通常使用十进制数字表示,如bit)通常情况下,不同的数据类型之间可以相互转换,并且所有的二目运算符都要求数据类型保持一致,除了位移操作符(shifts)。

(1)布尔型(bool)
布尔型(Boolean),值为true或false,非整数型。布尔类型数据可进行如表1所示运算。

运算符

描述

and

二目运算符,操作数必须都为布尔型,运算结果为布尔型。

or

二目运算符,操作数必须都为布尔型,运算结果为布尔型。

not

单目运算符,操作数必须为布尔型,运算结果为布尔型。

==,!=

测试是否相等或不等,运算结果为布尔型。

表1 布尔型支持的运算

(2)无符号整型(bit)
无符号整型(unsigned integers)也叫位串(bit-string)。位串是以比特位形式表示的任意长度的数(如:bit,表示长度为127比特的位串),但如果需要对位串进行某些数学运算时,位串长度必须是8的整数倍(如:16、32、64bit)。无符号整型支持如表2所示运算。

运算符

描述

==,!=

测试是否相等或不等,运算结果为布尔型。

<,>,<=,>=

无符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。

&,|,^

按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。

运算结果为操作数的补码。

<<,>>

左移运算符操作数为无符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。

+(单目)

单目加运算,效果同no-op。

-(单目)

单目减运算,计算结果为2W减去操作数,W为操作数长度。

+(双目)

二目加运算,操作数的长度(W)要求相同。计算结果为操作数的算术和,且运算结果长度也必须为W,超过则截断。

-(双目)

二目减运算,操作数的长度(W)要求相同。计算结果为操作数的算术差。

*

无符号乘法运算,操作数的长度(W)要求相同,计算结果为无符号数且长度与操作数相等。

表2 无符号整型支持的运算

3)有符号整型(int(W))

有符号整型(signed integers)支持如表3所示运算。

运算符

描述

==,!=

测试是否相等或不等,运算结果为布尔型。

<,>,<=,>=

有符号数比较,操作数的长度(W)要求相同,运算结果为布尔型。

&,|,^

按位运算符,操作数的长度(W)要求相同,运算结果为无符号整型。

运算结果为操作数的补码。

<<,>>

左移运算符操作数为有符号整型,右移运算符操作数必须是无符号数或非负整数。此运算符为逻辑位移。

+(单目)

单目加运算,效果同no-op。

-(单目)

单目减运算,运算结果有符号整型,且长度与操作数相等。

+(双目)

二目加运算,操作数数据类型必须相同,运算结果也为同类型。

-(双目)

二目减运算,操作数数据类型必须相同,运算结果也为同类型。

*

有符号乘法运算,操作数的长度(W)要求相同,计算结果为有符号数且长度与操作数相等。

表3 有符号整型支持的运算

(4)变长位串(varbit)
变长位串(dynamically-sized bit-strings)不支持算术、比较、按位运算,甚至不支持类型转换。该数据类型在定义时会指定一个静态的最大宽度值,解析器会提取变长位串数据并设置一个值作为长度。

(5)无限精度整型(int)
无限精度整数(infinite-precision integers)支持如表4所示运算。

运算符

描述

==,!=

测试是否相等或不等,操作数必须都是整型(int)运算结果为布尔型。

<,>,<=,>=

有符号数比较,操作数类型都必须是整形,运算结果为布尔型。

<<,>>

右移运算符操作数必须为正整数;左移运算结果和操作数相同。a<<b等价于ax2b,a>>b等价于a/2b。

+(单目)

单目加运算,效果同no-op。

-(单目)

单目减运算,运算结果为整型,且该运算不会导致溢出。

+(双目)

二目加运算,操作数类型都必须是整型,运算结果为整型,且该运算不会导致溢出。

-(双目)

二目减运算,操作数类型都必须是整型,计算结果为整型,且该运算不会导致溢出。

*

无符号乘法运算,操作数必须都是整形,计算结果为整形,该运算不会导致溢出。

/,%

二目有符号除法和取模运算,操作数必须是正整数,运算结果为正整数。

P4-可编程语言代码学习的更多相关文章

  1. u-boot代码学习内容

    前言  u-boot代码庞大,不可能全部细读,只能有选择的读部分代码.在读代码之前,根据韦东山教材,关于代码学习内容和深度做以下预先划定. 一.Makefile.mkconfig.config.mk等 ...

  2. Objective-C代码学习大纲(3)

    Objective-C代码学习大纲(3) 2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍 ...

  3. ORB-SLAM2 论文&代码学习 ——Tracking 线程

    本文要点: ORB-SLAM2 Tracking 线程 论文内容介绍 ORB-SLAM2 Tracking 线程 代码结构介绍 写在前面 上一篇文章中我们已经对 ORB-SLAM2 系统有了一个概览性 ...

  4. ORB-SLAM2 论文&代码学习 —— 单目初始化

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12358458.html 本文要点: ORB-SLAM2 单目初始化 ...

  5. ORB-SLAM2 论文&代码学习 —— LocalMapping 线程

    转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12360913.html 本文要点: ORB-SLAM2 Local ...

  6. Learning Memory-guided Normality代码学习笔记

    Learning Memory-guided Normality代码学习笔记 记忆模块核心 Memory部分的核心在于以下定义Memory类的部分. class Memory(nn.Module): ...

  7. 3.1.5 LTP(Linux Test Project)学习(五)-LTP代码学习

    3.1.5 LTP(Linux Test Project)学习(五)-LTP代码学习 Hello小崔 ​ 华为技术有限公司 Linux内核开发 2 人赞同了该文章 LTP代码学习方法主要介绍两个步骤, ...

  8. Apollo代码学习(七)—MPC与LQR比较

    前言 Apollo中用到了PID.MPC和LQR三种控制器,其中,MPC和LQR控制器在状态方程的形式.状态变量的形式.目标函数的形式等有诸多相似之处,因此结合自己目前了解到的信息,将两者进行一定的比 ...

  9. R2CNN项目部分代码学习

    首先放出大佬的项目地址:https://github.com/yangxue0827/R2CNN_FPN_Tensorflow 那么从输入的数据开始吧,输入的数据要求为tfrecord格式的数据集,好 ...

随机推荐

  1. java基础编程练习题

    1.題目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1 2 3 4 5 6 7 1 1 2 3 ...

  2. 使用Hot Chocolate和.NET 6构建GraphQL应用(2) —— 实体相关功能实现

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在本文中,我们将会准备好用于实现GraphQL接口所依赖的底层数据,为下一篇文章具体实现GraphQL接口做 ...

  3. 权限修饰符和final关键字

    public 不受任何限制,可以被其他任何类访问 一个JAVA文件只能包含一个public文件 java将public类作为每个编译单元的数据接口  只能有一个接口 private 只能在自己类中访问 ...

  4. Redis内存满了怎么办(新年快乐)

    Redis内存满了怎么办(新年快乐) 入我相思门,知我相思苦. 长相思兮长相忆,短相思兮无穷极. 一.配置文件 Redis长期使用或者不设置过期时间,导致内存爆满或不足,可以到Redis的配置文件re ...

  5. plsql 函数的定义 包规范和包主体。

    /* 一.函数? 1.函数定义 函数的内容 根据实际需要来定义 2.使用的方式 */ -- 定义函数 根据部门编号查询出部门的总人数 create or replace function fn( de ...

  6. Zookeeper应用场景汇总(超详细)

    Zookeeper典型应用场景汇总 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例 ...

  7. StarUML官网地址 http://staruml.io/

    StarUML官网地址 http://staruml.io/

  8. 谷粒商城Day1

    环境搭建 安装JDK1.8: 1 下载并解压jdk1.8 tar -zxvf jdk-8u281-linux-x64.tar.gz(检查本机有没有jdk有的话卸载掉.安装上自己的jdk) 2 配上环境 ...

  9. Hadoop完全分布式的配置

    选取机器sam01作为主节点,并进行分布式文件的配置 1.进入Hadoop配置文件路径/usr/local/hadoop/etc/hadoop(这里我把Hadoop安装在/usr/local目录下) ...

  10. redis(三)-----redis基本数据类型

    Redis的全称是REmote Dictionary Server,它主要提供了5种数据结构:字符串.哈希.列表.集合.有序集合,同时在字符串的基础之上演变 出了位图(Bitmaps)和HyperLo ...