def create_dtype_write_subr(self, node): assert node.kgen_stmt, 'None kgen statement' subrname = get_dtype_writename(node.kgen_stmt) if subrname is None: return parent = node.kgen_parent checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine ) and n.name == subrname if not part_has_node(parent, SUBP_PART, checks): checks = lambda n: n.kgen_match_class == statements.Contains if not parent in state_gencore_contains and not part_has_node( parent, CONTAINS_PART, checks): part_append_comment(parent, CONTAINS_PART, '') part_append_gensnode(parent, CONTAINS_PART, statements.Contains) part_append_comment(parent, CONTAINS_PART, '') state_gencore_contains.append(parent) part_append_comment(parent, SUBP_PART, 'read state subroutine for %s' % subrname) attrs = { 'prefix': 'RECURSIVE', 'name': subrname, 'args': ['var', 'kgen_unit', 'printname', 'printvar'] } subrobj = part_append_gensnode(parent, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(parent, SUBP_PART, '') # variable attrs = { 'type_spec': 'TYPE', 'attrspec': ['INTENT(IN)'], 'selector': (None, node.name), 'entity_decls': ['var'] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Type, attrs=attrs) # kgen_unit attrs = { 'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit'] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # printname attrs = { 'type_spec': 'CHARACTER', 'attrspec': ['INTENT(IN)'], 'selector': ('*', None), 'entity_decls': ['printname'] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Character, attrs=attrs) # printvar attrs = { 'type_spec': 'LOGICAL', 'attrspec': ['INTENT(IN)', 'OPTIONAL'], 'selector': (None, None), 'entity_decls': ['printvar'] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Character, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = { 'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8') } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(subrobj, DECL_PART, '') parent_names = [] getinfo('traverse')(node.kgen_stmt.f2003, self.get_extends, parent_names) extends = [] for parent_typename in parent_names: for uname, req in node.kgen_stmt.unknowns.iteritems(): if uname.firstpartname() == parent_typename: if len(req.res_stmts) > 0: extends.extend( get_part(req.res_stmts[0].genspair, TYPE_PART)) break comp_part = get_part(node, TYPE_PART) for item in extends + comp_part: if not hasattr(item, 'kgen_stmt'): continue if not isinstance( item.kgen_stmt, typedecl_statements.TypeDeclarationStatement): continue stmt = item.kgen_stmt entity_names = [ get_entity_name(decl) for decl in stmt.entity_decls ] for entity_name, entity_decl in zip(entity_names, stmt.entity_decls): if is_remove_state(entity_name, stmt): continue node.kgen_stmt.top.used4genstate = True var = stmt.get_variable(entity_name) callname = get_typedecl_writename(stmt, entity_name) if var.is_array(): if stmt.is_derived(): self.create_write_call(subrobj, callname, entity_name, stmt, var) else: # intrinsic type if var.is_explicit_shape_array(): self.create_write_intrinsic( subrobj, entity_name, stmt, var) callname = None else: # implicit array self.create_write_call(subrobj, callname, entity_name, stmt, var) else: # scalar if stmt.is_derived(): if var.is_allocatable() or var.is_pointer(): self.create_write_call(subrobj, callname, entity_name, stmt, var) else: callname = None for uname, req in stmt.unknowns.iteritems(): if uname.firstpartname( ) == stmt.name and len(req.res_stmts) > 0: res = req.res_stmts[0] callname = get_dtype_writename(res) break if callname is None: print 'WARNING: Can not find Type resolver for %s' % stmt.name part_append_comment(subrobj, EXEC_PART, \ 'ERROR: "%s" is not resolved. Call statement to write "%s" is not created here.'%\ (stmt.name, stmt.name)) else: self.create_write_call( subrobj, callname, entity_name, stmt, var) else: # intrinsic type self.create_write_intrinsic( subrobj, entity_name, stmt, var) callname = None if node.kgen_stmt.ancestors( )[0] != item.kgen_stmt.ancestors()[0] and callname: # add use pnode = node.kgen_parent checks = lambda n: n.kgen_match_class==statements.Use and n.kgen_stmt and n.kgen_stmt.isonly and \ callname in n.kgen_stmt.items if ( id(pnode), callname ) not in self.state_created_use_items and not part_has_node( pnode, USE_PART, checks): attrs = { 'name': item.kgen_stmt.ancestors()[0].name, 'isonly': True, 'items': [callname] } part_append_gensnode(pnode, USE_PART, statements.Use, attrs=attrs) self.state_created_use_items.append( (id(pnode), callname)) pnode.kgen_stmt.top.used4genstate = True part_append_comment(subrobj, EXEC_PART, '') # create public stmt if parent.kgen_match_class in [ block_statements.Program, block_statements.Module ]: attrs = {'items': [subrname]} part_append_gensnode(parent, DECL_PART, statements.Public, attrs=attrs)
def create_state_module_parts(self, node): in_subrname = get_module_in_writename(node.kgen_stmt) in_subrobj = None checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine ) and n.name == in_subrname if not part_has_node(node, SUBP_PART, checks): checks = lambda n: n.kgen_match_class == statements.Contains if not node in state_gencore_contains and not part_has_node( node, CONTAINS_PART, checks): part_append_comment(node, CONTAINS_PART, '') part_append_gensnode(node, CONTAINS_PART, statements.Contains) part_append_comment(node, CONTAINS_PART, '') state_gencore_contains.append(node) attrs = {'name': in_subrname, 'args': ['kgen_unit']} part_append_comment( node, SUBP_PART, 'write in state subroutine for %s' % in_subrname) in_subrobj = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') # kgen_unit attrs = { 'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit'] } part_append_gensnode(in_subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(in_subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = { 'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8') } part_append_gensnode(in_subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(in_subrobj, DECL_PART, '') # add public stmt attrs = {'items': [in_subrname]} part_append_gensnode(node, DECL_PART, statements.Public, attrs=attrs) out_subrobj = None if hasattr(node.kgen_stmt, 'geninfo') and KGGenType.has_state_out( node.kgen_stmt.geninfo): out_subrname = get_module_out_writename(node.kgen_stmt) checks = lambda n: isinstance(n.kgen_stmt, block_statements. Subroutine ) and n.name == out_subrname if not part_has_node(node, SUBP_PART, checks): checks = lambda n: n.kgen_match_class == statements.Contains if not node in state_gencore_contains and not part_has_node( node, CONTAINS_PART, checks): part_append_comment(node, CONTAINS_PART, '') part_append_gensnode(node, CONTAINS_PART, statements.Contains) part_append_comment(node, CONTAINS_PART, '') state_gencore_contains.append(node) attrs = {'name': out_subrname, 'args': ['kgen_unit']} part_append_comment( node, SUBP_PART, 'write out state subroutine for %s' % out_subrname) out_subrobj = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') # kgen_unit attrs = { 'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit'] } part_append_gensnode(out_subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # kgen_istrue attrs = { 'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue'] } part_append_gensnode(out_subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = { 'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8') } part_append_gensnode(out_subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(out_subrobj, DECL_PART, '') # add public stmt attrs = {'items': [out_subrname]} part_append_gensnode(node, DECL_PART, statements.Public, attrs=attrs) if in_subrobj or out_subrobj: self.state_externs_subrs[node] = (in_subrobj, out_subrobj) node.kgen_stmt.top.used4genstate = True # register event per typedecl self.frame_msg.add_event(KERNEL_SELECTION.ALL, FILE_TYPE.STATE, GENERATION_STAGE.BEGIN_PROCESS, \ typedecl_statements.TypeDeclarationStatement, self.is_extern_in_state_module, self.create_subr_write_typedecl_in_module) # register event per module self.frame_msg.add_event(KERNEL_SELECTION.ALL, FILE_TYPE.STATE, GENERATION_STAGE.BEGIN_PROCESS, \ block_statements.Module, self.has_externs_in_module, self.create_state_stmts_in_callsite) else: raise Exception( 'Dupulicated state extern subroutine name for module: %s. Please ensure that KGen-generated source file NOT re-used.' % node.name)
def create_parentblock_parts(self, node): namedpart_link_part(node, STATE_PBLOCK_USE_PART, USE_PART) namedpart_link_part(node, STATE_PBLOCK_DECL_PART, DECL_PART) namedpart_link_part(node, STATE_PBLOCK_EXEC_PART, EXEC_PART) namedpart_link_part(node, STATE_PBLOCK_CONTAINS_PART, CONTAINS_PART) namedpart_link_part(node, STATE_PBLOCK_SUBP_PART, SUBP_PART) #attrs = {'name':'IEEE_ARITHMETIC', 'nature': 'INTRINSIC', 'isonly': True, 'items':['ieee_is_normal']} #namedpart_append_gensnode(node.kgen_kernel_id, STATE_PBLOCK_USE_PART, statements.Use, attrs=attrs) # ensure contains checks = lambda n: n.kgen_match_class==statements.Contains if not node in state_gencore_contains and not part_has_node(node, CONTAINS_PART, checks): part_append_comment(node, CONTAINS_PART, '') part_append_gensnode(node, CONTAINS_PART, statements.Contains) part_append_comment(node, CONTAINS_PART, '') state_gencore_contains.append(node) #SUBROUTINE kgen_init_vars attrs = {'name': 'kgen_init_vars', 'args': ['mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'invoke_e', 'msize', \ 'osize', 'lockpath', 'last_invoke', 'isstop']} initvarsubr = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': \ ['mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'invoke_e', 'msize', 'osize'], } part_append_gensnode(initvarsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(OUT)', 'DIMENSION(0:osize-1)'], 'entity_decls': ['last_invoke']} part_append_gensnode(initvarsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'LOGICAL', 'attrspec': ['INTENT(OUT)', 'DIMENSION(0:msize-1,0:osize-1)'], 'entity_decls': ['isstop']} part_append_gensnode(initvarsubr, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'CHARACTER', 'attrspec': ['INTENT(OUT)', 'DIMENSION(0:msize-1,0:osize-1)'], \ 'entity_decls': ['lockpath'], 'selector':('1024', None)} part_append_gensnode(initvarsubr, DECL_PART, typedecl_statements.Character, attrs=attrs) attrs = {'type_spec': 'INTEGER', 'entity_decls': ['mpi_idx', 'openmp_idx', 'temp_unit', 'ierr']} part_append_gensnode(initvarsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'loopcontrol': 'mpi_idx=mpi_s,mpi_e'} dompi = part_append_gensnode(initvarsubr, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'loopcontrol': 'openmp_idx=omp_s,omp_e'} doopenmp = part_append_gensnode(dompi, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'specs': [ 'lockpath(mpi_idx, openmp_idx)', 'FMT="(A,I0,A,I0)"'], \ 'items': ['"%s/done."'%getinfo('kernel_path'), 'mpi_idx', '"."', 'openmp_idx']} part_append_gensnode(doopenmp, EXEC_PART, statements.Write, attrs=attrs) attrs = {'variable': 'isstop(mpi_idx, openmp_idx)', 'sign': '=', 'expr': '.FALSE.'} part_append_gensnode(doopenmp, EXEC_PART, statements.Assignment, attrs=attrs) attrs = {'variable': 'last_invoke(openmp_idx)', 'sign': '=', 'expr': 'MAX( last_invoke(openmp_idx), invoke_e)'} part_append_gensnode(doopenmp, EXEC_PART, statements.Assignment, attrs=attrs) attrs = {'specs': ['NEWUNIT=temp_unit', 'FILE=lockpath(mpi_idx, openmp_idx)', 'STATUS="OLD"', 'IOSTAT=ierr']} part_append_gensnode(doopenmp, EXEC_PART, statements.Open, attrs=attrs) attrs = {'expr': 'ierr .EQ. 0'} ifopenmp = part_append_gensnode(doopenmp, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'specs': [ 'UNIT=temp_unit', 'STATUS="DELETE"' ]} part_append_gensnode(ifopenmp, EXEC_PART, statements.Close, attrs=attrs) #SUBROUTINE kgen_check_save attrs = {'name': 'kgen_check_save', 'args': ['mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'invoke_s', 'invoke_e', 'mymid', \ 'myoid', 'osize', 'invoke', 'last_invoke', 'issave', 'islast']} checksavesubr = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': \ ['mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'invoke_s', 'invoke_e', 'osize', 'mymid', 'myoid'], } part_append_gensnode(checksavesubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)', 'DIMENSION(0:osize-1)'], 'entity_decls': ['invoke', 'last_invoke']} part_append_gensnode(checksavesubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'LOGICAL', 'attrspec': ['INTENT(OUT)', 'DIMENSION(0:osize-1)'], 'entity_decls': ['issave', 'islast']} part_append_gensnode(checksavesubr, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'expr': '(mymid .GE. mpi_s) .AND. (mymid .LE. mpi_e)'} ifmpi = part_append_gensnode(checksavesubr, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'expr': '(myoid .GE. omp_s) .AND. (myoid .LE. omp_e)'} ifopenmp = part_append_gensnode(ifmpi, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'expr': '(invoke(myoid) .GE. invoke_s) .AND. (invoke(myoid) .LE. invoke_e)'} ifinvoke = part_append_gensnode(ifopenmp, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'variable': 'issave(myoid)', 'sign': '=', 'expr': '.TRUE.'} part_append_gensnode(ifinvoke, EXEC_PART, statements.Assignment, attrs=attrs) attrs = {'expr': 'invoke(myoid) .GE. last_invoke(myoid)'} iflast = part_append_gensnode(ifopenmp, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'variable': 'islast(myoid)', 'sign': '=', 'expr': '.TRUE.'} part_append_gensnode(iflast, EXEC_PART, statements.Assignment, attrs=attrs) #SUBROUTINE kgen_check_stop attrs = {'name': 'kgen_check_stop', 'args': ['mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'msize', \ 'osize', 'myoid', 'lockpath', 'isstop']} checkstopsubr = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': \ ['mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'msize', 'osize', 'myoid'] } part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) #attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['isexist', 'isopened'] } #part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'CHARACTER', 'attrspec': ['INTENT(IN)', 'DIMENSION(0:msize-1,0:osize-1)'], \ 'entity_decls': ['lockpath'], 'selector':('1024', None)} part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Character, attrs=attrs) attrs = {'type_spec': 'LOGICAL', 'attrspec': ['INTENT(OUT)', 'DIMENSION(0:msize-1,0:osize-1)'], 'entity_decls': ['isstop']} part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'INTEGER', 'entity_decls': ['mpi_idx', 'openmp_idx', 'ierr', 'myunit']} part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'loopcontrol': 'mpi_idx=mpi_s,mpi_e'} dompi = part_append_gensnode(checkstopsubr, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'loopcontrol': 'openmp_idx=omp_s,omp_e'} doopenmp = part_append_gensnode(dompi, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'expr': '.NOT. isstop(mpi_idx, openmp_idx)'} ifstop = part_append_gensnode(doopenmp, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'specs': ['NEWUNIT=myunit', 'FILE=TRIM(ADJUSTL(lockpath(mpi_idx, openmp_idx)))', \ 'STATUS="OLD"', 'ACTION="READ"', 'IOSTAT=ierr']} part_append_gensnode(ifstop, EXEC_PART, statements.Open, attrs=attrs) attrs = {'expr': 'ierr .EQ. 0'} ifopen = part_append_gensnode(ifstop, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'variable': 'isstop(mpi_idx, openmp_idx)', 'sign': '=', 'expr': '.TRUE.'} part_append_gensnode(ifopen, EXEC_PART, statements.Assignment, attrs=attrs) attrs = {'specs': [ 'UNIT=myunit' ]} part_append_gensnode(ifopen, EXEC_PART, statements.Close, attrs=attrs) #SUBROUTINE kgen_write_list attrs = {'name': 'kgen_write_list', 'args': ['myunit', 'mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'invoke_s', 'invoke_e']} checkstopsubr = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': \ ['myunit', 'mpi_s', 'mpi_e', 'omp_s', 'omp_e', 'invoke_s', 'invoke_e'] } part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'INTEGER', 'entity_decls': ['mpi_idx', 'openmp_idx', 'invoke_idx', 'temp_unit', 'ierr']} part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'CHARACTER', 'selector': ( '16', None ), 'entity_decls': ['mpi_str', 'openmp_str', 'invoke_str']} part_append_gensnode(checkstopsubr, DECL_PART, typedecl_statements.Character, attrs=attrs) attrs = {'loopcontrol': 'mpi_idx=mpi_s,mpi_e'} dompi = part_append_gensnode(checkstopsubr, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'specs': ['mpi_str', '"(I16)"'], 'items': [ 'mpi_idx' ]} part_append_gensnode(dompi, EXEC_PART, statements.Write, attrs=attrs) attrs = {'loopcontrol': 'openmp_idx=omp_s,omp_e'} doopenmp = part_append_gensnode(dompi, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'specs': ['openmp_str', '"(I16)"'], 'items': [ 'openmp_idx' ]} part_append_gensnode(doopenmp, EXEC_PART, statements.Write, attrs=attrs) attrs = {'loopcontrol': 'invoke_idx=invoke_s,invoke_e'} doinvoke = part_append_gensnode(doopenmp, EXEC_PART, block_statements.Do, attrs=attrs) attrs = {'specs': ['invoke_str', '"(I16)"'], 'items': [ 'invoke_idx' ]} part_append_gensnode(doinvoke, EXEC_PART, statements.Write, attrs=attrs) attrs = {'specs': ['UNIT = myunit', 'FMT="(A)"'], 'items': ['"%s." // TRIM(ADJUSTL(mpi_str)) // "." \ // TRIM(ADJUSTL(openmp_str)) // "." // TRIM(ADJUSTL(invoke_str))'%getinfo('kernel_name')]} part_append_gensnode(doinvoke, EXEC_PART, statements.Write, attrs=attrs) attrs = {'specs': ['NEWUNIT=temp_unit', 'FILE="%s/done." // TRIM(ADJUSTL(mpi_str)) // "." // TRIM(ADJUSTL(openmp_str))'% \ getinfo('kernel_path'), 'STATUS="OLD"', 'IOSTAT=ierr']} part_append_gensnode(doopenmp, EXEC_PART, statements.Open, attrs=attrs) attrs = {'expr': 'ierr .EQ. 0'} ifopenmp = part_append_gensnode(doopenmp, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'specs': [ 'UNIT=temp_unit', 'STATUS="DELETE"' ]} part_append_gensnode(ifopenmp, EXEC_PART, statements.Close, attrs=attrs) #SUBROUTINE kgen_error_stop( ierr, errmsg ) attrs = {'name': 'kgen_error_stop', 'args': ['ierr', 'errmsg']} stopsubr = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['ierr']} part_append_gensnode(stopsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'type_spec': 'CHARACTER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['errmsg'], 'selector':('*', None)} part_append_gensnode(stopsubr, DECL_PART, typedecl_statements.Character, attrs=attrs) if getinfo('is_mpi_app'): attrs = {'type_spec': 'INTEGER', 'entity_decls': ['kgen_ierr']} part_append_gensnode(stopsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'expr': 'ierr /= 0'} iferr = part_append_gensnode(stopsubr, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'items': ['errmsg']} part_append_gensnode(iferr, EXEC_PART, statements.Write, attrs=attrs) if getinfo('is_mpi_app'): attrs = {'designator': 'mpi_abort', 'items': [getinfo('mpi_comm'), '0', 'kgen_ierr']} part_append_gensnode(iferr, EXEC_PART, statements.Call, attrs=attrs) else: attrs = {'code': '1'} part_append_gensnode(iferr, EXEC_PART, statements.Stop, attrs=attrs) #SUBROUTINE kgen_print_counter( counter ) attrs = {'name': 'kgen_print_counter', 'args': ['counter']} cntsubr = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['counter']} part_append_gensnode(cntsubr, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = {'items': ['"KGEN writes input state variables at count = "', 'counter']} part_append_gensnode(cntsubr, EXEC_PART, statements.Write, attrs=attrs)
def create_write_subr(self, subrname, entity_name, parent, var, stmt): checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine ) and n.name == subrname if subrname not in self.state_created_subrs and not part_has_node( parent, SUBP_PART, checks): if is_remove_state(entity_name, stmt): return self.state_created_subrs.append(subrname) checks = lambda n: n.kgen_match_class == statements.Contains if not parent in state_gencore_contains and not part_has_node( parent, CONTAINS_PART, checks): part_append_comment(parent, CONTAINS_PART, '') part_append_gensnode(parent, CONTAINS_PART, statements.Contains) part_append_comment(parent, CONTAINS_PART, '') state_gencore_contains.append(parent) part_append_comment(parent, SUBP_PART, 'write state subroutine for %s' % subrname) attrs = { 'name': subrname, 'args': ['var', 'kgen_unit', 'printvar'] } subrobj = part_append_gensnode(parent, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(parent, SUBP_PART, '') parent.kgen_stmt.top.used4genstate = True # variable A #import pdb; pdb.set_trace() attrspec = ['INTENT(IN)'] if var.is_allocatable(): attrspec.append('ALLOCATABLE') if var.is_pointer(): attrspec.append('POINTER') if var.is_array(): attrspec.append('DIMENSION(%s)' % ','.join(':' * var.rank)) attrs = { 'type_spec': stmt.__class__.__name__.upper(), 'attrspec': attrspec, 'selector': stmt.selector, 'entity_decls': ['var'] } part_append_gensnode(subrobj, DECL_PART, stmt.__class__, attrs=attrs) # kgen_unit attrs = { 'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit'] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # printvar attrs = { 'type_spec': 'CHARACTER', 'attrspec': ['INTENT(IN)', 'OPTIONAL'], 'selector': ('*', None), 'entity_decls': ['printvar'] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Character, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) # array index A if var.is_array(): attrs = { 'type_spec': 'INTEGER', 'entity_decls': ['idx%d' % (d + 1) for d in range(var.rank)] } part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) attrs = { 'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8') } part_append_genknode(subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(subrobj, DECL_PART, '') pobj = gen_write_istrue(subrobj, var, 'var') if var.is_array(): for dim in range(var.rank): attrs = { 'items': ['LBOUND(var, %d)' % (dim + 1)], 'specs': ['UNIT = kgen_unit'] } part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) attrs = { 'items': ['UBOUND(var, %d)' % (dim + 1)], 'specs': ['UNIT = kgen_unit'] } part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) if stmt.is_derived(): indexes = ['idx%d' % (d + 1) for d in range(var.rank)] str_indexes = ','.join(indexes) #tostr_indexes = ','.join([ 'kgen_tostr(idx)' for idx in indexes]) prevobj = pobj doobjs = [] for d in range(var.rank): attrs = { 'loopcontrol': 'idx%(d)d=LBOUND(var,%(d)d), UBOUND(var,%(d)d)' % { 'd': d + 1 } } doobj = part_append_gensnode(prevobj, EXEC_PART, block_statements.Do, attrs=attrs) doobjs.append(doobj) prevobj = doobj attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode(doobjs[-1], EXEC_PART, block_statements.IfThen, attrs=attrs) callname = None for uname, req in stmt.unknowns.iteritems(): if uname.firstpartname() == stmt.name and len( req.res_stmts) > 0: res = req.res_stmts[0] callname = get_dtype_writename(res) break if callname is None: print 'WARNING: Can not find Type resolver for %s' % stmt.name part_append_comment(ifpvarobj, EXEC_PART, \ 'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\ (stmt.name, stmt.name)) else: #attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit', 'printvar // "(", %s, ")"'%tostr_indexes]} attrs = { 'designator': callname, 'items': [ 'var(%s)' % str_indexes, 'kgen_unit', 'printvar // "(%s)"' % str_indexes ] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) part_append_gensnode(ifpvarobj, EXEC_PART, statements.Else) if any( match_namepath(pattern, pack_exnamepath( stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): #attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit', '"%s(", %s, ")"'%(entity_name, tostr_indexes)]} attrs = { 'designator': callname, 'items': [ 'var(%s)' % str_indexes, 'kgen_unit', '"%s(%s)"' % (entity_name, str_indexes) ] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: attrs = { 'designator': callname, 'items': ['var(%s)' % str_indexes, 'kgen_unit'] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: # intrinsic type attrs = {'items': ['var'], 'specs': ['UNIT = kgen_unit']} part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) if any( match_namepath(pattern, pack_exnamepath(stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): if stmt.is_numeric() and var.is_array(): attrs = { 'items': [ '"** KGEN DEBUG: " // "REAL(SUM(%s), 8) **"' % entity_name, 'REAL(SUM(var), 8)' ] } else: attrs = { 'items': [ '"** KGEN DEBUG: " // "%s **" // NEW_LINE("A")' % entity_name, 'var' ] } part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) else: attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode( pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) if stmt.is_numeric() and var.is_array(): attrs = { 'items': [ '"** KGEN DEBUG: REAL(SUM(" // printvar // "), 8) **"', 'REAL(SUM(var), 8)' ] } else: attrs = { 'items': [ '"** KGEN DEBUG: " // printvar // " **" // NEW_LINE("A")', 'var' ] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Write, attrs=attrs) else: # scalar if stmt.is_derived(): attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode(pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) callname = None for uname, req in stmt.unknowns.iteritems(): if uname.firstpartname() == stmt.name and len( req.res_stmts) > 0: res = req.res_stmts[0] callname = get_dtype_writename(res) break if callname is None: print 'WARNING: Can not find Type resolver for %s' % stmt.name part_append_comment(ifpvarobj, EXEC_PART, \ 'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\ (stmt.name, stmt.name)) else: attrs = { 'designator': callname, 'items': [ 'var', 'kgen_unit', 'printvar // " %s "' % entity_name ] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) part_append_gensnode(ifpvarobj, EXEC_PART, statements.Else) if any( match_namepath(pattern, pack_exnamepath( stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): attrs = { 'designator': callname, 'items': ['var', 'kgen_unit', '"%s"' % entity_name] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: attrs = { 'designator': callname, 'items': ['var', 'kgen_unit'] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: # intrinsic type attrs = {'items': ['var'], 'specs': ['UNIT = kgen_unit']} part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) if any( match_namepath(pattern, pack_exnamepath(stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): attrs = { 'items': [ '"** KGEN DEBUG: " // "%s **"' % entity_name, 'var' ] } part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) else: attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode( pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = { 'items': ['"** KGEN DEBUG: " // printvar // " **"', 'var'] } part_append_gensnode(ifpvarobj, EXEC_PART, statements.Write, attrs=attrs)
def create_write_subr(subrname, entity_name, parent, var, stmt, implicit=False): checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine) and n.name==subrname is_class_derived = check_class_derived(stmt) if not part_has_node(parent, SUBP_PART, checks): checks = lambda n: n.kgen_match_class==statements.Contains if not parent in state_gencore_contains and not part_has_node(parent, CONTAINS_PART, checks): part_append_comment(parent, CONTAINS_PART, '') part_append_gensnode(parent, CONTAINS_PART, statements.Contains) part_append_comment(parent, CONTAINS_PART, '') state_gencore_contains.append(parent) part_append_comment(parent, SUBP_PART, 'write state subroutine for %s'%subrname) attrs = {'name': subrname, 'args': ['var', 'kgen_unit', 'printvar']} subrobj = part_append_gensnode(parent, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(parent, SUBP_PART, '') parent.kgen_stmt.top.used4genstate = True # variable A #import pdb; pdb.set_trace() attrspec = ['INTENT(IN)'] if var.is_pointer(): attrspec.append('POINTER') if var.is_allocatable(): attrspec.append('ALLOCATABLE') if var.is_array(): attrspec.append('DIMENSION(%s)'% ','.join(':'*var.rank)) attrs = {'type_spec': stmt.__class__.__name__.upper(), 'attrspec': attrspec, 'selector':stmt.selector, 'entity_decls': ['var']} part_append_gensnode(subrobj, DECL_PART, stmt.__class__, attrs=attrs) # kgen_unit attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # printvar attrs = {'type_spec': 'CHARACTER', 'attrspec': ['INTENT(IN)', 'OPTIONAL'], 'selector':('*', None), 'entity_decls': ['printvar']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Character, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8')} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) # array index A if var.is_array(): attrs = {'type_spec': 'INTEGER', 'entity_decls': [ 'idx%d'%(d+1) for d in range(var.rank) ]} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) part_append_comment(subrobj, DECL_PART, '') pobj = gen_write_istrue(subrobj, var, 'var') part_append_comment(subrobj, EXEC_PART, '') if var.is_array(): for dim in range(var.rank): attrs = {'items': ['LBOUND(var, %d)'%(dim+1)], 'specs': ['UNIT = kgen_unit']} part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) attrs = {'items': ['UBOUND(var, %d)'%(dim+1)], 'specs': ['UNIT = kgen_unit']} part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) if stmt.is_derived() or is_class_derived: indexes = [ 'idx%d'%(d+1) for d in range(var.rank) ] str_indexes = ','.join(indexes) #tostr_indexes = ','.join([ 'kgen_tostr(idx)' for idx in indexes]) prevobj = pobj doobjs = [] for d in range(var.rank): attrs = {'loopcontrol': 'idx%(d)d=LBOUND(var,%(d)d), UBOUND(var,%(d)d)'%{'d':d+1}} doobj = part_append_gensnode(prevobj, EXEC_PART, block_statements.Do, attrs=attrs) doobjs.append(doobj) prevobj = doobj attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode(doobjs[-1], EXEC_PART, block_statements.IfThen, attrs=attrs) callname = None for uname, req in stmt.unknowns.iteritems(): if ( is_class_derived and uname.firstpartname()==stmt.selector[1]) or uname.firstpartname()==stmt.name: #if uname.firstpartname()==stmt.name: if len(req.res_stmts)>0: res = req.res_stmts[0] callname = get_dtype_writename(res) break if callname is None: print 'WARNING: Can not find Type resolver for %s'%stmt.name part_append_comment(ifpvarobj, EXEC_PART, \ 'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\ (stmt.name, stmt.name)) else: #attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit', 'printvar // "(", %s, ")"'%tostr_indexes]} attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit', 'printvar // "(%s)"'%str_indexes]} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) part_append_gensnode(ifpvarobj, EXEC_PART, statements.Else) if any(match_namepath(pattern, pack_exnamepath(stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): #attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit', '"%s(", %s, ")"'%(entity_name, tostr_indexes)]} attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit', '"%s(%s)"'%(entity_name, str_indexes)]} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: attrs = {'designator': callname, 'items': ['var(%s)'%str_indexes, 'kgen_unit']} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: # intrinsic type attrs = {'items': ['var'], 'specs': ['UNIT = kgen_unit']} part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode(pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'items': ['"** KGEN DEBUG: " // printvar // "**" // NEW_LINE("A")', 'var']} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Write, attrs=attrs) # # part_append_gensnode(ifpvarobj, EXEC_PART, statements.Else) # # if any(match_namepath(pattern, pack_exnamepath(stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): # if stmt.is_numeric(): # attrs = {'items': ['"** KGEN DEBUG: " // "%s **"'%entity_name, 'SUM(var)']} # else: # attrs = {'items': ['"** KGEN DEBUG: " // "%s **" // NEW_LINE("A")'%entity_name, 'var']} # part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) # else: # attrs = {'expr': 'PRESENT( printvar )'} # ifpvarobj = part_append_gensnode(pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) # # if stmt.is_numeric(): # attrs = {'items': ['"** KGEN DEBUG: " // printvar // " %s **"'%entity_name, 'SUM(var)']} # else: # attrs = {'items': ['"** KGEN DEBUG: " // printvar // " %s **" // NEW_LINE("A")'%entity_name, 'var']} # part_append_gensnode(ifpvarobj, EXEC_PART, statements.Write, attrs=attrs) else: # scalar if stmt.is_derived() or is_class_derived: callname = None for uname, req in stmt.unknowns.iteritems(): if ( is_class_derived and uname.firstpartname()==stmt.selector[1]) or uname.firstpartname()==stmt.name: #if uname.firstpartname()==stmt.name: if len(req.res_stmts)>0: res = req.res_stmts[0] callname = get_dtype_writename(res) break if callname is None: print 'WARNING: Can not find Type resolver for %s'%stmt.name part_append_comment(pobj, EXEC_PART, \ 'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\ (stmt.name, stmt.name)) else: attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode(pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'designator': callname, 'items': ['var', 'kgen_unit', 'printvar // " %s "'%entity_name]} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) part_append_gensnode(ifpvarobj, EXEC_PART, statements.Else) if any(match_namepath(pattern, pack_exnamepath(stmt, entity_name), internal=False) for pattern in getinfo('print_var_names')): attrs = {'designator': callname, 'items': ['var', 'kgen_unit', '"%s"'%entity_name]} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: attrs = {'designator': callname, 'items': ['var', 'kgen_unit']} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Call, attrs=attrs) else: # intrinsic type attrs = {'items': ['var'], 'specs': ['UNIT = kgen_unit']} part_append_gensnode(pobj, EXEC_PART, statements.Write, attrs=attrs) attrs = {'expr': 'PRESENT( printvar )'} ifpvarobj = part_append_gensnode(pobj, EXEC_PART, block_statements.IfThen, attrs=attrs) attrs = {'items': ['"** KGEN DEBUG: " // printvar // "**" // NEW_LINE("A")', 'var']} part_append_gensnode(ifpvarobj, EXEC_PART, statements.Write, attrs=attrs)
def create_state_module_parts(self, node): in_subrname = get_module_in_writename(node.kgen_stmt) in_subrobj = None checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine) and n.name==in_subrname if not part_has_node(node, SUBP_PART, checks): checks = lambda n: n.kgen_match_class==statements.Contains if not node in state_gencore_contains and not part_has_node(node, CONTAINS_PART, checks): part_append_comment(node, CONTAINS_PART, '') part_append_gensnode(node, CONTAINS_PART, statements.Contains) part_append_comment(node, CONTAINS_PART, '') state_gencore_contains.append(node) attrs = {'name': in_subrname, 'args': ['kgen_unit']} part_append_comment(node, SUBP_PART, 'write in state subroutine for %s'%in_subrname) in_subrobj = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') # kgen_unit attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit']} part_append_gensnode(in_subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(in_subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8')} part_append_gensnode(in_subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(in_subrobj, DECL_PART, '') # add public stmt attrs = {'items':[in_subrname]} part_append_gensnode(node, DECL_PART, statements.Public, attrs=attrs) out_subrobj = None if hasattr(node.kgen_stmt, 'geninfo') and KGGenType.has_state_out(node.kgen_stmt.geninfo): out_subrname = get_module_out_writename(node.kgen_stmt) checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine) and n.name==out_subrname if not part_has_node(node, SUBP_PART, checks): checks = lambda n: n.kgen_match_class==statements.Contains if not node in state_gencore_contains and not part_has_node(node, CONTAINS_PART, checks): part_append_comment(node, CONTAINS_PART, '') part_append_gensnode(node, CONTAINS_PART, statements.Contains) part_append_comment(node, CONTAINS_PART, '') state_gencore_contains.append(node) attrs = {'name': out_subrname, 'args': ['kgen_unit']} part_append_comment(node, SUBP_PART, 'write out state subroutine for %s'%out_subrname) out_subrobj = part_append_gensnode(node, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(node, SUBP_PART, '') # kgen_unit attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit']} part_append_gensnode(out_subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(out_subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8')} part_append_gensnode(out_subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(out_subrobj, DECL_PART, '') # add public stmt attrs = {'items':[out_subrname]} part_append_gensnode(node, DECL_PART, statements.Public, attrs=attrs) if in_subrobj or out_subrobj: self.state_externs_subrs[node] = (in_subrobj, out_subrobj) node.kgen_stmt.top.used4genstate = True # register event per typedecl self.frame_msg.add_event(KERNEL_SELECTION.ALL, FILE_TYPE.STATE, GENERATION_STAGE.BEGIN_PROCESS, \ typedecl_statements.TypeDeclarationStatement, self.is_extern_in_state_module, self.create_subr_write_typedecl_in_module) # register event per module self.frame_msg.add_event(KERNEL_SELECTION.ALL, FILE_TYPE.STATE, GENERATION_STAGE.BEGIN_PROCESS, \ block_statements.Module, self.has_externs_in_module, self.create_state_stmts_in_callsite) else: raise Exception('Dupulicated state extern subroutine name for module: %s. Please ensure that KGen-generated source file NOT re-used.'%node.name)
def create_dtype_write_subr(self, node): assert node.kgen_stmt, 'None kgen statement' subrname = get_dtype_writename(node.kgen_stmt) if subrname is None: return parent = node.kgen_parent checks = lambda n: isinstance(n.kgen_stmt, block_statements.Subroutine) and n.name==subrname if not part_has_node(parent, SUBP_PART, checks): checks = lambda n: n.kgen_match_class==statements.Contains if not parent in state_gencore_contains and not part_has_node(parent, CONTAINS_PART, checks): part_append_comment(parent, CONTAINS_PART, '') part_append_gensnode(parent, CONTAINS_PART, statements.Contains) part_append_comment(parent, CONTAINS_PART, '') state_gencore_contains.append(parent) part_append_comment(parent, SUBP_PART, 'read state subroutine for %s'%subrname) attrs = {'prefix': 'RECURSIVE', 'name': subrname, 'args': ['var', 'kgen_unit', 'printvar']} subrobj = part_append_gensnode(parent, SUBP_PART, block_statements.Subroutine, attrs=attrs) part_append_comment(parent, SUBP_PART, '') # variable attrs = {'type_spec': 'TYPE', 'attrspec': ['INTENT(IN)'], 'selector':(None, node.name), 'entity_decls': ['var']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Type, attrs=attrs) # kgen_unit attrs = {'type_spec': 'INTEGER', 'attrspec': ['INTENT(IN)'], 'entity_decls': ['kgen_unit']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Integer, attrs=attrs) # printvar attrs = {'type_spec': 'CHARACTER', 'attrspec': ['INTENT(IN)', 'OPTIONAL'], 'selector':('*', None), 'entity_decls': ['printvar']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Character, attrs=attrs) # kgen_istrue attrs = {'type_spec': 'LOGICAL', 'entity_decls': ['kgen_istrue']} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Logical, attrs=attrs) attrs = {'type_spec': 'REAL', 'entity_decls': ['kgen_array_sum'], 'selector': (None, '8')} part_append_gensnode(subrobj, DECL_PART, typedecl_statements.Real, attrs=attrs) part_append_comment(subrobj, DECL_PART, '') #comp_part = get_part(node, TYPE_COMP_PART) comp_part = get_part(node, TYPE_PART) for item in comp_part: if not hasattr(item, 'kgen_stmt'): continue if not isinstance(item.kgen_stmt, typedecl_statements.TypeDeclarationStatement): continue stmt = item.kgen_stmt entity_names = [ get_entity_name(decl) for decl in stmt.entity_decls ] for entity_name, entity_decl in zip(entity_names, stmt.entity_decls): if is_remove_state(entity_name, stmt): continue node.kgen_stmt.top.used4genstate = True var = stmt.get_variable(entity_name) callname = get_typedecl_writename(stmt, entity_name) if var.is_array(): if stmt.is_derived(): self.create_write_call(subrobj, callname, entity_name, stmt, var) else: # intrinsic type if var.is_explicit_shape_array(): self.create_write_intrinsic(subrobj, entity_name, stmt, var) else: # implicit array self.create_write_call(subrobj, callname, entity_name, stmt, var) else: # scalar if stmt.is_derived(): if var.is_allocatable() or var.is_pointer(): self.create_write_call(subrobj, callname, entity_name, stmt, var) else: callname = None for uname, req in stmt.unknowns.iteritems(): if uname.firstpartname()==stmt.name and len(req.res_stmts)>0: res = req.res_stmts[0] callname = get_dtype_writename(res) break if callname is None: print 'WARNING: Can not find Type resolver for %s'%stmt.name part_append_comment(subrobj, EXEC_PART, \ 'ERROR: "%s" is not resolved. Call statement to write "%s" is not created here.'%\ (stmt.name, stmt.name)) else: self.create_write_call(subrobj, callname, entity_name, stmt, var) else: # intrinsic type self.create_write_intrinsic(subrobj, entity_name, stmt, var) part_append_comment(subrobj, EXEC_PART, '') # create public stmt if parent.kgen_match_class in [ block_statements.Program, block_statements.Module ]: attrs = {'items': [subrname]} part_append_gensnode(parent, DECL_PART, statements.Public, attrs=attrs)