From 7b6a87e2389d2e24770a297b219562b89eaa33a0 Mon Sep 17 00:00:00 2001
From: Erik Kooistra <kooistra@astron.nl>
Date: Tue, 19 Apr 2016 06:02:31 +0000
Subject: [PATCH] Added fileSections argument to specifiy target specific
 section headers in the config dictionary file. Support multiple
 technologyNames. Issue warning instead of error when duplicate HDL library
 config files is found and removed from the dictionary list.

---
 tools/oneclick/base/hdl_config.py | 58 ++++++++++++++++++++-----------
 1 file changed, 37 insertions(+), 21 deletions(-)

diff --git a/tools/oneclick/base/hdl_config.py b/tools/oneclick/base/hdl_config.py
index d73dd06920..c4536ea986 100644
--- a/tools/oneclick/base/hdl_config.py
+++ b/tools/oneclick/base/hdl_config.py
@@ -58,7 +58,7 @@ import argparse
 
 class HdlConfig:
 
-    def __init__(self, toolRootDir, libFileName='hdllib.cfg', toolFileName='hdltool_<toolset>.cfg'):
+    def __init__(self, toolRootDir, libFileName='hdllib.cfg', libFileSections=None, toolFileName='hdltool_<toolset>.cfg'):
         """Get tool dictionary info from toolRootDir and all HDL library dictionary info for it
         
            - self.tool.dicts = single dictionary that contains the tool info (only one tool dict in dicts list)
@@ -76,27 +76,24 @@ class HdlConfig:
         self.toolRootDir = toolRootDir
         
         # HDL tool config file
-        self.tool = common_dict_file.CommonDictFile(toolRootDir, toolFileName)      # tool dict file
+        self.tool = common_dict_file.CommonDictFile(toolRootDir, toolFileName)      # tool dict filedupkc
         if self.tool.nof_dicts==0: sys.exit('Error : No HDL tool config file found')
         if self.tool.nof_dicts >1: sys.exit('Error : Multiple HDL tool config files found')
         self.tool_dict = self.tool.dicts[0]    # there is only one tool dict in dicts list so for convenience make it also accessible as self.tool_dict
           
         # HDL library config files
         self.libRootDir = os.path.expandvars(self.tool_dict['lib_root_dir'])
-        self.libs = common_dict_file.CommonDictFile(self.libRootDir, libFileName)   # library dict files
+        self.libs = common_dict_file.CommonDictFile(self.libRootDir, libFileName, libFileSections)   # library dict files
         if self.libs.nof_dicts==0: sys.exit('Error : No HDL library config file found')
         
         # Keep the generic HDL libraries and remove those that do not match the specified IP technologies
-        self.technologyNames = os.path.expandvars(self.tool_dict['technology_names'])
+        self.technologyNames = self.tool_dict['technology_names'].split()
         self.removed_dicts = []
         print 'self.technologyNames=',self.technologyNames
         if len(self.technologyNames)>0:
             for d in self.libs.dicts:
-                #if not(d['hdl_lib_technology']=='' or d['hdl_lib_technology'] in self.technologyNames):
-                #print 'd[hdl_lib_technology]=',d['hdl_lib_technology']
-                if not(d['hdl_lib_technology']=='' or d['hdl_lib_technology'] == self.technologyNames):
+                if not(d['hdl_lib_technology']=='' or d['hdl_lib_technology'] in self.technologyNames):
                     self.removed_dicts.append(d)
-                    #print 'remove=',d
             for d in self.removed_dicts:
                 self.libs.remove_dict_from_list(d)
                 
@@ -105,7 +102,15 @@ class HdlConfig:
         
         # Check that there are no duplicate library names (eg. due to copying a hdlib.cfg without modifying the hdl_lib_name value)
         duplicate_lib_names = cm.list_duplicates(self.lib_names)
-        if len(duplicate_lib_names)>0: sys.exit('Error : Duplicate HDL library config file found %s' % duplicate_lib_names)
+        if len(duplicate_lib_names)>0:
+            for dup_name in duplicate_lib_names:
+                dup_dicts = self.libs.get_dicts('hdl_lib_name', values=dup_name)
+                for d in dup_dicts:
+                    self.libs.remove_dict_from_list(d)
+            print 'Warning : Duplicate HDL library config files found and removed from list %s' % duplicate_lib_names
+            # Update list of HDL library names
+            self.lib_names = self.libs.get_key_values('hdl_lib_name')
+            
 
     def get_used_libs(self, build_type, lib_dict, arg_exclude_libs=[]):
         """Get the list of used HDL libraries from the lib_dict and remove the excluded libs.
