p4 language learning :Part 3(学习笔记)

本文介绍了P4语言的名称解析、可见性规则、基本数据类型等内容。重点讲解了P4中标识符的解析规则、作用域及不同数据类型的特点与使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

p4 language learning :Part 3(学习笔记)

3.1 Name resolution

引入名称空间的P4对象是以分层方式组织的。有一个顶层未命名的名称空间,其中包含所有顶层声明。
前缀有点的标识符始终在顶级名称空间中解析。

const bit<32> x = 2;
control c() {
   int<32> x = 0;
   apply {
       x = x + (int<32>).x;  // x is the int<32> local variable,
                             // .x is the top-level bit<32> variable
   }
}

从当前作用域开始,再到所有词法包围的作用域,都尝试由内而外地解析标识符的引用。

const bit<4> x = 1;
control p() {
    const bit<8> x = 8;    // x declaration shadows global x
    const bit<4> y = .x;   // reference to top-level x
    const bit<8> z = x;    // reference to p's local x
    apply {}
}

3.2 Visibility

顶级名称空间中定义的标识符是全局可见的。parser或control中的声明是私有的,不能从封闭的parser或控件control进行引用。

3.3 P4 data types

P416是一种静态类型的语言。未通过类型检查器的程序将被视为无效程序并被编译器拒绝。 P4提供了许多基本类型以及构造派生类型的类型运算符。可以使用强制转换将某些值转换为其他类型。但是,为了使用户的意图清晰明了,仅在少数情况下才允许使用隐式强制转换,并且有意限制了可用强制转换的范围。

3.3.1 Base types

P4支持以下内置基本类型:
1.void类型,没有任何值,只能在少数情况下使用
2.error类型,用于以目标无关,编译器管理的方式传达错误
3.match_kind类型,用于描述表查找的实现
4.bool类型,承接bool值
5.固定宽度的位串,由bit <>表示
6.使用二进制补码int <>表示的固定宽度的有符号整数
7.具有固定最大宽度的动态计算宽度的位字符串varbit <>

3.3.1.1 The void type

void类型被写为void。它不包含任何值。它不包含在生产规则baseType中,因为它只能出现在P4程序中的几个受限位置

3.3.1.2 The error type

错误类型包含可用于指示错误的不透明值。它被写为错误。错误类型的新常量使用以下语法定义:

errorDeclaration
    : ERROR '{' identifierList '}'
    ;

不论定义error的位置如何,所有error常量都将插入到error命名空间中。error类似于其他语言中的枚举(enum)类型。一个程序可以包含多个error声明,编译器将这些error声明合并在一起。多次声明相同的标识符是错误的。

例如,以下声明创建两个错误类型的常量(这些错误在P4核心库中声明):

error { ParseError, PacketTooShort }

The underlying representation of errors is target-dependent.

3.3.1.3 The match kind type

match_kind类型与错误类型非常相似,用于声明一组可以在表的key属性中使用的名称。所有标识符都插入到顶级命名空间中。多次声明相同的match_kind标识符是错误的。

P4核心库包含以下match_kind声明:

match_kind {
   exact,
   ternary,
   lpm
}

体系结构可能支持其他match_kinds。新的match_kinds的声明只能在model描述文件中进行; P4程序员不能声明新的匹配类型。

3.1.1.4 The Boolean type

布尔类型bool值仅包含两个值,即false和true。布尔值不是整数或位字符串。

3.1.1.5 Strings

P4不支持字符串处理。在P4程序中唯一可以出现的字符串是常量字符串文字。例如,以下注释指示在生成控制平面API时应为表使用特定名称:

@name("acl") table t1 { ...}

3.1.1.6 Integers (signed and unsigned)

P4支持任意大小的整数值。整数类型的键入规则是根据以下原则选择的:
1.受C启发:整数的键入是在C定义明确的部分之后进行建模的,并扩展为应付任意固定宽度的整数。 特别是,表达式结果的类型仅取决于表达式操作数,而不取决于表达式的结果如何使用。
2.没有不确定的行为:P4尝试避免C的许多行为,包括整数(int)的大小,溢出产生的结果以及某些输入组合产生的结果(例如,负数移位,带符号数的溢出) 等)。 整数类型的P4计算没有未定义的行为。
3.最令人惊讶的是:选择了P4输入规则,使其表现得与传统的行为良好的C程序尽可能接近
4.Forbid rather than surprise(不知道怎么翻译):我们没有提供令人惊讶或不确定的结果(例如,在有符号整数和无符号整数之间进行C比较),而是选择了禁止使用歧义解释的表达式。 例如,P4不允许组合有符号和无符号整数的二进制运算。

