class Collection: def __init__(self): self.vhdl_obj_list = [] self.vhdl_source_file_list = [] self.library = None self.finder = Finder() def set_library(self, library): """ Set the compile library. """ self.library = library def get_library(self): return self.library def add_file(self, vhdl_file): """ Adds a single file to builder. """ self.finder.add_file(vhdl_file) if not vhdl_file in self.vhdl_source_file_list: self.vhdl_source_file_list.append(vhdl_file) def add_files(self, vhdl_files): """ Adds a list of files to builder. """ self.finder.add_files(vhdl_files) for vhdl_file in self.finder.get_files(): self.add_file(vhdl_file) def _remove_leftovers(self, sorted_list): return sorted_list def _swap(self, list, i, j): list[i], list[j] = list[j], list[i] return list def _sort_compile_order(self, vhdl_file_list): sorted_list = vhdl_file_list.copy() # Slow sorting method, need N-1 loops for sort_loop in range(1, len(sorted_list) - 1): # Pick item to check in dependency lists for sort_item in vhdl_file_list: sort_name = sort_item.get_name() # Pick item which dependency list should be checked for check_item in sorted_list: lib_dep, use_dep, context_dep = check_item.get_dependencies( ) # Is sort_item in check_item's dependency list? if sort_name in use_dep: # Should items be swapped based on index in sorted_list? sort_idx = sorted_list.index(sort_item) check_idx = sorted_list.index(check_item) if check_idx < sort_idx: sorted_list = self._swap(sorted_list, sort_idx, check_idx) self.vhdl_obj_list = self._remove_leftovers(sorted_list) def organize_collection(self): tokens = [] for file_item in self.vhdl_source_file_list: vhdl_object = VHD(file_item) with open(file_item, 'r') as file: content = file.read() # Lexer lex = Lexer(content) tokens = lex.tokenize() # Parser parser = Parser(tokens) # Get the vhdl objects dependencies dep_list = parser.get_dependency() # Get the type of vhdl object vhdl_type = parser.get_type() # vhdl object # Set the name of vhdl object vhdl_object.set_name(vhdl_type) # Set the type of vhdl object vhdl_object.set_type(vhdl_type) # Set the vhdl object dependencies vhdl_object.add_dependency(dep_list) # Add vhdl object to list self.vhdl_obj_list.append(vhdl_object) vhdl_object.get_generics(tokens) self._sort_compile_order(self.vhdl_obj_list) def get_local_dep_list(self): return self.vhdl_obj_list def list_compile_order(self): print( "\n================================ %s ================================" % (self.get_library())) for idx, item in enumerate(self.vhdl_obj_list): print("[%i] File: %s (%s: %s)" % (idx + 1, item.get_filename(), item.get_type(), item.get_name())) def get_compile_order(self): return self.vhdl_obj_list def get_external_dependency(self): ret_list = [] for obj in self.vhdl_obj_list: libs = obj.get_lib_dep() for lib in libs: if not lib in ret_list: ret_list.append(lib) return ret_list