9.7. 位(bits
)内置类型
位(bits
)内置类型表示一个位集。也就是说,一个比特值是由从0
开始的小整数位置号标识的一组标志。每个比特号都有一个分配的名称。
当一个现有的位类型受到限制时,新类型中的一组指定名称必须是基类型的指定名称集合的一个子集。这个指定名称的位位置不能被改变。
9.7.1. 限制
位类型可以用“bits
”(9.7.4节)语句来限制。
9.7.2. 词汇表示
位类型的词汇表示是所设置的位的名称的空格分隔列表。 因此零长度的字符串表示没有位被设置的值。
9.7.3. 规范形式
在规范形式中,位值由一个单独的空格字符分隔,并按其位置排序(见第9.7.4.2节)。
9.7.4. “bits
”声明
如果类型是“bits
”,则必须存在“bit
”语句,它是“type
”语句的子语句。 它被重复用于指定每个分配的位类型的命名位。 它以一个字符串作为参数,该字符串是该位的分配名称。 紧接着是一个包含详细比特信息的子语句块。 分配的名称遵循与标识符相同的语法规则(请参见第6.2节)。
所有以位类型分配的名称必须是唯一的。
9.7.4.1. bit
子语句
+--------------+---------+-------------+
| substatement | section | cardinality |
+--------------+---------+-------------+
| description | 7.21.3 | 0..1 |
| if-feature | 7.20.2 | 0..n |
| position | 9.7.4.2 | 0..1 |
| reference | 7.21.4 | 0..1 |
| status | 7.21.2 | 0..1 |
+--------------+---------+-------------+
9.7.4.2. “position
”声明
“position
”语句是可选的,它将一个非负整数值作为参数,该值指定位在假设位域内的位置。位置值必须在0
到4294967295
之间,并且在位类型中它必须是唯一的。
如果没有指定位的位置,则会自动分配一个位。如果“bit
”子语句是第一个被定义的,则赋值为零(0
)。否则,所分配的值比当前最高位位置(即,在父“type
”语句中的当前“bit
”子语句之前的隐式或显式最高位位置)大1
。
请注意,在“bit
”语句中存在“if-feature
”语句不会影响自动分配的位置。
如果当前最高位的位置值等于4294967295
,则必须为当前最高位置值之后的“bit
”子位置指定一个位置值。
当一个现有的位类型受到限制时,“position
”语句必须具有与基类型相同的值或不存在,在这种情况下,该值与基类型中的值相同。
9.7.5. 使用示例
鉴于以下typedef
和叶:
typedef mybits-type {
type bits {
bit disable-nagle {
position 0;
}
bit auto-sense-speed {
position 1;
}
bit ten-mb-only {
position 2;
}
}
}
leaf mybits {
type mybits-type;
default "auto-sense-speed";
}
这个叶子的词法表示的值为disable-nagle
和10-mb-only
集合将是:
<mybits>disable-nagle ten-mb-only</mybits>
下面的例子显示了这种类型的合法改进:
type mybits-type {
// legal bit refinement
bit disable-nagle {
position 0;
}
bit auto-sense-speed {
position 1;
}
}
而下面的改进是非法的:
type mybits-type {
// illegal bit refinement
bit disable-nagle {
position 2; // illegal position change
}
bit hundred-mb-only; // illegal addition of new name
}