genxml: mark gen_pack_header.py as encoded in utf-8
[mesa.git] / src / intel / genxml / gen_pack_header.py
old mode 100755 (executable)
new mode 100644 (file)
index 3cabb58..2920ec9
@@ -1,4 +1,5 @@
 #!/usr/bin/env python3
+#encoding=utf-8
 
 import xml.parsers.expat
 import re
@@ -6,7 +7,7 @@ import sys
 import copy
 
 license =  """/*
- * Copyright © 2016 Intel Corporation
+ * Copyright (C) 2016 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -39,7 +40,10 @@ pack_header = """%(license)s
 #pragma once
 
 #include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
 #include <assert.h>
+#include <math.h>
 
 #ifndef __gen_validate_value
 #define __gen_validate_value(x)
@@ -62,11 +66,10 @@ __gen_mbo(uint32_t start, uint32_t end)
 static inline uint64_t
 __gen_uint(uint64_t v, uint32_t start, uint32_t end)
 {
-   const int width = end - start + 1;
-
    __gen_validate_value(v);
 
 #if DEBUG
+   const int width = end - start + 1;
    if (width < 64) {
       const uint64_t max = (1ull << width) - 1;
       assert(v <= max);
@@ -129,7 +132,7 @@ __gen_sfixed(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
    assert(min <= v && v <= max);
 #endif
 
-   const int32_t int_val = roundf(v * factor);
+   const int64_t int_val = llroundf(v * factor);
    const uint64_t mask = ~0ull >> (64 - (end - start + 1));
 
    return (int_val & mask) << start;
@@ -148,7 +151,7 @@ __gen_ufixed(float v, uint32_t start, uint32_t end, uint32_t fract_bits)
    assert(min <= v && v <= max);
 #endif
 
-   const uint32_t uint_val = roundf(v * factor);
+   const uint64_t uint_val = llroundf(v * factor);
 
    return uint_val << start;
 }
@@ -200,6 +203,13 @@ def safe_name(name):
 
     return name
 
+def num_from_str(num_str):
+    if num_str.lower().startswith('0x'):
+        return int(num_str, base=16)
+    else:
+        assert(not num_str.startswith('0') and 'octals numbers not allowed')
+        return int(num_str)
+
 class Field:
     ufixed_pattern = re.compile("u(\d+)\.(\d+)")
     sfixed_pattern = re.compile("s(\d+)\.(\d+)")
@@ -470,25 +480,24 @@ class Parser:
 
         self.instruction = None
         self.structs = {}
+        self.registers = {}
 
     def start_element(self, name, attrs):
         if name == "genxml":
             self.platform = attrs["name"]
             self.gen = attrs["gen"].replace('.', '')
             print(pack_header % {'license': license, 'platform': self.platform})
-        elif name == "instruction":
-            self.instruction = safe_name(attrs["name"])
-            self.length_bias = int(attrs["bias"])
-            if "length" in attrs:
-                self.length = int(attrs["length"])
-                size = self.length * 32
-            else:
-                self.length = None
-                size = 0
-            self.group = Group(self, None, 0, 1, size)
-        elif name == "struct":
-            self.struct = safe_name(attrs["name"])
-            self.structs[attrs["name"]] = 1
+        elif name in ("instruction", "struct", "register"):
+            if name == "instruction":
+                self.instruction = safe_name(attrs["name"])
+                self.length_bias = int(attrs["bias"])
+            elif name == "struct":
+                self.struct = safe_name(attrs["name"])
+                self.structs[attrs["name"]] = 1
+            elif name == "register":
+                self.register = safe_name(attrs["name"])
+                self.reg_num = num_from_str(attrs["num"])
+                self.registers[attrs["name"]] = 1
             if "length" in attrs:
                 self.length = int(attrs["length"])
                 size = self.length * 32
@@ -520,10 +529,15 @@ class Parser:
             self.emit_instruction()
             self.instruction = None
             self.group = None
-        elif name  == "struct":
+        elif name == "struct":
             self.emit_struct()
             self.struct = None
             self.group = None
+        elif name == "register":
+            self.emit_register()
+            self.register = None
+            self.reg_num = None
+            self.group = None
         elif name == "group":
             self.group = self.group.parent
         elif name  == "field":
@@ -558,9 +572,9 @@ class Parser:
     def emit_instruction(self):
         name = self.instruction
         if not self.length == None:
-            print('#define %-33s %4d' %
+            print('#define %-33s %6d' %
                   (self.gen_prefix(name + "_length"), self.length))
-        print('#define %-33s %4d' %
+        print('#define %-33s %6d' %
               (self.gen_prefix(name + "_length_bias"), self.length_bias))
 
         default_fields = []
@@ -569,7 +583,7 @@ class Parser:
                 continue
             if field.default == None:
                 continue
-            default_fields.append("   .%-35s = %4d" % (field.name, field.default))
+            default_fields.append("   .%-35s = %6d" % (field.name, field.default))
 
         if default_fields:
             print('#define %-40s\\' % (self.gen_prefix(name + '_header')))
@@ -580,10 +594,23 @@ class Parser:
 
         self.emit_pack_function(self.instruction, self.group)
 
+    def emit_register(self):
+        name = self.register
+        if not self.reg_num == None:
+            print('#define %-33s 0x%04x' %
+                  (self.gen_prefix(name + "_num"), self.reg_num))
+
+        if not self.length == None:
+            print('#define %-33s %6d' %
+                  (self.gen_prefix(name + "_length"), self.length))
+
+        self.emit_template_struct(self.register, self.group)
+        self.emit_pack_function(self.register, self.group)
+
     def emit_struct(self):
         name = self.struct
         if not self.length == None:
-            print('#define %-33s %4d' %
+            print('#define %-33s %6d' %
                   (self.gen_prefix(name + "_length"), self.length))
 
         self.emit_template_struct(self.struct, self.group)
@@ -596,7 +623,7 @@ class Parser:
                 name = self.prefix + "_" + value.name
             else:
                 name = value.name
-            print('#define %-36s %4d' % (name.upper(), value.value))
+            print('#define %-36s %6d' % (name.upper(), value.value))
         print('')
 
     def parse(self, filename):