util/sconfig: Add support for discontiguous FW_CONFIG fields

Sooner or later, some board was going to need extra FW_CONFIG bits for
a field that was already in production, so this patch adds support for
adding extra (unused) bits to a field.

The extra are appended via a syntax like:
`field FIELD_NAME START0 END0 | START1 END1 | START2 END2 ...`
and the suffixed bits are all treated as if they are contiguous when
defining option values.

BUG=b:185190978
TEST=Modified volteer fw_config to the following:
field AUDIO 8 10 | 29 29 | 31 31
        option NONE 0
	option MAX98357_ALC5682I_I2S 1
        option MAX98373_ALC5682I_I2S 2
	option MAX98373_ALC5682_SNDW 3
        option MAX98373_ALC5682I_I2S_UP4 4
        option MAX98360_ALC5682I_I2S 5
        option RT1011_ALC5682I_I2S 6
        option AUDIO_FOO 7
	option AUDIO_BAR 8
        option AUDIO_QUUX 9
        option AUDIO_BLAH1 10
        option AUDIO_BLAH2 15
        option AUDIO_BLAH3 16
        option AUDIO_BLAH4 31
end

which yielded (in static_fw_config.h):
 FW_CONFIG_FIELD_AUDIO_MASK 0xa0000700
 FW_CONFIG_FIELD_AUDIO_OPTION_NONE_VALUE 0x0
 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98357_ALC5682I_I2S_VALUE 0x100
 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98373_ALC5682I_I2S_VALUE 0x200
 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98373_ALC5682_SNDW_VALUE 0x300
 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98373_ALC5682I_I2S_UP4_VALUE 0x400
 FW_CONFIG_FIELD_AUDIO_OPTION_MAX98360_ALC5682I_I2S_VALUE 0x500
 FW_CONFIG_FIELD_AUDIO_OPTION_RT1011_ALC5682I_I2S_VALUE 0x600
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_FOO_VALUE 0x700
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BAR_VALUE 0x20000000
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_QUUX_VALUE 0x20000100
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH1_VALUE 0x20000200
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH2_VALUE 0x20000700
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH3_VALUE 0x80000000
 FW_CONFIG_FIELD_AUDIO_OPTION_AUDIO_BLAH4_VALUE 0xa0000700

Change-Id: I5ed76706347ee9642198efc77139abdc3af1b8a6
Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/52747
Reviewed-by: Duncan Laurie <duncan@iceblink.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/util/sconfig/sconfig.tab.c_shipped b/util/sconfig/sconfig.tab.c_shipped
index a8d1e1d..68421a1 100644
--- a/util/sconfig/sconfig.tab.c_shipped
+++ b/util/sconfig/sconfig.tab.c_shipped
@@ -1,8 +1,8 @@
-/* A Bison parser, made by GNU Bison 3.7.2.  */
+/* A Bison parser, made by GNU Bison 3.7.5.  */
 
 /* Bison implementation for Yacc-like parsers in C
 
-   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
+   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
    Inc.
 
    This program is free software: you can redistribute it and/or modify
@@ -45,11 +45,11 @@
    define necessary library symbols; they are noted "INFRINGES ON
    USER NAME SPACE" below.  */
 
-/* Identify Bison output.  */
-#define YYBISON 1
+/* Identify Bison output, and Bison version.  */
+#define YYBISON 30705
 
-/* Bison version.  */
-#define YYBISON_VERSION "3.7.2"
+/* Bison version string.  */
+#define YYBISON_VERSION "3.7.5"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -80,6 +80,7 @@
 static struct bus *cur_parent;
 static struct chip_instance *cur_chip_instance;
 static struct fw_config_field *cur_field;
+static struct fw_config_field_bits *cur_bits;
 
 
 
@@ -155,32 +156,35 @@
   YYSYMBOL_FW_CONFIG_FIELD = 43,           /* FW_CONFIG_FIELD  */
   YYSYMBOL_FW_CONFIG_OPTION = 44,          /* FW_CONFIG_OPTION  */
   YYSYMBOL_FW_CONFIG_PROBE = 45,           /* FW_CONFIG_PROBE  */
