Merge pull request #1609 from antmicro/fix-iob-only-diff

030-iob: fix un-even features in different sites
diff --git a/fuzzers/030-iob/process_rdb.py b/fuzzers/030-iob/process_rdb.py
index d6b9c12..c1c2887 100644
--- a/fuzzers/030-iob/process_rdb.py
+++ b/fuzzers/030-iob/process_rdb.py
@@ -196,19 +196,43 @@
                 if enum is not None:
                     common_groups[site][(bits, group)]['enums'].add(enum)
 
+    visited_iostandards = list()
     for site, groups in common_groups.items():
         for (bits, group), v in groups.items():
-            if v['enums']:
+            iostandards = v['IOSTANDARDS']
+            enums = v['enums']
+
+            # It happens that some features appear only in one of the IOB sites and not
+            # in the other. This makes it hard to assign the correct features to the correct
+            # site in the P&R toolchain.
+            #
+            # The following code makes sure that the same set of iostandards
+            # (even if not really present at a site location) appears for each site
+            for visited_iostandard, visited_group, visited_enums in visited_iostandards:
+                same_enum = enums == visited_enums
+                same_group = group == visited_group
+                compatible_iostd = any(
+                    x in iostandards for x in visited_iostandard)
+                take_visited_iostd = len(visited_iostandard) > len(iostandards)
+                if same_enum and same_group and compatible_iostd and take_visited_iostd:
+                    iostandards = visited_iostandard
+                    break
+
+            visited_iostandards.append((iostandards, group, enums))
+
+            iostandards_string = '_'.join(sorted(iostandards))
+
+            if enums:
                 feature = 'IOB33.{site}.{iostandards}.{group}.{enums}'.format(
                     site=site,
-                    iostandards='_'.join(sorted(v['IOSTANDARDS'])),
+                    iostandards=iostandards_string,
                     group=group,
-                    enums='_'.join(sorted(v['enums'])),
+                    enums='_'.join(sorted(enums)),
                 )
             else:
                 feature = 'IOB33.{site}.{iostandards}.{group}'.format(
                     site=site,
-                    iostandards='_'.join(sorted(v['IOSTANDARDS'])),
+                    iostandards=iostandards_string,
                     group=group,
                 )