Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def __init__(self, parent):
'''
:param parent: node in AST to which to add 'implicit none' as a child
:type parent: :py:class:`psyclone.f2pygen.ModuleGen` or
:py:class:`psyclone.f2pygen.SubroutineGen`
:raises Exception: if `parent` is not a ModuleGen or SubroutineGen
'''
if not isinstance(parent, ModuleGen) and not isinstance(parent,
SubroutineGen):
raise Exception(
"The parent of ImplicitNoneGen must be a module or a "
"subroutine, but found {0}".format(type(parent)))
reader = FortranStringReader("IMPLICIT NONE\n")
reader.set_format(FortranFormat(True, True)) # free form, strict
subline = reader.next()
from fparser.one.typedecl_statements import Implicit
my_imp_none = Implicit(parent.root, subline)
BaseGen.__init__(self, parent, my_imp_none)
def __init__(self, parent, content):
'''
:param parent: node to which to add this DEALLOCATE as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param content: string or list of variables to deallocate
:type content: list of strings or a single string
:raises RuntimeError: if `content` is not of correct type
'''
reader = FortranStringReader("deallocate(dummy)")
reader.set_format(FortranFormat(True, False)) # free form, strict
myline = reader.next()
self._decl = fparser1.statements.Deallocate(parent.root, myline)
if isinstance(content, str):
self._decl.items = [content]
elif isinstance(content, list):
self._decl.items = content
else:
raise RuntimeError(
"DeallocateGen expected the content argument to be a str"
" or a list, but found {0}".format(type(content)))
BaseGen.__init__(self, parent, self._decl)
def __init__(self, parent, language, position, directive_type, content):
self._supported_languages = ["omp", "acc"]
self._language = language
self._directive_type = directive_type
reader = FortranStringReader("! content\n", ignore_comments=False)
reader.set_format(FortranFormat(True, True)) # free form, strict
subline = reader.next()
if language == "omp":
my_comment = OMPDirective(parent.root, subline, position,
directive_type)
my_comment.content = "$omp"
elif language == "acc":
my_comment = ACCDirective(parent.root, subline, position,
directive_type)
my_comment.content = "$acc"
else:
raise RuntimeError(
"Error, unsupported directive language. Expecting one of "
"{0} but found '{1}'".format(str(self._supported_languages),
language))
# we've previous inserted.
self.root.profiling_name_clashes_checked = True
# Create a name for this region by finding where this profiling
# node is in the list of profiling nodes in this Invoke.
sched = self.root
pnodes = sched.walk(ProfileNode)
region_idx = pnodes.index(self)
if self._region_name:
region_name = self._region_name
else:
region_name = "r{0}".format(region_idx)
var_name = "psy_profile{0}".format(region_idx)
# Create a variable for this profiling region
reader = FortranStringReader(
"type(ProfileData), save :: {0}".format(var_name))
# Tell the reader that the source is free format
reader.set_format(FortranFormat(True, False))
decln = Fortran2003.Type_Declaration_Stmt(reader)
spec_part.content.append(decln)
# Find the parent in the parse tree - first get a pointer to the
# AST for the content of this region.
content_ast = self.profile_body.children[0].ast
# Now store the parent of this region
# pylint: disable=protected-access
fp_parent = content_ast._parent
# pylint: enable=protected-access
# Find the location of the AST of our first child node in the
# list of child nodes of our parent in the fparser parse tree.
ast_start_index = object_index(fp_parent.content,
def __init__(self, parent, content):
'''
:param parent: node to which to add this ALLOCATE as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param content: string or list of variables to allocate
:type content: list of strings or a single string
:raises RuntimeError: if `content` is not of correct type
'''
reader = FortranStringReader("allocate(dummy)")
reader.set_format(FortranFormat(True, False)) # free form, strict
myline = reader.next()
self._decl = fparser1.statements.Allocate(parent.root, myline)
if isinstance(content, six.string_types):
self._decl.items = [content]
elif isinstance(content, list):
self._decl.items = content
else:
raise RuntimeError(
"AllocateGen expected the content argument to be a str or"
" a list, but found {0}".format(type(content)))
BaseGen.__init__(self, parent, self._decl)
def __init__(self, parent, name="", only=False, funcnames=None):
'''
:param parent: node in AST to which to add UseGen as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param str name: name of the module to USE
:param bool only: whether this USE has an ONLY clause
:param list funcnames: list of names to follow ONLY clause
'''
reader = FortranStringReader("use kern,only : func1_kern=>func1")
reader.set_format(FortranFormat(True, True)) # free form, strict
myline = reader.next()
root = parent.root
from fparser.one.block_statements import Use
use = Use(root, myline)
use.name = name
use.isonly = only
if funcnames is None:
funcnames = []
use.isonly = False
local_funcnames = funcnames[:]
use.items = local_funcnames
BaseGen.__init__(self, parent, use)
def __init__(self, parent, name="", args=None, implicitnone=False):
'''
:param parent: node in AST to which to add Subroutine as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param str name: name of the Fortran subroutine
:param list args: list of arguments accepted by the subroutine
:param bool implicitnone: whether or not we should specify
"implicit none" for the body of this
subroutine
'''
reader = FortranStringReader(
"subroutine vanilla(vanilla_arg)\nend subroutine")
reader.set_format(FortranFormat(True, True)) # free form, strict
subline = reader.next()
endsubline = reader.next()
from fparser.one.block_statements import Subroutine, EndSubroutine
self._sub = Subroutine(parent.root, subline)
self._sub.name = name
if args is None:
args = []
self._sub.args = args
endsub = EndSubroutine(self._sub, endsubline)
self._sub.content.append(endsub)
ProgUnitGen.__init__(self, parent, self._sub)
if implicitnone:
self.add(ImplicitNoneGen(self))
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)
def __init__(self, parent, name="", args=None):
'''
:param parent: node in AST to which to add CallGen as a child
:type parent: :py:class:`psyclone.f2pygen.BaseGen`
:param str name: the name of the routine to call
:param list args: list of arguments to pass to the call
'''
reader = FortranStringReader("call vanilla(vanilla_arg)")
reader.set_format(FortranFormat(True, True)) # free form, strict
myline = reader.next()
from fparser.one.block_statements import Call
self._call = Call(parent.root, myline)
self._call.designator = name
if args is None:
args = []
self._call.items = args
BaseGen.__init__(self, parent, self._call)
dtype = datatype.lower()
if dtype not in self.SUPPORTED_TYPES:
raise RuntimeError(
"f2pygen.DeclGen.init: Only {0} types are currently"
" supported and you specified '{1}'"
.format(self.SUPPORTED_TYPES, datatype))
fort_fmt = FortranFormat(True, False) # free form, strict
if dtype == "integer":
reader = FortranStringReader("integer :: vanilla")
reader.set_format(fort_fmt)
myline = reader.next()
self._decl = fparser1.typedecl_statements.Integer(parent.root,
myline)
elif dtype == "real":
reader = FortranStringReader("real :: vanilla")
reader.set_format(fort_fmt)
myline = reader.next()
self._decl = fparser1.typedecl_statements.Real(parent.root, myline)
elif dtype == "logical":
reader = FortranStringReader("logical :: vanilla")
reader.set_format(fort_fmt)
myline = reader.next()
self._decl = fparser1.typedecl_statements.Logical(parent.root,
myline)
else:
# Defensive programming in case SUPPORTED_TYPES is added to
# but not handled here
raise InternalError(
"Type '{0}' is in DeclGen.SUPPORTED_TYPES "
"but not handled by constructor.".format(dtype))