-  YYSYMBOL_YYACCEPT = 46,                  /* $accept  */
-  YYSYMBOL_devtree = 47,                   /* devtree  */
-  YYSYMBOL_chipchildren = 48,              /* chipchildren  */
-  YYSYMBOL_devicechildren = 49,            /* devicechildren  */
-  YYSYMBOL_chip = 50,                      /* chip  */
-  YYSYMBOL_51_1 = 51,                      /* @1  */
-  YYSYMBOL_device = 52,                    /* device  */
-  YYSYMBOL_53_2 = 53,                      /* @2  */
-  YYSYMBOL_54_3 = 54,                      /* @3  */
-  YYSYMBOL_alias = 55,                     /* alias  */
-  YYSYMBOL_status = 56,                    /* status  */
-  YYSYMBOL_resource = 57,                  /* resource  */
-  YYSYMBOL_reference = 58,                 /* reference  */
-  YYSYMBOL_registers = 59,                 /* registers  */
-  YYSYMBOL_subsystemid = 60,               /* subsystemid  */
-  YYSYMBOL_ioapic_irq = 61,                /* ioapic_irq  */
-  YYSYMBOL_smbios_slot_desc = 62,          /* smbios_slot_desc  */
-  YYSYMBOL_fw_config_table = 63,           /* fw_config_table  */
-  YYSYMBOL_fw_config_table_children = 64,  /* fw_config_table_children  */
-  YYSYMBOL_fw_config_field_children = 65,  /* fw_config_field_children  */
-  YYSYMBOL_fw_config_field = 66,           /* fw_config_field  */
-  YYSYMBOL_67_4 = 67,                      /* $@4  */
-  YYSYMBOL_68_5 = 68,                      /* $@5  */
-  YYSYMBOL_69_6 = 69,                      /* $@6  */
-  YYSYMBOL_fw_config_option = 70,          /* fw_config_option  */
-  YYSYMBOL_fw_config_probe = 71            /* fw_config_probe  */
+  YYSYMBOL_PIPE = 46,                      /* PIPE  */
+  YYSYMBOL_YYACCEPT = 47,                  /* $accept  */
+  YYSYMBOL_devtree = 48,                   /* devtree  */
+  YYSYMBOL_chipchildren = 49,              /* chipchildren  */
+  YYSYMBOL_devicechildren = 50,            /* devicechildren  */
+  YYSYMBOL_chip = 51,                      /* chip  */
+  YYSYMBOL_52_1 = 52,                      /* @1  */
+  YYSYMBOL_device = 53,                    /* device  */
+  YYSYMBOL_54_2 = 54,                      /* @2  */
+  YYSYMBOL_55_3 = 55,                      /* @3  */
+  YYSYMBOL_alias = 56,                     /* alias  */
+  YYSYMBOL_status = 57,                    /* status  */
+  YYSYMBOL_resource = 58,                  /* resource  */
+  YYSYMBOL_reference = 59,                 /* reference  */
+  YYSYMBOL_registers = 60,                 /* registers  */
+  YYSYMBOL_subsystemid = 61,               /* subsystemid  */
+  YYSYMBOL_ioapic_irq = 62,                /* ioapic_irq  */
+  YYSYMBOL_smbios_slot_desc = 63,          /* smbios_slot_desc  */
+  YYSYMBOL_fw_config_table = 64,           /* fw_config_table  */
+  YYSYMBOL_fw_config_table_children = 65,  /* fw_config_table_children  */
+  YYSYMBOL_fw_config_field_children = 66,  /* fw_config_field_children  */
+  YYSYMBOL_fw_config_field_bits = 67,      /* fw_config_field_bits  */
+  YYSYMBOL_fw_config_field_bits_repeating = 68, /* fw_config_field_bits_repeating  */
+  YYSYMBOL_fw_config_field = 69,           /* fw_config_field  */
+  YYSYMBOL_70_4 = 70,                      /* $@4  */
+  YYSYMBOL_71_5 = 71,                      /* $@5  */
+  YYSYMBOL_72_6 = 72,                      /* $@6  */
+  YYSYMBOL_fw_config_option = 73,          /* fw_config_option  */
+  YYSYMBOL_fw_config_probe = 74            /* fw_config_probe  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -224,6 +228,18 @@
 typedef short yytype_int16;
 #endif
 
+/* Work around bug in HP-UX 11.23, which defines these macros
+   incorrectly for preprocessor constants.  This workaround can likely
+   be removed in 2023, as HPE has promised support for HP-UX 11.23
+   (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+   <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>.  */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
+#endif
+
 #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
 typedef __UINT_LEAST8_TYPE__ yytype_uint8;
 #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
