intel/gen_decoder: Add the concept of array "levels".
authorRafael Antognolli <rafael.antognolli@intel.com>
Fri, 12 Jul 2019 23:30:39 +0000 (16:30 -0700)
committerRafael Antognolli <rafael.antognolli@intel.com>
Tue, 23 Jul 2019 17:45:19 +0000 (17:45 +0000)
We currently only support one level, which is the basic level of a
<group> tag.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/intel/common/gen_decoder.c
src/intel/common/gen_decoder.h

index cb182b15722d8ec48ac723a47f2ab4942e880339..8c83512330ba8e3024c762c98de6d441e2021ed1 100644 (file)
@@ -904,13 +904,15 @@ iter_array_offset_bits(const struct gen_field_iterator *iter,
 static bool
 iter_more_arrays(const struct gen_field_iterator *iter)
 {
+   int lvl = iter->level;
+
    if (iter->group->variable) {
       int length = gen_group_get_length(iter->group, iter->p);
       assert(length >= 0 && "error the length is unknown!");
-      return iter_array_offset_bits(iter, iter->array_iter + 1) <
+      return iter_array_offset_bits(iter, iter->array_iter[lvl] + 1) <
               (length * 32);
    } else {
-      return (iter->array_iter + 1) < iter->group->array_count ||
+      return (iter->array_iter[lvl] + 1) < iter->group->array_count ||
          iter->group->next != NULL;
    }
 }
@@ -920,7 +922,8 @@ iter_start_field(struct gen_field_iterator *iter, struct gen_field *field)
 {
    iter->field = field;
 
-   int array_member_offset = iter_array_offset_bits(iter, iter->array_iter);
+   int array_member_offset =
+      iter_array_offset_bits(iter, iter->array_iter[iter->level]);
 
    iter->start_bit = array_member_offset + iter->field->start;
    iter->end_bit = array_member_offset + iter->field->end;
@@ -930,14 +933,16 @@ iter_start_field(struct gen_field_iterator *iter, struct gen_field *field)
 static void
 iter_advance_array(struct gen_field_iterator *iter)
 {
+   int lvl = iter->level;
+
    if (iter->group->variable)
-      iter->array_iter++;
+      iter->array_iter[lvl]++;
    else {
-      if ((iter->array_iter + 1) < iter->group->array_count) {
-         iter->array_iter++;
+      if ((iter->array_iter[lvl] + 1) < iter->group->array_count) {
+         iter->array_iter[lvl]++;
       } else {
          iter->group = iter->group->next;
-         iter->array_iter = 0;
+         iter->array_iter[lvl] = 0;
       }
    }
 
@@ -1067,7 +1072,7 @@ iter_decode_field(struct gen_field_iterator *iter)
    if (strlen(iter->group->name) == 0) {
       int length = strlen(iter->name);
       snprintf(iter->name + length, sizeof(iter->name) - length,
-               "[%i]", iter->array_iter);
+               "[%i]", iter->array_iter[iter->level]);
    }
 
    if (enum_name) {
index c71095f122bb10291a39addfaa4c1fb10c25d488..85d88196456bc742d9216656b71f149d0c80a3e9 100644 (file)
@@ -72,6 +72,10 @@ struct gen_enum *gen_spec_find_enum(struct gen_spec *spec, const char *name);
 
 bool gen_field_is_header(struct gen_field *field);
 
+/* Only allow 5 levels of subgroup'ing
+ */
+#define DECODE_MAX_ARRAY_DEPTH 5
+
 struct gen_field_iterator {
    struct gen_group *group;
    char name[128];
@@ -84,7 +88,8 @@ struct gen_field_iterator {
    int start_bit; /**< current field starts at this bit offset into p */
    int end_bit; /**< current field ends at this bit offset into p */
 
-   int array_iter;
+   int array_iter[DECODE_MAX_ARRAY_DEPTH];
+   int level;
 
    struct gen_field *field;
    bool print_colors;