utils: segmaker: Use bits_per_word instead of hardcoding

Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/fuzzers/010-cle-lutinit/generate.py b/fuzzers/010-cle-lutinit/generate.py
index 690a32c..5ddc356 100644
--- a/fuzzers/010-cle-lutinit/generate.py
+++ b/fuzzers/010-cle-lutinit/generate.py
@@ -4,7 +4,7 @@
 
 from utils.segmaker import Segmaker
 
-segmk = Segmaker("design_%s.bits" % sys.argv[1])
+segmk = Segmaker("design_%s.bits" % sys.argv[1], bits_per_word=16)
 
 print("Loading tags from design_%s.txt." % sys.argv[1])
 with open("design_%s.txt" % sys.argv[1], "r") as f:
diff --git a/utils/segmaker.py b/utils/segmaker.py
index f0cd0d7..67f4267 100644
--- a/utils/segmaker.py
+++ b/utils/segmaker.py
@@ -72,7 +72,7 @@
 
 
 class Segmaker:
-    def __init__(self, bitsfile, verbose=None, db_root=None, part=None):
+    def __init__(self, bitsfile, verbose=False, db_root=None, part=None, bits_per_word=32):
         self.db_root = db_root
         if self.db_root is None:
             self.db_root = util.get_db_root()
@@ -84,6 +84,7 @@
 
         self.verbose = verbose if verbose is not None else os.getenv(
             'VERBOSE', 'N') == 'Y'
+        self.bits_per_word = bits_per_word
         self.load_grid()
         self.load_bits(bitsfile)
         '''
@@ -146,10 +147,13 @@
                 # ex: bit_00020500_000_17
                 line = line.split("_")
                 bit_frame = int(line[1], 16)
-                bit_wordidx = int(line[2], 10) * 2 + int(line[3], 10) // 16
-                bit_bitidx = int(line[3], 10) % 16
-                base_frame = bit_frame & ~0x7f
-
+                # Word indexes in the .bits file for US+/US assume 32-bits per word
+                bit_wordidx = int(line[2], 10) * (32 / self.bits_per_word) + int(line[3], 10) // self.bits_per_word
+                bit_bitidx = int(line[3], 10) % self.bits_per_word
+                # Bit ranges in the Frame Address Register Description differs between US+ and US devices
+                # For US the ranges are identical to 7-series, but US+ is shifted 1 bit left
+                # Refer to UG570 Table 9-21
+                base_frame = bit_frame & (~0xff if os.getenv("URAY_ARCH") in "UltraScalePlus" else ~0x7f)
                 self.bits.setdefault(base_frame, dict()).setdefault(
                     bit_wordidx, set()).add(
                         (bit_frame, bit_wordidx, bit_bitidx))
@@ -229,7 +233,7 @@
                 for bit_frame, bit_wordidx, bit_bitidx in self.bits[
                         base_frame][wordidx]:
                     bitname_frame = bit_frame - base_frame
-                    bitname_bit = 16 * (
+                    bitname_bit = self.bits_per_word * (
                         bit_wordidx - bitj["offset"]) + bit_bitidx
 
                     # Skip bits above the frame limit.