@@ -321,9 +337,9 @@
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(E) ((void) (E))
+# define YY_USE(E) ((void) (E))
 #else
-# define YYUSE(E) /* empty */
+# define YY_USE(E) /* empty */
 #endif
 
 #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
@@ -490,19 +506,19 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   79
+#define YYLAST   83
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  46
+#define YYNTOKENS  47
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  26
+#define YYNNTS  28
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  50
+#define YYNRULES  53
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  89
+#define YYNSTATES  95
 
 /* YYMAXUTOK -- Last valid token kind.  */
-#define YYMAXUTOK   300
+#define YYMAXUTOK   301
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -546,19 +562,19 @@
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45
+      45,    46
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
-static const yytype_int8 yyrline[] =
+static const yytype_uint8 yyrline[] =
 {
-       0,    25,    25,    25,    25,    27,    27,    27,    27,    27,
-      29,    29,    29,    29,    29,    29,    29,    29,    29,    31,
-      31,    40,    40,    48,    48,    56,    58,    62,    62,    64,
-      67,    70,    73,    76,    79,    82,    85,    88,    92,    95,
-      95,    98,    98,   101,   101,   107,   107,   113,   113,   119,
-     123
+       0,    26,    26,    26,    26,    28,    28,    28,    28,    28,
+      30,    30,    30,    30,    30,    30,    30,    30,    30,    32,
+      32,    41,    41,    49,    49,    57,    59,    63,    63,    65,
+      68,    71,    74,    77,    80,    83,    86,    89,    93,    96,
+      96,    99,    99,   102,   108,   108,   111,   110,   115,   115,
+     123,   123,   129,   133
 };
 #endif
 
@@ -581,11 +597,12 @@
   "SLOT_DESC", "IO", "NUMBER", "SUBSYSTEMID", "INHERIT", "IOAPIC_IRQ",
   "IOAPIC", "PCIINT", "GENERIC", "SPI", "USB", "MMIO", "LPC", "ESPI",
   "GPIO", "FW_CONFIG_TABLE", "FW_CONFIG_FIELD", "FW_CONFIG_OPTION",
-  "FW_CONFIG_PROBE", "$accept", "devtree", "chipchildren",
+  "FW_CONFIG_PROBE", "PIPE", "$accept", "devtree", "chipchildren",
   "devicechildren", "chip", "@1", "device", "@2", "@3", "alias", "status",
   "resource", "reference", "registers", "subsystemid", "ioapic_irq",
   "smbios_slot_desc", "fw_config_table", "fw_config_table_children",
-  "fw_config_field_children", "fw_config_field", "$@4", "$@5", "$@6",
+  "fw_config_field_children", "fw_config_field_bits",
+  "fw_config_field_bits_repeating", "fw_config_field", "$@4", "$@5", "$@6",
   "fw_config_option", "fw_config_probe", YY_NULLPTR
 };
 
@@ -605,11 +622,11 @@
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295,   296,   297,   298,   299,   300
+     295,   296,   297,   298,   299,   300,   301
 };
 #endif
 
