00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 """Format internal information"""
00031
00032 from ctrump import *
00033
00034 def format_loop_subscripts(subscripts):
00035 ret = ""
00036 varname = "<loop_counter>"
00037
00038 for i in subscripts:
00039 indices_str = ""
00040
00041 for j in i.indices:
00042 is_sign = ""
00043 if j.flags & ctrump.LOOP_INDEX_NEGATIVE:
00044 is_sign = "-"
00045
00046 if j.code == ctrump.LOOP_INDEX_INDUCTIVE:
00047 varname = j.var.name
00048 indices_str = indices_str + '%s%s(incr=%d)+'%(is_sign,varname, j.incr)
00049 elif j.code == ctrump.LOOP_INDEX_POINTER_INC:
00050 indices_str = indices_str + '(ptrincr=%d)+'%(j.incr)
00051 elif j.code == ctrump.LOOP_INDEX_INVARIANT:
00052 indices_str = indices_str + '<%s%s>+'%(is_sign,j.invariant.name)
00053 else:
00054 raise("unknown index code '%s'"%ctrump.loop_index_code_string_table[j.code])
00055
00056
00057 if i.code == ctrump.LOOP_SUBSCRIPT_COEF_TERMINAL:
00058 ret = ret + ("{%s%d}"%(indices_str, i.offset))
00059 elif i.code == ctrump.LOOP_SUBSCRIPT_COEF_ARRAYSIZE:
00060 ret = ret + ("[%s%d(arraysize=%d)]"%(indices_str, i.offset, i.array_size_coef))
00061 elif i.code == ctrump.LOOP_SUBSCRIPT_COEF_SCALE:
00062 ret = ret + ("[%s%d(scale=%s)]"%(indices_str, i.offset, i.scale_array_coef.name))
00063 elif i.code == ctrump.LOOP_SUBSCRIPT_RECORD_MEMBER:
00064 ret = ret + ("[%s.%s]"%(indices_str, i.member_name))
00065 elif i.code == ctrump.LOOP_SUBSCRIPT_RECORD_MEMBER_TERMINAL:
00066 ret = ret + ("{%s.%s}"%(indices_str, i.member_name))
00067 elif i.code == ctrump.LOOP_SUBSCRIPT_LOAD_RECORD:
00068 ret = ret + ("[%s%d(load_type=%s)]"%(indices_str, i.offset, i.load_type.name))
00069 else:
00070 raise("unknown subscript code '%s'"%ctrump.loop_subscript_code_string_table[i.code])
00071 return ret
00072
00073 def format_tree_subscripts(subscripts):
00074 ret = ""
00075 for i in subscripts:
00076 for j in i.nd_subscripts:
00077 if (j.code == ctrump.SUBSCRIPT_TERMINAL or
00078 j.code == ctrump.SUBSCRIPT_COEF_ARRAY or
00079 j.code == ctrump.SUBSCRIPT_COEF_SIZEOF_RECORD):
00080
00081 if j.expr:
00082 ret = ("[%s]"%(ctrump.pprint_expr(j.expr))) + ret
00083 else:
00084 ret = "->" + ret
00085 elif (j.code == ctrupm.SUBSCRIPT_RECORD_MEMBER):
00086 ret = (".%s"%j.member_name) + ret
00087 return ret
00088
00089 def format_random_access(a):
00090 (path,lineno) = ctrump.get_stmt_loc(a.access_at_stmt)
00091 pp = ctrump.pprint_expr
00092 if a.code == ctrump.RANDOM_ACCESS_POINTER_NOT_INDUCTIVE:
00093 return "%s:%d:'%s' is not inductive."%(path,lineno, pp(a.not_inductive_pointer))
00094 elif a.code == ctrump.RANDOM_ACCESS_COMPLICATED_POINTER:
00095 return "%s:%d:Can't analyze '%s'. too complicated."%(path,lineno, pp(a.complicated_pointer))
00096 elif a.code == ctrump.RANDOM_ACCESS_ARRAY_NOT_INVARIANT:
00097 return "%s:%d:'%s' is not invariant."%(path,lineno, pp(a.array))
00098 elif a.code == ctrump.RANDOM_ACCESS_SUBSCRIPT_NOT_INDUCTIVE:
00099 return "%s:%d:'%s' is not inductive."%(path,lineno, ctrump.format_tree_subscripts(a.subscripts))
00100 elif a.code == ctrump.RANDOM_ACCESS_COMPLICATED_ARRAY:
00101 if a.subscripts:
00102 return "%s:%d:'%s%s' is too complicated."%(path,lineno, ctrump.pprint_expr(a.array),
00103 ctrump.format_tree_subscripts(a.subscripts))
00104 else:
00105 return "%s:%d:'%s' is too complicated."%(path,lineno, ctrump.pprint_expr(a.array))
00106 elif a.code == ctrump.RANDOM_ACCESS_MULTIPLE_SCALED_INDEX:
00107 return "%s:%d:multiple scaled index '%s' and '%s'."(path, lineno,
00108 ctrump.pprint_expr(a.index0),
00109 ctrump.pprint_expr(a.index1))
00110 elif a.code == ctrump.RANDOM_ACCESS_COMPLICATED_SUBSCRIPT:
00111 return "%s:%d:too complicated subscript '%s'."%(path, lineno, ctrump.pprint_expr(a.complicated_subscript))
00112 elif a.code == ctrump.RANDOM_ACCESS_INDEX_VAR_NOT_INDUCTIVE:
00113 return "%s:%d:'%s' is not inductive or invariant."%(path, lineno, a.index_var_not_inductive.name)
00114 else:
00115 return '%s:%d: error.'%(path,lineno)
00116
00117
00118 def format_pdg(pdg):
00119 code = pdg.code
00120 if code == ctrump.PDG_VALUE_REDUCTION:
00121 return 'reduction : += ...' % (pdg.value)
00122 elif code == ctrump.PDG_VALUE_INCREMENTAL:
00123 return 'reduction : ++'
00124 elif code == ctrump.PDG_VALUE_EXPR:
00125 return 'value : %s'%pdg.val
00126 elif code == ctrump.PDG_VALUE_PHI:
00127 return 'phi : (...)'
00128 elif code == ctrump.PDG_VALUE_INITIALIZER:
00129 return 'initializer : ...'
00130 else:
00131 raise Exception('unknown pdg code %d'%code)