def getAdditionalImportsAndDeclarationsForParentScope(parentNode, argumentSymbolNames): additionalImports = [] additionalDeclarations = [] additionalDummies = [] dependantTemplatesAndEntries = getDomainDependantTemplatesAndEntries(cgDoc, parentNode) for template, entry in dependantTemplatesAndEntries: dependantName = entry.firstChild.nodeValue if dependantName in argumentSymbolNames: continue #in case user is working with slices and passing them to different symbols inside the kernel, he has to manage that stuff manually symbol = currSymbolsByName.get(dependantName) if symbol == None: logging.debug("while analyzing additional kernel parameters: symbol %s was not available yet for parent %s, so it was loaded freshly" %( dependantName, parentNode.getAttribute('name') )) symbol = Symbol( dependantName, template, symbolEntry=entry, scopeNode=parentNode, analysis=getAnalysisForSymbol(symbolAnalysisByRoutineNameAndSymbolName, parentNode.getAttribute('name'), dependantName), parallelRegionTemplates=parallelRegionTemplates ) symbol.loadRoutineNodeAttributes(parentNode, parallelRegionTemplates) if symbol.isDummySymbolForRoutine(routineName=parentNode.getAttribute('name')): continue #already passed manually if symbol.declarationType == DeclarationType.LOCAL_MODULE_SCALAR \ and routineNode.getAttribute('module') == moduleNode.getAttribute('name'): additionalDeclarations.append(symbol) elif (symbol.analysis and symbol.analysis.isModuleSymbol) or symbol.declarationType == DeclarationType.FOREIGN_MODULE_SCALAR: additionalImports.append(symbol) elif symbol.declarationType == DeclarationType.LOCAL_ARRAY: additionalDummies.append(symbol) return additionalImports, additionalDeclarations, additionalDummies
def getAdditionalImportsAndDeclarationsForParentScope(parentNode, argumentSymbolNames): additionalImports = [] additionalDeclarations = [] additionalDummies = [] dependantTemplatesAndEntries = getDomainDependantTemplatesAndEntries(parentNode.ownerDocument, parentNode) for template, entry in dependantTemplatesAndEntries: dependantName = entry.firstChild.nodeValue if dependantName in argumentSymbolNames: continue #in case user is working with slices and passing them to different symbols inside the kernel, he has to manage that stuff manually symbol = currRoutine.symbolsByName.get(uniqueIdentifier(dependantName, currRoutine.name)) if not symbol: symbol = currRoutine.symbolsByName.get(uniqueIdentifier(dependantName, currRoutine._parentModule().name)) if not symbol: symbol = currRoutine.symbolsByName.get(dependantName) if not symbol: logging.debug("while analyzing additional kernel parameters: symbol %s was not available yet for parent %s, so it was loaded freshly;\nCurrent symbols:%s\n" %( dependantName, parentNode.getAttribute('name'), currRoutine.symbolsByName.keys() )) symbol = Symbol( dependantName, template, symbolEntry=entry, scopeNode=parentNode, analysis=getAnalysisForSymbol(symbolAnalysisByRoutineNameAndSymbolName, parentNode.getAttribute('name'), dependantName), parallelRegionTemplates=callee.parallelRegionTemplates ) symbol.loadRoutineNodeAttributes(parentNode, callee.parallelRegionTemplates) updateTypeParameterProperties(symbol, currRoutine.symbolsByName.values()) if symbol.isTypeParameter: continue if symbol.isDummySymbolForRoutine(routineName=parentNode.getAttribute('name')): continue #already passed manually isModuleSymbol = symbol.declarationType in [ DeclarationType.LOCAL_MODULE_SCALAR, DeclarationType.MODULE_ARRAY, DeclarationType.MODULE_ARRAY_PASSED_IN_AS_ARGUMENT ] if isModuleSymbol and currRoutine.node.getAttribute('module') == symbol.sourceModule: logging.debug("decl added for %s" %(symbol)) additionalDeclarations.append(symbol) elif (symbol.analysis and symbol.analysis.isModuleSymbol) \ or (isModuleSymbol and currRoutine.node.getAttribute('module') != symbol.sourceModule) \ or symbol.declarationType == DeclarationType.FOREIGN_MODULE_SCALAR: if symbol.sourceModule != callee.parentModule.node.getAttribute('name'): foreignModuleNode = moduleNodesByName[symbol.sourceModule] symbol.loadImportInformation(parentNode.ownerDocument, foreignModuleNode) logging.debug("import added for %s" %(symbol)) additionalImports.append(symbol) elif symbol.declarationType in [ DeclarationType.LOCAL_ARRAY, DeclarationType.LOCAL_SCALAR, DeclarationType.OTHER_SCALAR ]: logging.debug("dummy added for %s" %(symbol)) additionalDummies.append(symbol) return additionalImports, additionalDeclarations, additionalDummies