Merge branch 'master' of ssh://irpf90.git.sourceforge.net/gitroot/irpf90/irpf90

Conflicts:
	src/makefile.py
	src/parsed_text.py
	src/util.py

Version:1.1.51
This commit is contained in:
Anthony Scemama 2010-10-02 21:01:45 +02:00
commit 969e31490b
11 changed files with 63 additions and 45 deletions

View File

@ -32,5 +32,11 @@ wd = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0,(wd+"/../src/"))
sys.path.insert(0,(wd+"/../share/irpf90/src/"))
import irpf90
irpf90.main()
debug = int(os.getenv("IRP_DEBUG",0))
if debug == 0:
import irpf90
irpf90.main()
else:
import profile
print "Profiling irpf90"
profile.run('import irpf90 ; irpf90.main()')

View File

@ -54,9 +54,11 @@ subroutine irp_enter(irp_where)
integer :: nthread
character*(*) :: irp_where
$OMP_DECL
!$OMP CRITICAL
ithread = $OMP_GET_THREAD_NUM
nthread = $OMP_GET_NUM_THREADS
$1
!$OMP END CRITICAL
"""
if command_line.do_memory:
txt+="""
@ -75,9 +77,11 @@ subroutine irp_leave (irp_where)
integer :: ithread
double precision :: cpu
$OMP_DECL
!$OMP CRITICAL
ithread = $OMP_GET_THREAD_NUM
$3
$4
!$OMP END CRITICAL
end subroutine
"""
@ -97,14 +101,12 @@ end subroutine
# $1
if do_assert or do_debug:
txt = txt.replace("$1","""
!$OMP CRITICAL
if (.not.alloc) then
allocate(irp_stack(STACKMAX,nthread))
allocate(irp_cpu(STACKMAX,nthread))
allocate(stack_index(nthread))
allocate(irp_stack(STACKMAX,nthread+1))
allocate(irp_cpu(STACKMAX,nthread+1))
allocate(stack_index(nthread+1))
alloc = .True.
endif
!$OMP END CRITICAL
stack_index(ithread+1) = stack_index(ithread+1)+1
irp_stack(stack_index(ithread+1),ithread+1) = irp_where""")
if command_line.do_memory:

View File

@ -24,6 +24,8 @@
# 31062 Toulouse Cedex 4
# scemama@irsamc.ups-tlse.fr
import sys
sys.setcheckinterval(1000)
def main():
from command_line import command_line

View File

@ -33,6 +33,7 @@ class Line(object):
def __init__(self,i,text,filename):
self.i = i
self.text = text
self.lower = text.lower()
self.filename = filename
self._lower = None

View File

@ -152,4 +152,3 @@ def run():
file.close()
sys.exit(0)

View File

@ -38,29 +38,32 @@ stuple = map(lambda s: (s, subroutines[s].regexp), subroutines.keys())
stuple = filter(lambda s: subroutines[s[0]].is_function, stuple)
re_string_sub = regexps.re_string.sub
regexps_re_string_sub = regexps.re_string.sub
def find_variables_in_line(line):
assert isinstance(line,Line)
result = []
sub_done = False
buffer = line.text_lower
ap = result.append
for v,same_as,regexp in vtuple:
if v in buffer:
if not sub_done:
buffer = re_string_sub('',buffer)
buffer = regexps_re_string_sub('',buffer)
sub_done = True
if regexp.search(buffer) is not None:
result.append(same_as)
ap(same_as)
return result
def find_funcs_in_line(line):
assert isinstance(line,Line)
result = []
append = result.append
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)
append(s)
return result
@ -90,6 +93,7 @@ def get_parsed_text():
def func(filename, text):
varlist = []
result = []
append = result.append
for line in filter(
lambda x: type(x) not in [ Doc, Begin_doc, End_doc ],
text):
@ -110,28 +114,28 @@ def get_parsed_text():
Function,
End,
]:
result.append( ([],line) )
append( ([],line) )
elif isinstance(line,End_provider):
varlist = []
result.append( ([],line) )
append( ([],line) )
elif isinstance(line,Provide):
l = line.text_lower.split()[1:]
l = filter(lambda x: x not in varlist, l)
for v in l:
if v not in variables.keys():
error.fail(line,"Variable %s is unknown"%(v))
result.append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( (l,Simple_line(line.i,"!%s"%(line.text),line.filename)) )
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)
if sub not in subroutines:
t = Simple_line
result.append( (l,Simple_line(line.i,line.text,line.filename)) )
append( (l,Simple_line(line.i,line.text,line.filename)) )
else:
result.append( (l,line) )
append( (l,line) )
if subroutines[sub].touches != []:
result.append( ([],Provide_all(line.i,"",line.filename)) )
append( ([],Provide_all(line.i,"",line.filename)) )
elif isinstance(line,Free):
vars = line.text_lower.split()
if len(vars) < 2:
@ -139,7 +143,7 @@ def get_parsed_text():
vars = vars[1:]
for v in vars:
variables[v].is_freed = True
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
use = map(lambda x: " use %s"%(variables[x].fmodule),vars)
for var in vars:
result += map(lambda x: ([],Use(line.i,x,line.filename)),
@ -148,10 +152,10 @@ def get_parsed_text():
variables[var].free)
elif isinstance(line,Irp_read):
variables[line.filename]._is_read = True
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
elif isinstance(line,Irp_write):
variables[line.filename]._is_written = True
result.append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
append( ([],Simple_line(line.i,"!%s"%(line.text),line.filename)) )
elif isinstance(line,Touch):
vars = line.text_lower.split()
if len(vars) < 2:
@ -197,7 +201,7 @@ def get_parsed_text():
except ValueError:
print v, variables[v].same_as
raise
result.append( (variable_list,line) )
append( (variable_list,line) )
else:
l = find_variables_in_line(line)
l = filter(lambda x: x not in varlist, l)
@ -210,7 +214,6 @@ def get_parsed_text():
#return main_result
return parallel_loop(func,preprocessed_text)
parsed_text = get_parsed_text()
@ -252,6 +255,7 @@ def move_variables():
def func(filename, text):
result = []
append = result.append
# 1st pass
varlist = []
ifvars = []
@ -264,20 +268,20 @@ def move_variables():
for vars,line in revtext:
if type(line) in [ End_provider,End ]:
varlist = []
result.append( ([],line) )
append( ([],line) )
elif type(line) in [ Endif, End_select ]:
old_ifvars.append( list(ifvars) )
old_elsevars.append( list(elsevars) )
old_varlist.append( list(varlist) )
varlist = []
result.append( ([],line) )
append( ([],line) )
elif type(line) == Else:
elsevars += list(varlist)
result.append( (varlist,line) )
append( (varlist,line) )
varlist = []
elif type(line) in [ Elseif, Case ]:
ifvars += list(varlist)
result.append( (varlist,line) )
append( (varlist,line) )
if vars != []:
varlist = old_varlist.pop()
varlist += vars
@ -285,29 +289,30 @@ def move_variables():
varlist = []
elif type(line) in [ If, Select ]:
ifvars += list(varlist)
result.append( (varlist,line) )
append( (varlist,line) )
vars += filter(lambda x: x in elsevars, ifvars)
ifvars = old_ifvars.pop()
elsevars = old_elsevars.pop()
varlist = old_varlist.pop() + vars
elif type(line) in [ Begin_provider, Subroutine, Function ]:
varlist += vars
result.append( (varlist,line) )
append( (varlist,line) )
if old_varlist != [] \
or old_ifvars != [] \
or old_elsevars != []:
error.fail(line,"End if missing")
varlist = []
elif isinstance(line,Provide_all):
result.append( (vars,line) )
append( (vars,line) )
else:
varlist += vars
result.append( ([],line) )
append( ([],line) )
result.reverse()
# 2nd pass
text = result
result = []
append = result.append
old_varlist = []
varlist = []
for vars,line in text:
@ -368,11 +373,12 @@ def add_subroutine_needs():
main_result = []
for filename, text in parsed_text:
result = []
append = result.append
for vars,line in text:
if isinstance(line,Call):
subname = find_subname(line)
vars = subroutines[subname].to_provide
result.append( (vars,line) )
append( (vars,line) )
main_result.append( (filename, result) )
return main_result

View File

@ -538,12 +538,12 @@ def irp_simple_statements(text):
def process_begin_provider(line):
assert isinstance(line,Begin_provider)
buffer = line.text.replace('['," ")
buffer = line.lower.replace('['," ")
buffer = buffer.replace(']',"")
buffer = buffer.split(',')
if len(buffer) < 2:
error.fail(line,"Error in Begin_provider statement")
varname = buffer[1].strip().lower()
varname = buffer[1].strip()
length = len(varname)
i = line.i
f = line.filename
@ -557,12 +557,12 @@ def irp_simple_statements(text):
def process_cont_provider(line):
assert isinstance(line,Cont_provider)
buffer = line.text.replace('['," ")
buffer = line.lower.replace('['," ")
buffer = buffer.replace(']',"")
buffer = buffer.split(',')
if len(buffer) < 2:
error.fail(line,"Error in Cont_provider statement")
varname = buffer[1].strip().lower()
varname = buffer[1].strip()
i = line.i
f = line.filename
return [ Cont_provider(i,line.text,(f,varname)) ]
@ -599,7 +599,7 @@ def irp_simple_statements(text):
def process_program(line):
assert isinstance(line,Program)
program_name = line.text.split()[1].lower()
program_name = line.lower.split()[1]
result = [ Program(0,"",program_name) ] + \
process_subroutine( Subroutine(line.i,"subroutine %s"%(program_name,),line.filename) )
return result
@ -691,7 +691,7 @@ endif'''
result = []
for line in text:
if isinstance(line,If):
if line.text.lower().endswith("then"):
if line.lower.endswith("then"):
result.append(line)
else:
buffer = line.text

View File

@ -49,7 +49,7 @@ class Sub(object):
############################################################
def is_function(self):
if '_is_function' not in self.__dict__:
self._is_function = "function" in self.line.text.lower()
self._is_function = "function" in self.line.lower
return self._is_function
is_function = property(is_function)

View File

@ -121,10 +121,11 @@ class Variable(object):
def others(self):
if '_others' not in self.__dict__:
result = []
append = result.append
f = lambda l: type(l) in [Begin_provider, Cont_provider]
lines = filter(f, self.text)
for line in lines:
result.append(line.filename[1])
append(line.filename[1])
result.remove(self.name)
self._others = result
return self._others

View File

@ -66,13 +66,14 @@ def call_provides(vars,opt=False):
all_children = flatten( map(lambda x: variables[x].children, vars ))
vars = filter(lambda x: x not in all_children,vars)
def fun(x):
result = []
if command_line.do_openmp:
result = [ "!$OMP TASK" ]
else:
result = []
result += [ "!$OMP TASK" ]
result += [ \
" if (.not.%s_is_built) then"%(x) ]
result += [ \
" call provide_%s"%(x) ]
result += [ \
" if (.not.%s_is_built) then"%(x),
" call provide_%s"%(x),
" endif" ]
if command_line.do_openmp:
result += [ "!$OMP END TASK" ]

View File

@ -1 +1 @@
version = "1.1.50"
version = "1.1.51"