add fu logical_input_record.py
[soc.git] / src / soc / decoder / helpers.py
index 0efdc439600fab381eb1c3902dfca2d54a4cb251..e8fd6cb7e1a5c7ca2c535a6213e2a791684577ee 100644 (file)
@@ -40,7 +40,9 @@ def ROTL64(value, bits):
 
 
 def ROTL32(value, bits):
-    return rotl(value, bits, 32)
+    if isinstance(value, SelectableInt):
+        value = SelectableInt(value.value, 64)
+    return rotl(value | (value << 32), bits, 64)
 
 
 def MASK(x, y):
@@ -53,6 +55,8 @@ def MASK(x, y):
         y = 63-y
         mask_a = ((1 << x) - 1) & ((1 << 64) - 1)
         mask_b = ((1 << y) - 1) & ((1 << 64) - 1)
+    elif x == y:
+        return 1 << (63-x)
     else:
         x = 64-x
         y = 63-y
@@ -109,6 +113,10 @@ class HelperTests(unittest.TestCase):
         # slw 1, 1, 2
         self.assertHex(MASK(32, 63-5), 0xffffffe0)
 
+        self.assertHex(MASK(32, 33), 0xc0000000)
+        self.assertHex(MASK(32, 32), 0x80000000)
+        self.assertHex(MASK(33, 33), 0x40000000)
+
     def test_ROTL64(self):
         # r1 = 0xdeadbeef12345678
         value = 0xdeadbeef12345678