def __init__( self, cgDoc, implementationsByTemplateName, outputStream=sys.stdout, moduleNodesByName=None, parallelRegionData=None, symbolAnalysisByRoutineNameAndSymbolName=None, symbolsByModuleNameAndSymbolName=None, symbolsByRoutineNameAndSymbolName=None ): super(H90toF90Converter, self).__init__( cgDoc, moduleNodesByName=moduleNodesByName, parallelRegionData=parallelRegionData, implementationsByTemplateName=implementationsByTemplateName ) self.outputStream = outputStream self.currSubroutineImplementationNeedsToBeCommented = False self.currParallelIterators = [] self.currRoutine = None self.currRegion = None self.currParallelRegion = None self.currModule = None self.currCallee = None self.codeSanitizer = FortranCodeSanitizer() self.currParallelRegionRelationNode = None self.currParallelRegionTemplateNode = None self.prepareLineCalledForCurrentLine = False self.preparedBy = None try: if symbolAnalysisByRoutineNameAndSymbolName != None: self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalysisByRoutineNameAndSymbolName else: symbolAnalyzer = SymbolDependencyAnalyzer(self.cgDoc) self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalyzer.getSymbolAnalysisByRoutine() if symbolsByModuleNameAndSymbolName != None: self.symbolsByModuleNameAndSymbolName = symbolsByModuleNameAndSymbolName else: self.symbolsByModuleNameAndSymbolName = getSymbolsByModuleNameAndSymbolName(self.cgDoc, self.moduleNodesByName, self.symbolAnalysisByRoutineNameAndSymbolName) if symbolsByRoutineNameAndSymbolName != None: self.symbolsByRoutineNameAndSymbolName = symbolsByRoutineNameAndSymbolName else: self.symbolsByRoutineNameAndSymbolName = getSymbolsByRoutineNameAndSymbolName( self.cgDoc, self.routineNodesByProcName, self.parallelRegionTemplatesByProcName, self.symbolAnalysisByRoutineNameAndSymbolName ) except UsageError as e: logging.error('Error: %s' %(str(e)), extra={"hfLineNo":currLineNo, "hfFile":currFile}) sys.exit(1) except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] logging.critical('Error when initializing h90 conversion: %s' %(str(e)), extra={"hfLineNo":currLineNo, "hfFile":currFile}) logging.info(traceback.format_exc()) sys.exit(1)
def __init__(self, cgDoc, implementationsByTemplateName, outputStream=sys.stdout, moduleNodesByName=None, parallelRegionData=None, symbolAnalysisByRoutineNameAndSymbolName=None, symbolsByModuleNameAndSymbolName=None, symbolsByRoutineNameAndSymbolName=None): super(H90toF90Converter, self).__init__( cgDoc, moduleNodesByName=moduleNodesByName, parallelRegionData=parallelRegionData, implementationsByTemplateName=implementationsByTemplateName) self.outputStream = outputStream self.currSubroutineImplementationNeedsToBeCommented = False self.currParallelIterators = [] self.currRoutine = None self.currRegion = None self.currParallelRegion = None self.currModule = None self.currCallee = None self.codeSanitizer = FortranCodeSanitizer() self.currParallelRegionRelationNode = None self.currParallelRegionTemplateNode = None self.prepareLineCalledForCurrentLine = False self.preparedBy = None try: if symbolAnalysisByRoutineNameAndSymbolName != None: self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalysisByRoutineNameAndSymbolName else: symbolAnalyzer = SymbolDependencyAnalyzer(self.cgDoc) self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalyzer.getSymbolAnalysisByRoutine( ) if symbolsByModuleNameAndSymbolName != None: self.symbolsByModuleNameAndSymbolName = symbolsByModuleNameAndSymbolName else: self.symbolsByModuleNameAndSymbolName = getSymbolsByModuleNameAndSymbolName( self.cgDoc, self.moduleNodesByName, self.symbolAnalysisByRoutineNameAndSymbolName) if symbolsByRoutineNameAndSymbolName != None: self.symbolsByRoutineNameAndSymbolName = symbolsByRoutineNameAndSymbolName else: self.symbolsByRoutineNameAndSymbolName = getSymbolsByRoutineNameAndSymbolName( self.cgDoc, self.routineNodesByProcName, self.parallelRegionTemplatesByProcName, self.symbolAnalysisByRoutineNameAndSymbolName) except UsageError as e: logging.error('Error: %s' % (str(e)), extra={ "hfLineNo": currLineNo, "hfFile": currFile }) sys.exit(1) except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] logging.critical('Error when initializing h90 conversion: %s' % (str(e)), extra={ "hfLineNo": currLineNo, "hfFile": currFile }) logging.info(traceback.format_exc()) sys.exit(1)
# have been declared in @domainDependant directives. Since these directives come *after* the declaration, # we need this pass # cgDoc = getClonedDocument(cgDoc) for fileNum, fileInDir in enumerate(filesInDir): parser = H90XMLSymbolDeclarationExtractor( cgDoc, implementationsByTemplateName=implementationsByTemplateName) parser.processFile(fileInDir) logging.debug("Symbol declarations extracted for " + fileInDir + "") printProgressIndicator(sys.stderr, fileInDir, fileNum + 1, len(filesInDir), "Symbol parsing, excluding imports") progressIndicatorReset(sys.stderr) # build up symbol table indexed by module name moduleNodesByNameWithoutImplicitImports = getModuleNodesByName(cgDoc) symbolAnalyzer = SymbolDependencyAnalyzer(cgDoc) symbolAnalysisByRoutineNameAndSymbolNameWithoutImplicitImports = symbolAnalyzer.getSymbolAnalysisByRoutine( ) symbolsByModuleNameAndSymbolNameWithoutImplicitImports = getSymbolsByModuleNameAndSymbolName( ImmutableDOMDocument(cgDoc), moduleNodesByNameWithoutImplicitImports, symbolAnalysisByRoutineNameAndSymbolName= symbolAnalysisByRoutineNameAndSymbolNameWithoutImplicitImports) # parse the symbols again, this time know about all informations in the sourced modules in import # -> update the callgraph document with this information. for fileNum, fileInDir in enumerate(filesInDir): parser = H90XMLSymbolDeclarationExtractor( cgDoc, symbolsByModuleNameAndSymbolNameWithoutImplicitImports, implementationsByTemplateName=implementationsByTemplateName) parser.processFile(fileInDir) logging.debug("Symbol imports and declarations extracted for " +
# -> update the callgraph document with this information. # note: We do this, since for simplicity reasons, the declaration parser relies on the symbol names that # have been declared in @domainDependant directives. Since these directives come *after* the declaration, # we need this pass # cgDoc = getClonedDocument(cgDoc) for fileNum, fileInDir in enumerate(filesInDir): parser = H90XMLSymbolDeclarationExtractor(cgDoc, implementationsByTemplateName=implementationsByTemplateName) parser.processFile(fileInDir) logging.debug("Symbol declarations extracted for " + fileInDir + "") printProgressIndicator(sys.stderr, fileInDir, fileNum + 1, len(filesInDir), "Symbol parsing, excluding imports") progressIndicatorReset(sys.stderr) # build up symbol table indexed by module name moduleNodesByNameWithoutImplicitImports = getModuleNodesByName(cgDoc) symbolAnalyzer = SymbolDependencyAnalyzer(cgDoc) symbolAnalysisByRoutineNameAndSymbolNameWithoutImplicitImports = symbolAnalyzer.getSymbolAnalysisByRoutine() symbolsByModuleNameAndSymbolNameWithoutImplicitImports = getSymbolsByModuleNameAndSymbolName( ImmutableDOMDocument(cgDoc), moduleNodesByNameWithoutImplicitImports, symbolAnalysisByRoutineNameAndSymbolName=symbolAnalysisByRoutineNameAndSymbolNameWithoutImplicitImports ) # parse the symbols again, this time know about all informations in the sourced modules in import # -> update the callgraph document with this information. for fileNum, fileInDir in enumerate(filesInDir): parser = H90XMLSymbolDeclarationExtractor( cgDoc, symbolsByModuleNameAndSymbolNameWithoutImplicitImports, implementationsByTemplateName=implementationsByTemplateName ) parser.processFile(fileInDir)
def __init__(self, cgDoc, implementationsByTemplateName, moduleNodesByName=None, parallelRegionData=None, symbolAnalysisByRoutineNameAndSymbolName=None, symbolsByModuleNameAndSymbolName=None, symbolsByRoutineNameAndSymbolName=None, globalParallelDomainNames={}): super(ApplicationModelGenerator, self).__init__( cgDoc, moduleNodesByName=moduleNodesByName, parallelRegionData=parallelRegionData, implementationsByTemplateName=implementationsByTemplateName) self.globalParallelDomainNames = globalParallelDomainNames self.currSubroutineImplementationNeedsToBeCommented = False self.currParallelIterators = [] self.currRoutine = None self.currRegion = None self.currParallelRegion = None self.currModule = None self.currCallee = None self.currParallelRegionRelationNode = None self.currParallelRegionTemplateNode = None self.prepareLineCalledForCurrentLine = False self.preparedBy = None self.modulesInFile = [] self.prefix = "" self.appendixByModuleName = {} self.lastModuleName = None try: if symbolAnalysisByRoutineNameAndSymbolName != None: self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalysisByRoutineNameAndSymbolName else: symbolAnalyzer = SymbolDependencyAnalyzer(self.cgDoc) self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalyzer.getSymbolAnalysisByRoutine( ) if symbolsByModuleNameAndSymbolName != None: self.symbolsByModuleNameAndSymbolName = symbolsByModuleNameAndSymbolName else: self.symbolsByModuleNameAndSymbolName = getSymbolsByModuleNameAndSymbolName( self.cgDoc, self.moduleNodesByName, self.symbolAnalysisByRoutineNameAndSymbolName) addGlobalParallelDomainNames( sum([ index.values() for index in self.symbolsByModuleNameAndSymbolName.values() ], []), globalParallelDomainNames) if symbolsByRoutineNameAndSymbolName != None: self.symbolsByRoutineNameAndSymbolName = symbolsByRoutineNameAndSymbolName else: self.symbolsByRoutineNameAndSymbolName = getSymbolsByRoutineNameAndSymbolName( self.cgDoc, self.routineNodesByProcName, self.parallelRegionTemplatesByProcName, self.symbolAnalysisByRoutineNameAndSymbolName) addGlobalParallelDomainNames( sum([ index.values() for index in self.symbolsByRoutineNameAndSymbolName.values() ], []), globalParallelDomainNames) except UsageError as e: logging.error('%s' % (str(e)), extra={ "hfLineNo": currLineNo, "hfFile": currFile }) sys.exit(1) except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] logging.critical('Error when initializing h90 conversion: %s' % (str(e)), extra={ "hfLineNo": currLineNo, "hfFile": currFile }) logging.info(traceback.format_exc()) sys.exit(1)
doc = parseString(data) analyzer = SymbolDependencyAnalyzer(doc) if options.debug: print "=== calls by calleename ===" prettyprint(analyzer.callsByCalleeName) print "=== calls by callsByCallerName ===" prettyprint(analyzer.callsByCallerName) print "=== callGraphEdgesByCallerName ===" prettyprint(analyzer.callGraphEdgesByCallerName) print "=== routines by name ===" prettyprint(analyzer.routinesByName) analysis = None if options.symbolGraphRootRoutine: analysis = analyzer.getSymbolAnalysisByRoutine( options.symbolGraphRootRoutine) elif options.allSymbols: analysis = analyzer.getSymbolAnalysisByRoutine() if options.debug and analysis != None: print "=== analysis ===" prettyprint(analysis) graph = pydot.Dot(graph_type='digraph', rankdir='LR', fontsize=defaultFontSize, compound=True) # graph = pydot.Dot(graph_type='digraph', fontsize="27") #more useful for academic papers when there is a low number of nodes ### Callgraph Generation ### # callgraph = pydot.Cluster(graph_name = 'Callgraph', label = 'Callgraph', fontname=font, penwidth=firstLevelClusterPenwidth) # graph.add_subgraph(callgraph)
doc = parseString(data) analyzer = SymbolDependencyAnalyzer(doc) if options.debug: print "=== calls by calleename ===" prettyprint(analyzer.callsByCalleeName) print "=== calls by callsByCallerName ===" prettyprint(analyzer.callsByCallerName) print "=== callGraphEdgesByCallerName ===" prettyprint(analyzer.callGraphEdgesByCallerName) print "=== routines by name ===" prettyprint(analyzer.routinesByName) analysis = None if options.symbolGraphRootRoutine: analysis = analyzer.getSymbolAnalysisByRoutine(options.symbolGraphRootRoutine) elif options.allSymbols: analysis = analyzer.getSymbolAnalysisByRoutine() if options.debug and analysis != None: print "=== analysis ===" prettyprint(analysis) graph = pydot.Dot(graph_type="digraph", rankdir="LR", fontsize=defaultFontSize, compound=True) # graph = pydot.Dot(graph_type='digraph', fontsize="27") #more useful for academic papers when there is a low number of nodes ### Callgraph Generation ### # callgraph = pydot.Cluster(graph_name = 'Callgraph', label = 'Callgraph', fontname=font, penwidth=firstLevelClusterPenwidth) # graph.add_subgraph(callgraph) routineByName = {} routinesBySourceDict = {} sourceNameByRoutineNames = {}
def __init__( self, cgDoc, implementationsByTemplateName, moduleNodesByName=None, parallelRegionData=None, symbolAnalysisByRoutineNameAndSymbolName=None, symbolsByModuleNameAndSymbolName=None, symbolsByRoutineNameAndSymbolName=None, globalParallelDomainNames={} ): super(ApplicationModelGenerator, self).__init__( cgDoc, moduleNodesByName=moduleNodesByName, parallelRegionData=parallelRegionData, implementationsByTemplateName=implementationsByTemplateName ) self.globalParallelDomainNames = globalParallelDomainNames self.currSubroutineImplementationNeedsToBeCommented = False self.currParallelIterators = [] self.currRoutine = None self.currRegion = None self.currParallelRegion = None self.currModule = None self.currCallee = None self.currParallelRegionRelationNode = None self.currParallelRegionTemplateNode = None self.prepareLineCalledForCurrentLine = False self.preparedBy = None self.modulesInFile = [] self.prefix = "" self.appendixByModuleName = {} self.lastModuleName = None try: if symbolAnalysisByRoutineNameAndSymbolName != None: self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalysisByRoutineNameAndSymbolName else: symbolAnalyzer = SymbolDependencyAnalyzer(self.cgDoc) self.symbolAnalysisByRoutineNameAndSymbolName = symbolAnalyzer.getSymbolAnalysisByRoutine() if symbolsByModuleNameAndSymbolName != None: self.symbolsByModuleNameAndSymbolName = symbolsByModuleNameAndSymbolName else: self.symbolsByModuleNameAndSymbolName = getSymbolsByModuleNameAndSymbolName(self.cgDoc, self.moduleNodesByName, self.symbolAnalysisByRoutineNameAndSymbolName) addGlobalParallelDomainNames( sum([index.values() for index in self.symbolsByModuleNameAndSymbolName.values()], []), globalParallelDomainNames ) if symbolsByRoutineNameAndSymbolName != None: self.symbolsByRoutineNameAndSymbolName = symbolsByRoutineNameAndSymbolName else: self.symbolsByRoutineNameAndSymbolName = getSymbolsByRoutineNameAndSymbolName( self.cgDoc, self.routineNodesByProcName, self.parallelRegionTemplatesByProcName, self.symbolAnalysisByRoutineNameAndSymbolName ) addGlobalParallelDomainNames( sum([index.values() for index in self.symbolsByRoutineNameAndSymbolName.values()], []), globalParallelDomainNames ) except UsageError as e: logging.error('%s' %(str(e)), extra={"hfLineNo":currLineNo, "hfFile":currFile}) sys.exit(1) except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] logging.critical('Error when initializing h90 conversion: %s' %(str(e)), extra={"hfLineNo":currLineNo, "hfFile":currFile}) logging.info(traceback.format_exc()) sys.exit(1)