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子语句

  1. +--------------+---------+-------------+
  2. | substatement | section | cardinality |
  3. +--------------+---------+-------------+
  4. | description | 7.21.3 | 0..1 |
  5. | if-feature | 7.20.2 | 0..n |
  6. | position | 9.7.4.2 | 0..1 |
  7. | reference | 7.21.4 | 0..1 |
  8. | status | 7.21.2 | 0..1 |
  9. +--------------+---------+-------------+

9.7.4.2. “position”声明

position”语句是可选的,它将一个非负整数值作为参数,该值指定位在假设位域内的位置。位置值必须在04294967295之间,并且在位类型中它必须是唯一的。

如果没有指定位的位置,则会自动分配一个位。如果“bit”子语句是第一个被定义的,则赋值为零(0)。否则,所分配的值比当前最高位位置(即,在父“type”语句中的当前“bit”子语句之前的隐式或显式最高位位置)大1

请注意,在“bit”语句中存在“if-feature”语句不会影响自动分配的位置。

如果当前最高位的位置值等于4294967295,则必须为当前最高位置值之后的“bit”子位置指定一个位置值。

当一个现有的位类型受到限制时,“position”语句必须具有与基类型相同的值或不存在,在这种情况下,该值与基类型中的值相同。

9.7.5. 使用示例

鉴于以下typedef和叶:

  1. typedef mybits-type {
  2. type bits {
  3. bit disable-nagle {
  4. position 0;
  5. }
  6. bit auto-sense-speed {
  7. position 1;
  8. }
  9. bit ten-mb-only {
  10. position 2;
  11. }
  12. }
  13. }
  14. leaf mybits {
  15. type mybits-type;
  16. default "auto-sense-speed";
  17. }

这个叶子的词法表示的值为disable-nagle10-mb-only集合将是:

  1. <mybits>disable-nagle ten-mb-only</mybits>

下面的例子显示了这种类型的合法改进:

  1. type mybits-type {
  2. // legal bit refinement
  3. bit disable-nagle {
  4. position 0;
  5. }
  6. bit auto-sense-speed {
  7. position 1;
  8. }
  9. }

而下面的改进是非法的:

  1. type mybits-type {
  2. // illegal bit refinement
  3. bit disable-nagle {
  4. position 2; // illegal position change
  5. }
  6. bit hundred-mb-only; // illegal addition of new name
  7. }