算术运算的优先级与C相同-例如,乘法绑定比加法绑定更紧密。

3.1.1.6.1 Portability

没有任何P4目标可以支持所有可能的类型和操作。 例如,在P4中,bit <23132312>类型是合法的,但实际上在任何目标上都不太可能支持它。 因此,每个目标都可以对其支持的类型施加限制。 此类限制可能包括:
1.支持的最大宽度
2.对齐和填充约束(例如,算术只能在整数字节的宽度上受支持)。
3.对某些操作数的约束(例如,某些体系结构可能仅支持常数较小的乘法或值较小的移位)。
目标随附的文档应明确规定限制,遇到目标限制时,特定于目标的编译器应提供明确的错误消息。架构可能会拒绝类型良好的P4程序,但仍然符合P4规范。但是,如果体系结构接受P4程序为有效程序,则运行时程序行为应与此规范匹配。

3.1.1.6.2 Unsigned integers (bit-strings)

无符号整数(也称为 “位串”)具有任意宽度,以位表示。一个位串 声明为: bit. W 必须是编译时已知值得出大于0的正整数。

位串中的位从 0 至 W-1。位0 是最不重要的 W-1 是最重要的。

例如,类型 bit<128> 表示具有128位(从0到127)的位串值的类型,其中127位是最高有效位。

方式 bit 是的简写 bit<1>.

P4体系结构可能会对位类型施加其他约束:例如,它们可能会限制最大大小,或者它们可能仅支持某些大小(例如16位,32位和64位值)的算术运算。

3.1.1.6.3 Signed Integers

有符号整数的表示使用两个补充。一个整数有w bits被声明为int< w >。 W 必须是一个编译时已知值,计算得出的正整数大于1。

整数中的位从 0 至 W-1。W-1 是符号位。

例如,类型 int< 64 > 描述了用正好64个位表示的整数类型,其中位从0到63编号,其中位63是最高有效(符号)位。

P4体系结构可能会对带符号的类型施加其他约束:例如,它们可能会限制最大大小,或者它们可能仅支持某些大小(例如16位,32位和64位值)的某些算术运算。

3.1.1.6.4 Dynamically-sized bit-strings

一些网络协议使用仅在运行时才知道其大小的字段(例如,IPv4选项)。为了支持此类值的受限操作,P4提供了一种特殊的位字符串类型,其大小在运行时设置,称为varbit.

类型 varbit< W > 表示宽度最大为 W 位,W必须是一个正整数,它是编译时已知的值。例如,类型varbit<120>表示可能具有0到120位之间的位串值的类型。适用于固定大小的位字符串(无符号数字)的大多数操作是不能在动态大小的位字符串上执行。

P4体系结构可能会对varbit类型施加其他约束:例如,它们可能会限制最大大小,或者可能需要 varbit 值在运行时始终包含整数字节。

3.1.1.6.5 Infinite-precision integers

无限精度数据类型描述具有无限精度的整数。这种类型写为int.

此类型保留给整数文字和仅包含文字的表达式。P4运行时值不能具有int 类型; 在编译时,编译器将根据下面描述的规则将具有运行时组件的所有int值转换为固定宽度类型。

3.1.1.6.6 Integer literal types

整数文字(常量)的类型如下:

一个简单的整数常量具有类型 int.
以整数宽度为前缀的正整数 N 和字母 w 有类型 bit< N >.
以整数宽度为前缀的整数 N 和字母 s 有类型 int< N >.

Literal Interpretation
10 Type is int, value is 10
8w10 Type is bit<8>, value is 10
8s10 Type is int<10>, value is 10
2s3 Type is int<2>, value is -1 (last 2 bits), overflow warning
1w10 Type is bit<1>, value is 0 (last bit), overflow warning
1s10 Error: 1-bit signed type is illegal

注:我认为8s10应该表示类型为int< 8 > 的,值为10的整数,可能是文档错了,也可能是我理解错了,欢迎指正

笔者注:
本文仅用于学习用途,原文档为p4_16 Language Specification

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值