-#define YYPACT_NINF (-15)
+#define YYPACT_NINF (-21)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
@@ -623,15 +640,16 @@
      STATE-NUM.  */
 static const yytype_int8 yypact[] =
 {
-     -15,     9,   -15,     0,   -15,   -15,   -15,   -15,   -11,   -15,
-     -15,     2,   -15,    45,    -8,    13,     6,    19,   -15,   -15,
-     -15,   -15,   -15,    10,   -15,    23,    12,    11,    36,   -15,
-     -15,    -7,    25,    39,    30,    37,   -15,    -6,   -15,    38,
-     -15,   -15,   -15,   -15,    40,    25,   -15,   -15,    -1,   -15,
-      24,   -15,   -15,   -15,   -15,   -15,    -3,   -15,    27,   -15,
-      41,    31,    32,    46,   -15,   -15,   -15,   -15,   -15,   -15,
-     -15,   -15,     1,    47,    48,    35,    33,    49,   -15,    42,
-      51,    43,    44,   -15,   -15,    52,   -15,   -15,   -15
+     -21,     9,   -21,     2,   -21,   -21,   -21,   -21,   -11,   -21,
+     -21,     8,   -21,    45,   -13,    10,    18,    19,   -21,   -21,
+     -21,   -21,   -21,    12,   -20,   -21,    22,    15,    25,    37,
+     -21,   -21,    24,   -21,    -7,    11,    41,    38,    39,    -6,
+      12,   -20,   -21,   -21,    40,   -21,   -21,   -21,   -21,    43,
+      11,   -21,   -21,   -21,   -21,    -1,    29,   -21,   -21,   -21,
+     -21,   -21,    -3,   -21,    32,   -21,    46,    33,    35,    48,
+     -21,   -21,   -21,   -21,   -21,   -21,   -21,   -21,     1,    51,
+      50,    42,    20,    52,   -21,    44,    53,    47,    54,   -21,
+     -21,    55,   -21,   -21,   -21
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -640,30 +658,31 @@
 static const yytype_int8 yydefact[] =
 {
        2,     0,     1,     0,    40,     3,     4,    19,     0,     9,
-      38,     0,    39,     0,    47,     0,     0,     0,    20,     6,
-       5,     8,     7,    45,    42,     0,     0,     0,     0,    43,
-      42,     0,     0,    25,     0,     0,    42,     0,    48,     0,
-      41,    27,    28,    23,     0,     0,    31,    30,     0,    46,
-       0,    18,    26,    21,    44,    49,     0,    18,     0,    24,
-       0,     0,     0,     0,    11,    10,    12,    16,    13,    14,
-      15,    17,     0,     0,     0,     0,     0,     0,    22,     0,
-      37,    32,     0,    50,    29,    36,    33,    34,    35
+      38,     0,    39,     0,    50,     0,     0,     0,    20,     6,
+       5,     8,     7,    48,    45,    42,     0,     0,     0,     0,
+      43,    42,     0,    46,     0,     0,    25,     0,     0,     0,
+       0,    45,    42,    51,     0,    41,    27,    28,    23,     0,
+       0,    31,    30,    49,    44,     0,     0,    18,    26,    21,
+      47,    52,     0,    18,     0,    24,     0,     0,     0,     0,
+      11,    10,    12,    16,    13,    14,    15,    17,     0,     0,
+       0,     0,     0,     0,    22,     0,    37,    32,     0,    53,
+      29,    36,    33,    34,    35
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -15,   -15,   -15,    15,    17,   -15,    57,   -15,   -15,   -15,
-      34,   -15,   -15,    62,   -15,   -15,   -15,   -15,   -15,   -14,
-     -15,   -15,   -15,   -15,   -15,   -15
+     -21,   -21,   -21,     5,    17,   -21,    61,   -21,   -21,   -21,
+      26,   -21,   -21,    62,   -21,   -21,   -21,   -21,   -21,    -8,
+      49,    36,   -21,   -21,   -21,   -21,   -21,   -21
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-      -1,     1,    13,    56,    64,     9,    65,    57,    51,    45,
-      43,    66,    21,    67,    68,    69,    70,     6,     8,    31,
-      12,    36,    30,    24,    40,    71
+       0,     1,    13,    62,    70,     9,    71,    63,    57,    50,
+      48,    72,    21,    73,    74,    75,    76,     6,     8,    34,
+      24,    33,    12,    42,    31,    25,    45,    77
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -671,52 +690,55 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int8 yytable[] =
 {
-       3,    15,    16,    10,     3,    15,    16,    38,    49,     2,
-      58,    59,     3,    54,    58,    78,    37,     7,     5,    14,
-      25,    23,    48,    27,    60,    26,    34,    61,    60,    62,
-      19,    61,    11,    62,    41,    42,    28,    39,    39,    29,
-      32,    33,    63,    39,    35,    44,    63,    46,     3,    15,
-      16,     4,    17,    55,    47,    50,    73,    52,    74,    18,
-      75,    76,    79,    77,    81,    80,    83,    82,    85,    88,
-      20,    84,    72,    87,    86,    22,     0,     0,     0,    53
+       3,    15,    16,    10,     3,    15,    16,    43,    53,     2,
+      64,    65,     3,    60,    64,    84,    23,    26,     5,     7,
+      46,    47,    27,    39,    66,    14,    32,    67,    66,    68,
+      19,    67,    11,    68,    55,    28,    29,    44,    44,    35,
+      37,    30,    69,    44,    36,    38,    69,    49,     3,    15,
+      16,     4,    17,    40,    88,    51,    52,    56,    61,    18,
+      58,    79,    81,    80,    82,    83,    85,    86,    78,    89,
+      91,    87,    94,    90,    20,    22,    59,    54,    92,     0,
+       0,    41,     0,    93
 };
 
 static const yytype_int8 yycheck[] =
 {
        3,     4,     5,    14,     3,     4,     5,    14,    14,     0,
-      13,    14,     3,    14,    13,    14,    30,    17,     1,    17,
-       7,    29,    36,    17,    27,    12,    15,    30,    27,    32,
-      13,    30,    43,    32,     9,    10,    17,    44,    44,    29,
-      17,    29,    45,    44,     8,     6,    45,    17,     3,     4,
-       5,    42,     7,    29,    17,    17,    29,    17,    17,    14,
-      29,    29,    15,    17,    29,    17,    17,    34,    17,    17,
-      13,    29,    57,    29,    31,    13,    -1,    -1,    -1,    45
+      13,    14,     3,    14,    13,    14,    29,     7,     1,    17,
+       9,    10,    12,    31,    27,    17,    46,    30,    27,    32,
+      13,    30,    43,    32,    42,    17,    17,    44,    44,    17,
+      15,    29,    45,    44,    29,     8,    45,     6,     3,     4,
+       5,    42,     7,    29,    34,    17,    17,    17,    29,    14,
+      17,    29,    29,    17,    29,    17,    15,    17,    63,    17,
+      17,    29,    17,    29,    13,    13,    50,    41,    31,    -1,
+      -1,    32,    -1,    29
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_int8 yystos[] =
 {
-       0,    47,     0,     3,    42,    50,    63,    17,    64,    51,
-      14,    43,    66,    48,    17,     4,     5,     7,    14,    50,
-      52,    58,    59,    29,    69,     7,    12,    17,    17,    29,
-      68,    65,    17,    29,    15,     8,    67,    65,    14,    44,
-      70,     9,    10,    56,     6,    55,    17,    17,    65,    14,
-      17,    54,    17,    56,    14,    29,    49,    53,    13,    14,
-      27,    30,    32,    45,    50,    52,    57,    59,    60,    61,
-      62,    71,    49,    29,    17,    29,    29,    17,    14,    15,
-      17,    29,    34,    17,    29,    17,    31,    29,    17
+       0,    48,     0,     3,    42,    51,    64,    17,    65,    52,
+      14,    43,    69,    49,    17,     4,     5,     7,    14,    51,
+      53,    59,    60,    29,    67,    72,     7,    12,    17,    17,
+      29,    71,    46,    68,    66,    17,    29,    15,     8,    66,
+      29,    67,    70,    14,    44,    73,     9,    10,    57,     6,
+      56,    17,    17,    14,    68,    66,    17,    55,    17,    57,
+      14,    29,    50,    54,    13,    14,    27,    30,    32,    45,
+      51,    53,    58,    60,    61,    62,    63,    74,    50,    29,
+      17,    29,    29,    17,    14,    15,    17,    29,    34,    17,
+      29,    17,    31,    29,    17
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_int8 yyr1[] =
 {
-       0,    46,    47,    47,    47,    48,    48,    48,    48,    48,
-      49,    49,    49,    49,    49,    49,    49,    49,    49,    51,
-      50,    53,    52,    54,    52,    55,    55,    56,    56,    57,
-      58,    59,    60,    60,    61,    62,    62,    62,    63,    64,
-      64,    65,    65,    67,    66,    68,    66,    69,    66,    70,
-      71
+       0,    47,    48,    48,    48,    49,    49,    49,    49,    49,
+      50,    50,    50,    50,    50,    50,    50,    50,    50,    52,
+      51,    54,    53,    55,    53,    56,    56,    57,    57,    58,
+      59,    60,    61,    61,    62,    63,    63,    63,    64,    65,
+      65,    66,    66,    67,    68,    68,    70,    69,    71,    69,
+      72,    69,    73,    74
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -726,8 +748,8 @@
        2,     2,     2,     2,     2,     2,     2,     2,     0,     0,
        5,     0,     8,     0,     7,     0,     2,     1,     1,     4,
        4,     4,     3,     4,     4,     5,     4,     3,     3,     2,
-       0,     2,     0,     0,     7,     0,     6,     0,     5,     3,
-       3
+       0,     2,     0,     2,     3,     0,     0,     7,     0,     6,
+       0,     5,     3,     3
 };
 
 
@@ -806,7 +828,7 @@
                        yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
 {
   FILE *yyoutput = yyo;
-  YYUSE (yyoutput);
+  YY_USE (yyoutput);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
@@ -814,7 +836,7 @@
     YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
 # endif
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  YYUSE (yykind);
+  YY_USE (yykind);
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
@@ -928,13 +950,13 @@
 yydestruct (const char *yymsg,
             yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
 {
-  YYUSE (yyvaluep);
+  YY_USE (yyvaluep);
   if (!yymsg)
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
 
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-  YYUSE (yykind);
+  YY_USE (yykind);
   YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
@@ -1290,41 +1312,47 @@
                                                               { }
     break;
 
-  case 43: /* $@4: %empty  */
-                                                                                          {
-	cur_field = new_fw_config_field((yyvsp[-2].string), strtoul((yyvsp[-1].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
+  case 43: /* fw_config_field_bits: NUMBER NUMBER  */
+{
+	append_fw_config_bits(&cur_bits, strtoul((yyvsp[-1].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
 }
     break;
 
-  case 44: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER NUMBER $@4 fw_config_field_children END  */
-                                     { }
+  case 46: /* $@4: %empty  */
+        { cur_field = new_fw_config_field((yyvsp[-2].string), cur_bits); }
     break;
 
-  case 45: /* $@5: %empty  */
+  case 47: /* fw_config_field: FW_CONFIG_FIELD STRING fw_config_field_bits fw_config_field_bits_repeating $@4 fw_config_field_children END  */
+                                     { cur_bits = NULL; }
+    break;
+
+  case 48: /* $@5: %empty  */
                                                             {
-	cur_field = new_fw_config_field((yyvsp[-1].string), strtoul((yyvsp[0].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
+	cur_bits = NULL;
+	append_fw_config_bits(&cur_bits, strtoul((yyvsp[0].string), NULL, 0), strtoul((yyvsp[0].string), NULL, 0));
+	cur_field = new_fw_config_field((yyvsp[-1].string), cur_bits);
 }
     break;
 
-  case 46: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER $@5 fw_config_field_children END  */
-                                     { }
+  case 49: /* fw_config_field: FW_CONFIG_FIELD STRING NUMBER $@5 fw_config_field_children END  */
+                                     { cur_bits = NULL; }
     break;
 
-  case 47: /* $@6: %empty  */
+  case 50: /* $@6: %empty  */
                                         {
 	cur_field = get_fw_config_field((yyvsp[0].string));
 }
     break;
 
-  case 48: /* fw_config_field: FW_CONFIG_FIELD STRING $@6 fw_config_field_children END  */
-                                     { }
+  case 51: /* fw_config_field: FW_CONFIG_FIELD STRING $@6 fw_config_field_children END  */
+                                     { cur_bits = NULL; }
     break;
 
-  case 49: /* fw_config_option: FW_CONFIG_OPTION STRING NUMBER  */
+  case 52: /* fw_config_option: FW_CONFIG_OPTION STRING NUMBER  */
         { add_fw_config_option(cur_field, (yyvsp[-1].string), strtoull((yyvsp[0].string), NULL, 0)); }
     break;
 
-  case 50: /* fw_config_probe: FW_CONFIG_PROBE STRING STRING  */
+  case 53: /* fw_config_probe: FW_CONFIG_PROBE STRING STRING  */
         { add_fw_config_probe(cur_parent, (yyvsp[-1].string), (yyvsp[0].string)); }
     break;