Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
provided and the name of the kernel in the parse tree are case \
insensitive in this function.
:param ast: parse tree of the kernel module code
:type ast: :py:class:`fparser.one.block_statements.BeginSource`
:returns: Parse tree of the metadata (a Fortran type with name \
'name')
:rtype: :py:class:`fparser.one.block_statements.Type`
:raises ParseError: if the metadata type name is not found in \
the kernel code parse tree
'''
ktype = None
for statement, _ in fpapi.walk(ast, -1):
if isinstance(statement, fparser1.block_statements.Type) \
and statement.name.lower() == name.lower():
ktype = statement
break
if ktype is None:
raise ParseError("Kernel type {0} does not exist".format(name))
return ktype
def __init__(self, ast, name=None):
if name is None:
# if no name is supplied then use the module name to
# determine the type name. The assumed convention is that
# the module is called _mod and the type is called
# _type
found = False
for statement, _ in fpapi.walk(ast, -1):
if isinstance(statement, fparser1.block_statements.Module):
module_name = statement.name
found = True
break
if not found:
raise ParseError(
"Error KernelType, the file does not contain a module. "
"Is it a Kernel file?")
mn_len = len(module_name)
if mn_len < 5:
raise ParseError(
"Error, module name '{0}' is too short to have '_mod' as "
"an extension. This convention is assumed.".
format(module_name))
base_name = module_name.lower()[:mn_len-4]
extension_name = module_name.lower()[mn_len-4:mn_len]
def __init__(self, parent, clause):
'''
:param parent: Node to which to add this IfThen as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param str clause: the condition, xx, to evaluate in the if(xx)then
'''
reader = FortranStringReader("if (dummy) then\nend if")
reader.set_format(FortranFormat(True, True)) # free form, strict
ifthenline = reader.next()
endifline = reader.next()
my_if = fparser1.block_statements.IfThen(parent.root, ifthenline)
my_if.expr = clause
my_endif = fparser1.block_statements.EndIfThen(my_if, endifline)
my_if.content.append(my_endif)
BaseGen.__init__(self, parent, my_if)
"(you are running {0}. Try installing with 'sudo "
"pip install ordereddict'".format(python_version))
else:
from psyclone.parse import ParseError
raise ParseError(
"OrderedDict not found which is unexpected as it is "
"meant to be part of the Python library from 2.7 onwards")
invokecalls = OrderedDict()
# Keep a list of the named invokes so that we can check that the same
# name isn't used more than once
unique_invoke_labels = []
container_name = None
for child in ast.content:
if isinstance(child, fparser1.block_statements.Program) or \
isinstance(child, fparser1.block_statements.Module) or \
isinstance(child, fparser1.block_statements.Subroutine):
container_name = child.name
break
if container_name is None:
from psyclone.parse import ParseError
raise ParseError(
"Error, program, module or subroutine not found in ast")
for statement, depth in fpapi.walk(ast, -1):
if isinstance(statement, fparser1.statements.Use):
for name in statement.items:
name_to_module[name] = statement.name
if isinstance(statement, fparser1.statements.Call) \
and statement.designator == invoke_name:
statement_kcalls = []
invoke_label = None
for arg in statement.items:
:param parent: the node to which to add this do loop as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param str variable_name: the name of the loop variable
:param str start: start value for Do loop
:param str end: upper-limit of Do loop
:param str step: increment to use in Do loop
'''
reader = FortranStringReader("do i=1,n\nend do")
reader.set_format(FortranFormat(True, True)) # free form, strict
doline = reader.next()
enddoline = reader.next()
dogen = fparser1.block_statements.Do(parent.root, doline)
dogen.loopcontrol = variable_name + "=" + start + "," + end
if step is not None:
dogen.loopcontrol = dogen.loopcontrol + "," + step
enddo = fparser1.block_statements.EndDo(dogen, enddoline)
dogen.content.append(enddo)
BaseGen.__init__(self, parent, dogen)
:param str name: name of module to USE
:param parent: node in fparser1 AST to which to add this USE as a child
:type parent: :py:class:`fparser.one.block_statements.*`
:param bool only: whether this USE has an "ONLY" clause
:param list funcnames: list of quantities to follow the "ONLY" clause
:returns: an fparser1 Use object
:rtype: :py:class:`fparser.one.block_statements.Use`
'''
reader = FortranStringReader("use kern,only : func1_kern=>func1")
reader.set_format(FortranFormat(True, True)) # free form, strict
myline = reader.next()
# find an appropriate place to add in our use statement
while not isinstance(parent, (fparser1.block_statements.Program,
fparser1.block_statements.Module,
fparser1.block_statements.Subroutine)):
parent = parent.parent
use = fparser1.block_statements.Use(parent, myline)
use.name = name
use.isonly = only
if funcnames is None:
funcnames = []
use.isonly = False
use.items = funcnames
parent.content.insert(0, use)
return use