@@ -152,7 +157,6 @@ class HdlConfig:
             # use recursion to include all used libs
             use_libs, exclude_libs = self.get_used_libs(build_type, lib_dict, exclude_libs)
             try:
-                use_libs
                 for use_lib in use_libs:
                     if use_lib in self.lib_names:
                         all_use_libs.append(use_lib)
@@ -337,7 +341,7 @@ if __name__ == '__main__':
         # Parse command line arguments
         toolsetSelect = ['unb1', 'unb2', 'unb2a']
 
-        argparser = argparse.ArgumentParser(description='Create Modelsim mpf files for all hdllib.cfg')
+        argparser = argparse.ArgumentParser(description='Derive HDL library dictionary from hdllib.cfg')
         argparser.add_argument('-t','--toolset', help='choose toolset %s (default: %s)' % (toolsetSelect,toolsetSelect[0]), default=toolsetSelect[0], required=False)
         argparser.add_argument('-v','--verbosity', help='verbosity >= 0 for more info', type=int, default=0, required=False)
         args = vars(argparser.parse_args())
@@ -364,22 +368,30 @@ if __name__ == '__main__':
             print ''
     
         print ''
-        print 'tool = ', hdl.tool.filePathNames[0]
+        print 'Toolset file = ', hdl.tool.filePathNames[0]
         
         print ''
-        print 'lib paths'
+        print 'Library paths :'
         for p in hdl.libs.filePaths:
             print '    ', p
             
         print ''
-        print 'lib paths names'
+        print 'Library paths names :"'
         for p in hdl.libs.filePathNames:
             print '    ', p
             
         print ''
-        print 'lib_names        = ', hdl.lib_names
-        print 'derive_lib_order for sim : ', hdl.derive_lib_order('sim')
-        print 'derive_lib_order for synth : ', hdl.derive_lib_order('synth')
+        print 'Library section headers :'
+        for lib_name in hdl.lib_names:
+            lib_dict = hdl.libs.dicts[hdl.lib_names.index(lib_name)]
+            print '    %-52s :' % lib_name, lib_dict['section_headers']
+                
+        print ''
+        print 'Library names = \n', hdl.lib_names
+        print ''
+        print 'derive_lib_order for sim :\n', hdl.derive_lib_order('sim')
+        print ''
+        print 'derive_lib_order for synth :\n', hdl.derive_lib_order('synth')
         
         print ''
         print 'get_lib_build_dirs for simulation:'
@@ -393,15 +405,19 @@ if __name__ == '__main__':
             #use_libs = hdl.derive_all_use_libs('sim', 'tech_xaui')
             use_libs = hdl.derive_all_use_libs('sim', 'unb1_test_10GbE')
             use_libs = hdl.derive_all_use_libs('sim', 'tech_ddr')
-            print 'derive_all_use_libs = ', use_libs
+            print ''
+            print 'derive_all_use_libs = \n', use_libs
             lib_order = hdl.derive_lib_order('sim', use_libs)
-            print 'derive_lib_order = ', lib_order
+            print ''
+            print 'derive_lib_order = \n', lib_order
         if hdl.libRootDir=='UNB':
             use_libs = hdl.derive_all_use_libs('sim', 'unb_minimal')
             use_libs = hdl.derive_all_use_libs('sim', 'dp')
-            print 'derive_all_use_libs = ', use_libs
+            print ''
+            print 'derive_all_use_libs = \n', use_libs
             lib_order = hdl.derive_lib_order('sim', use_libs)
-            print 'derive_lib_order = ', lib_order
+            print ''
+            print 'derive_lib_order = \n', lib_order
     
     if mode==1:
         key = 'build_dir'
-- 
GitLab