mirror of
https://gitlab.com/scemama/irpf90.git
synced 2024-12-21 11:53:32 +01:00
Merge branch 'master' of ssh://scemama@irpf90.git.sourceforge.net/gitroot/irpf90/irpf90
Conflicts: src/command_line.py src/variable.py
This commit is contained in:
commit
ef72d18ddd
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
packages/.rpmmacros
|
||||||
|
packages/*.tar.gz
|
||||||
|
packages/*.rpm
|
||||||
|
packages/sourceforge.sh
|
||||||
|
packages/version
|
||||||
|
src/*.pyc
|
||||||
|
irpf90.make
|
||||||
|
irpf90_entities
|
||||||
|
IRPF90_temp
|
||||||
|
IRPF90_man
|
@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/python
|
#!/usr/bin/python -u
|
||||||
# IRPF90 is a Fortran90 preprocessor written in Python for programming using
|
# IRPF90 is a Fortran90 preprocessor written in Python for programming using
|
||||||
# the Implicit Reference to Parameters (IRP) method.
|
# the Implicit Reference to Parameters (IRP) method.
|
||||||
# Copyright (C) 2009 Anthony SCEMAMA
|
# Copyright (C) 2009 Anthony SCEMAMA
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
IRPF90 = irpf90 #-a -d
|
IRPF90 = irpf90 #-a -d
|
||||||
FC = gfortran
|
FC = gfortran
|
||||||
FCFLAGS= -ffree-line-length-none -O2
|
FCFLAGS= -O2
|
||||||
|
|
||||||
SRC=
|
SRC=
|
||||||
OBJ=
|
OBJ=
|
||||||
|
@ -36,9 +36,10 @@ options['a'] = [ 'assert' , 'Activate assertions', 0 ]
|
|||||||
options['h'] = [ 'help' , 'Print this help', 0 ]
|
options['h'] = [ 'help' , 'Print this help', 0 ]
|
||||||
options['i'] = [ 'init' , 'Initialize current directory', 0 ]
|
options['i'] = [ 'init' , 'Initialize current directory', 0 ]
|
||||||
options['D'] = [ 'define' , 'Define variable', 1 ]
|
options['D'] = [ 'define' , 'Define variable', 1 ]
|
||||||
|
options['o'] = [ 'checkopt' , 'Show where optimization may be required', 0 ]
|
||||||
options['p'] = [ 'preprocess' , 'Preprocess file', 1 ]
|
options['p'] = [ 'preprocess' , 'Preprocess file', 1 ]
|
||||||
options['o'] = [ 'openmp' , 'Auto-parallelization', 0 ]
|
options['t'] = [ 'openmp' , 'Task Auto-parallelization', 0 ]
|
||||||
options['m'] = [ 'memory' , 'Debug memory', 0 ]
|
options['m'] = [ 'memory' , 'Debug memory info', 0 ]
|
||||||
|
|
||||||
class CommandLine(object):
|
class CommandLine(object):
|
||||||
|
|
||||||
|
@ -57,6 +57,15 @@ $OMP_DECL
|
|||||||
ithread = $OMP_GET_THREAD_NUM
|
ithread = $OMP_GET_THREAD_NUM
|
||||||
nthread = $OMP_GET_NUM_THREADS
|
nthread = $OMP_GET_NUM_THREADS
|
||||||
$1
|
$1
|
||||||
|
"""
|
||||||
|
if command_line.do_memory:
|
||||||
|
txt+="""
|
||||||
|
if (.not.alloc) then
|
||||||
|
print *, 'Allocating irp_stack(',STACKMAX,',',nthread,')'
|
||||||
|
print *, 'Allocating irp_cpu(',STACKMAX,',',nthread,')'
|
||||||
|
print *, 'Allocating stack_index(',nthread,')'
|
||||||
|
endif"""
|
||||||
|
txt +="""
|
||||||
$2
|
$2
|
||||||
end subroutine
|
end subroutine
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ def create():
|
|||||||
file = open(FILENAME,"w")
|
file = open(FILENAME,"w")
|
||||||
t = """IRPF90 = irpf90 #-a -d
|
t = """IRPF90 = irpf90 #-a -d
|
||||||
FC = gfortran
|
FC = gfortran
|
||||||
FCFLAGS= -ffree-line-length-none -O2
|
FCFLAGS= -O2
|
||||||
|
|
||||||
SRC=
|
SRC=
|
||||||
OBJ=
|
OBJ=
|
||||||
|
@ -33,14 +33,16 @@ from subroutines import subroutines
|
|||||||
import regexps
|
import regexps
|
||||||
import error
|
import error
|
||||||
|
|
||||||
vtuple = map(lambda v: (v, variables[v], variables[v].same_as, variables[v].regexp), variables.keys())
|
vtuple = map(lambda v: (v, variables[v].same_as, variables[v].regexp), variables.keys())
|
||||||
|
stuple = map(lambda s: (s, subroutines[s].regexp), subroutines.keys())
|
||||||
|
stuple = filter(lambda s: subroutines[s[0]].is_function, stuple)
|
||||||
|
|
||||||
def find_variables_in_line(line):
|
def find_variables_in_line(line):
|
||||||
assert isinstance(line,Line)
|
assert isinstance(line,Line)
|
||||||
result = []
|
result = []
|
||||||
sub_done = False
|
sub_done = False
|
||||||
buffer = line.text.lower()
|
buffer = line.text.lower()
|
||||||
for v,var,same_as,regexp in vtuple:
|
for v,same_as,regexp in vtuple:
|
||||||
if v in buffer:
|
if v in buffer:
|
||||||
if not sub_done:
|
if not sub_done:
|
||||||
buffer = regexps.re_string.sub('',buffer)
|
buffer = regexps.re_string.sub('',buffer)
|
||||||
@ -49,6 +51,18 @@ def find_variables_in_line(line):
|
|||||||
result.append(same_as)
|
result.append(same_as)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
def find_funcs_in_line(line):
|
||||||
|
assert isinstance(line,Line)
|
||||||
|
result = []
|
||||||
|
sub_done = False
|
||||||
|
buffer = line.text.lower()
|
||||||
|
for s,regexp in stuple:
|
||||||
|
if s in buffer:
|
||||||
|
if regexp.search(buffer) is not None:
|
||||||
|
result.append(s)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def find_subroutine_in_line(line):
|
def find_subroutine_in_line(line):
|
||||||
assert isinstance(line,Call)
|
assert isinstance(line,Call)
|
||||||
buffer = line.text.split('(')[0]
|
buffer = line.text.split('(')[0]
|
||||||
@ -108,17 +122,16 @@ def get_parsed_text():
|
|||||||
error.fail(line,"Variable %s is unknown"%(v))
|
error.fail(line,"Variable %s is unknown"%(v))
|
||||||
result.append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
result.append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
|
||||||
elif isinstance(line,Call):
|
elif isinstance(line,Call):
|
||||||
|
l = find_variables_in_line(line)
|
||||||
|
l = filter(lambda x: x not in varlist, l)
|
||||||
sub = find_subroutine_in_line(line)
|
sub = find_subroutine_in_line(line)
|
||||||
if sub not in subroutines:
|
if sub not in subroutines:
|
||||||
t = Simple_line
|
t = Simple_line
|
||||||
|
result.append( (l,Simple_line(line.i,line.text,line.filename)) )
|
||||||
else:
|
else:
|
||||||
if subroutines[sub].touches == []:
|
result.append( (l,line) )
|
||||||
t = Simple_line
|
if subroutines[sub].touches != []:
|
||||||
else:
|
result.append( ([],Provide_all(line.i,"",line.filename)) )
|
||||||
t = Provide_all
|
|
||||||
l = find_variables_in_line(line)
|
|
||||||
l = filter(lambda x: x not in varlist, l)
|
|
||||||
result.append( (l,t(line.i,line.text,line.filename)) )
|
|
||||||
elif isinstance(line,Free):
|
elif isinstance(line,Free):
|
||||||
vars = line.text.split()
|
vars = line.text.split()
|
||||||
if len(vars) < 2:
|
if len(vars) < 2:
|
||||||
@ -186,7 +199,10 @@ def get_parsed_text():
|
|||||||
return main_result
|
return main_result
|
||||||
|
|
||||||
parsed_text = get_parsed_text()
|
parsed_text = get_parsed_text()
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
def move_to_top(text,t):
|
def move_to_top(text,t):
|
||||||
assert isinstance(text,list)
|
assert isinstance(text,list)
|
||||||
assert t in [ Declaration, Implicit, Use, Cont_provider ]
|
assert t in [ Declaration, Implicit, Use, Cont_provider ]
|
||||||
@ -236,35 +252,30 @@ def move_variables():
|
|||||||
varlist = []
|
varlist = []
|
||||||
result.append( ([],line) )
|
result.append( ([],line) )
|
||||||
elif type(line) in [ Endif, End_select ]:
|
elif type(line) in [ Endif, End_select ]:
|
||||||
old_ifvars.append(ifvars)
|
old_ifvars.append( list(ifvars) )
|
||||||
old_elsevars.append(elsevars)
|
old_elsevars.append( list(elsevars) )
|
||||||
old_varlist.append(varlist)
|
old_varlist.append( list(varlist) )
|
||||||
varlist = []
|
varlist = []
|
||||||
result.append( ([],line) )
|
result.append( ([],line) )
|
||||||
elif type(line) == Else:
|
elif type(line) == Else:
|
||||||
|
elsevars += list(varlist)
|
||||||
result.append( (varlist,line) )
|
result.append( (varlist,line) )
|
||||||
elsevars = list(varlist)
|
|
||||||
if vars != []:
|
|
||||||
varlist = old_varlist.pop()
|
|
||||||
varlist += vars
|
|
||||||
old_varlist.append(varlist)
|
|
||||||
varlist = []
|
varlist = []
|
||||||
elif type(line) in [ Elseif, Case ]:
|
elif type(line) in [ Elseif, Case ]:
|
||||||
ifvars += varlist
|
ifvars += list(varlist)
|
||||||
result.append( (varlist,line) )
|
result.append( (varlist,line) )
|
||||||
if vars != []:
|
if vars != []:
|
||||||
varlist = old_varlist.pop()
|
varlist = old_varlist.pop()
|
||||||
varlist += vars
|
varlist += vars
|
||||||
old_varlist.append(varlist)
|
old_varlist.append( list(varlist) )
|
||||||
varlist = []
|
varlist = []
|
||||||
elif type(line) in [ If, Select ]:
|
elif type(line) in [ If, Select ]:
|
||||||
ifvars += varlist
|
ifvars += list(varlist)
|
||||||
result.append( (varlist,line) )
|
result.append( (varlist,line) )
|
||||||
vars += filter(lambda x: x in elsevars, ifvars)
|
vars += filter(lambda x: x in elsevars, ifvars)
|
||||||
ifvars = old_ifvars.pop()
|
ifvars = old_ifvars.pop()
|
||||||
elsevars = old_elsevars.pop()
|
elsevars = old_elsevars.pop()
|
||||||
varlist = old_varlist.pop()
|
varlist = old_varlist.pop() + vars
|
||||||
varlist += vars
|
|
||||||
elif type(line) in [ Begin_provider, Subroutine, Function ]:
|
elif type(line) in [ Begin_provider, Subroutine, Function ]:
|
||||||
varlist += vars
|
varlist += vars
|
||||||
result.append( (varlist,line) )
|
result.append( (varlist,line) )
|
||||||
@ -279,6 +290,7 @@ def move_variables():
|
|||||||
varlist += vars
|
varlist += vars
|
||||||
result.append( ([],line) )
|
result.append( ([],line) )
|
||||||
result.reverse()
|
result.reverse()
|
||||||
|
|
||||||
# 2nd pass
|
# 2nd pass
|
||||||
text = result
|
text = result
|
||||||
result = []
|
result = []
|
||||||
@ -313,6 +325,39 @@ def move_variables():
|
|||||||
return main_result
|
return main_result
|
||||||
|
|
||||||
parsed_text = move_variables()
|
parsed_text = move_variables()
|
||||||
|
######################################################################
|
||||||
|
def build_sub_needs():
|
||||||
|
# Needs
|
||||||
|
for filename, text in parsed_text:
|
||||||
|
sub = None
|
||||||
|
for vars,line in text:
|
||||||
|
if type(line) in [ Subroutine, Function ]:
|
||||||
|
subname = find_subname(line)
|
||||||
|
sub = subroutines[subname]
|
||||||
|
sub.needs = []
|
||||||
|
sub.to_provide = vars
|
||||||
|
elif isinstance(line,End):
|
||||||
|
sub.needs = make_single(sub.needs)
|
||||||
|
sub = None
|
||||||
|
if sub is not None:
|
||||||
|
sub.needs += vars
|
||||||
|
|
||||||
|
build_sub_needs()
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
def add_subroutine_needs():
|
||||||
|
main_result = []
|
||||||
|
for filename, text in parsed_text:
|
||||||
|
result = []
|
||||||
|
for vars,line in text:
|
||||||
|
if isinstance(line,Call):
|
||||||
|
subname = find_subname(line)
|
||||||
|
vars = subroutines[subname].to_provide
|
||||||
|
result.append( (vars,line) )
|
||||||
|
main_result.append( (filename, result) )
|
||||||
|
return main_result
|
||||||
|
|
||||||
|
parsed_text = add_subroutine_needs()
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
def build_needs():
|
def build_needs():
|
||||||
@ -331,6 +376,17 @@ def build_needs():
|
|||||||
var = None
|
var = None
|
||||||
if var is not None:
|
if var is not None:
|
||||||
var.needs += vars
|
var.needs += vars
|
||||||
|
if isinstance(line,Call):
|
||||||
|
subname = find_subname(line)
|
||||||
|
var.needs += subroutines[subname].needs
|
||||||
|
elif type(line) in [ \
|
||||||
|
Simple_line, Assert,
|
||||||
|
Do , If,
|
||||||
|
Elseif , Select,
|
||||||
|
]:
|
||||||
|
funcs = find_funcs_in_line(line)
|
||||||
|
for f in funcs:
|
||||||
|
var.needs += subroutines[f].needs
|
||||||
for v in variables.keys():
|
for v in variables.keys():
|
||||||
main = variables[v].same_as
|
main = variables[v].same_as
|
||||||
if main != v:
|
if main != v:
|
||||||
@ -365,10 +421,30 @@ for filename,text in parsed_text:
|
|||||||
result.append ( (filename,text) )
|
result.append ( (filename,text) )
|
||||||
parsed_text = result
|
parsed_text = result
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
from command_line import command_line
|
||||||
|
|
||||||
|
def check_opt():
|
||||||
|
if not command_line.do_checkopt:
|
||||||
|
return
|
||||||
|
|
||||||
|
for filename, text in parsed_text:
|
||||||
|
do_level = 0
|
||||||
|
for vars,line in text:
|
||||||
|
if do_level > 0 and vars != []:
|
||||||
|
print "Optimization: %s line %d"%(line.filename,line.i)
|
||||||
|
for v in vars:
|
||||||
|
print " PROVIDE ",v
|
||||||
|
if isinstance(line,Do):
|
||||||
|
do_level += 1
|
||||||
|
elif isinstance(line,Enddo):
|
||||||
|
do_level -= 1
|
||||||
|
check_opt()
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
for i in range(len(parsed_text)):
|
for i in range(len(parsed_text)):
|
||||||
if parsed_text[i][0] == 'libqcio_groups.irp.f':
|
if parsed_text[i][0] == 'properties.irp.f':
|
||||||
print '!-------- %s -----------'%(parsed_text[i][0])
|
print '!-------- %s -----------'%(parsed_text[i][0])
|
||||||
for line in parsed_text[i][1]:
|
for line in parsed_text[i][1]:
|
||||||
print line[1]
|
print line[1]
|
||||||
|
@ -304,14 +304,14 @@ def remove_continuation(text,form):
|
|||||||
if form == Free_form:
|
if form == Free_form:
|
||||||
for line in text:
|
for line in text:
|
||||||
if line.text[-1] == '&':
|
if line.text[-1] == '&':
|
||||||
buffer = "%s%s "%(buffer,line.text[:-1].lstrip())
|
buffer = "%s%s\n"%(buffer,line.text)
|
||||||
if number == 0:
|
if number == 0:
|
||||||
t = type(line)
|
t = type(line)
|
||||||
number = line.i
|
number = line.i
|
||||||
else:
|
else:
|
||||||
if number != 0:
|
if number != 0:
|
||||||
newline = t(number, \
|
newline = t(number, \
|
||||||
"%s%s"%(buffer,line.text.lstrip()), \
|
"%s%s"%(buffer,line.text), \
|
||||||
line.filename)
|
line.filename)
|
||||||
line = newline
|
line = newline
|
||||||
number = 0
|
number = 0
|
||||||
@ -327,7 +327,7 @@ def remove_continuation(text,form):
|
|||||||
if line.text[5] != ' ':
|
if line.text[5] != ' ':
|
||||||
is_continuation = True
|
is_continuation = True
|
||||||
if is_continuation:
|
if is_continuation:
|
||||||
buffer = "%s %s"%(line.text[6:].lstrip(),buffer)
|
buffer = "&\n%s %s %s"%(line.text[:5],line.text[6:],buffer)
|
||||||
else:
|
else:
|
||||||
line.text = line.text+buffer
|
line.text = line.text+buffer
|
||||||
result.insert(0,line)
|
result.insert(0,line)
|
||||||
|
@ -51,5 +51,5 @@ re_decl = re.compile( "".join( [ r"^\ *",
|
|||||||
|
|
||||||
re_test = re.compile(r"\( *(.*)(\.[a-zA-Z]*\.|[<>]=?|[=/]=)([^=]*)\)")
|
re_test = re.compile(r"\( *(.*)(\.[a-zA-Z]*\.|[<>]=?|[=/]=)([^=]*)\)")
|
||||||
|
|
||||||
re_string = re.compile(r"'.*'")
|
re_string = re.compile(r"'.*?'")
|
||||||
|
|
||||||
|
@ -46,6 +46,13 @@ class Sub(object):
|
|||||||
return self._name
|
return self._name
|
||||||
name = property(name)
|
name = property(name)
|
||||||
|
|
||||||
|
############################################################
|
||||||
|
def is_function(self):
|
||||||
|
if '_is_function' not in self.__dict__:
|
||||||
|
self._is_function = "function" in self.line.text.lower()
|
||||||
|
return self._is_function
|
||||||
|
is_function = property(is_function)
|
||||||
|
|
||||||
############################################################
|
############################################################
|
||||||
def doc(self):
|
def doc(self):
|
||||||
if '_doc' not in self.__dict__:
|
if '_doc' not in self.__dict__:
|
||||||
|
@ -35,7 +35,7 @@ def create_subroutines():
|
|||||||
buffer = []
|
buffer = []
|
||||||
inside = False
|
inside = False
|
||||||
for line in text:
|
for line in text:
|
||||||
if isinstance(line,Subroutine):
|
if type(line) in [ Subroutine, Function ]:
|
||||||
inside = True
|
inside = True
|
||||||
if inside:
|
if inside:
|
||||||
buffer.append(line)
|
buffer.append(line)
|
||||||
|
16
src/util.py
16
src/util.py
@ -39,12 +39,14 @@ def same_file(filename,txt):
|
|||||||
file = open(filename,"r")
|
file = open(filename,"r")
|
||||||
except IOError:
|
except IOError:
|
||||||
return False
|
return False
|
||||||
lines = file.readlines()
|
stream = file.read()
|
||||||
file.close()
|
file.close()
|
||||||
if len(lines) != len(txt):
|
|
||||||
|
buffer = ''.join(txt)
|
||||||
|
|
||||||
|
if len(stream) != len(buffer):
|
||||||
return False
|
return False
|
||||||
for a,b in zip(lines,txt):
|
if stream != buffer:
|
||||||
if a != b:
|
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -69,11 +71,7 @@ def find_subname(line):
|
|||||||
if not buffer.endswith(')'):
|
if not buffer.endswith(')'):
|
||||||
buffer += "()"
|
buffer += "()"
|
||||||
buffer = buffer.split('(')
|
buffer = buffer.split('(')
|
||||||
if len(buffer) > 1:
|
buffer = buffer[0].lower().split()
|
||||||
buffer = " ".join(buffer[:-1])
|
|
||||||
else:
|
|
||||||
buffer = buffer[0]
|
|
||||||
buffer = buffer.lower().split()
|
|
||||||
if len(buffer) < 2:
|
if len(buffer) < 2:
|
||||||
error.fail(line,"Syntax Error")
|
error.fail(line,"Syntax Error")
|
||||||
return buffer[-1]
|
return buffer[-1]
|
||||||
|
@ -191,7 +191,6 @@ class Variable(object):
|
|||||||
if '_regexp' not in self.__dict__:
|
if '_regexp' not in self.__dict__:
|
||||||
import re
|
import re
|
||||||
self._regexp = re.compile( \
|
self._regexp = re.compile( \
|
||||||
#r"^.*[^a-z0-9'\"_]+%s([^a-z0-9_]|$)"%(self.name),re.I)
|
|
||||||
r"([^a-z0-9'\"_]|^)%s([^a-z0-9_]|$)"%(self.name),re.I)
|
r"([^a-z0-9'\"_]|^)%s([^a-z0-9_]|$)"%(self.name),re.I)
|
||||||
return self._regexp
|
return self._regexp
|
||||||
regexp = property(regexp)
|
regexp = property(regexp)
|
||||||
@ -406,15 +405,23 @@ class Variable(object):
|
|||||||
result = " allocate(%s(%s),stat=irp_err)"
|
result = " allocate(%s(%s),stat=irp_err)"
|
||||||
result = result%(name,','.join(self.dim))
|
result = result%(name,','.join(self.dim))
|
||||||
if command_line.do_memory:
|
if command_line.do_memory:
|
||||||
tmp = "\n print *, 'Allocating %s(%s)'"
|
tmp = "\n print *, 'Allocating %s(%s), (',%s,')'"
|
||||||
result += tmp%(name,','.join(self.dim))
|
d = ','.join(self.dim)
|
||||||
|
if ":" in d:
|
||||||
|
result += tmp%(name,d,"''")
|
||||||
|
else:
|
||||||
|
result += tmp%(name,d,d)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
result = [ " if (allocated (%s) ) then"%(name) ]
|
result = [ " if (allocated (%s) ) then"%(name) ]
|
||||||
result += dimensions_OK()
|
result += dimensions_OK()
|
||||||
result += [\
|
result += [\
|
||||||
" if (.not.irp_dimensions_OK) then",
|
" if (.not.irp_dimensions_OK) then",
|
||||||
" deallocate(%s)"%(name) ]
|
" deallocate(%s,stat=irp_err)"%(name),
|
||||||
|
" if (irp_err /= 0) then",
|
||||||
|
" print *, irp_here//': Deallocation failed: %s'"%(name),
|
||||||
|
do_size(),
|
||||||
|
" endif"]
|
||||||
if command_line.do_memory:
|
if command_line.do_memory:
|
||||||
result += [\
|
result += [\
|
||||||
" print *, 'Deallocating %s'"%(name) ]
|
" print *, 'Deallocating %s'"%(name) ]
|
||||||
|
@ -1 +1 @@
|
|||||||
version = "1.1.31"
|
version = "1.1.43"
|
||||||
|
Loading…
Reference in New Issue
Block a user