コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
ファイル: gen_typedecl_in_type.py プロジェクト: ydjung11/KGen
    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)
コード例 #5
0
ファイル: gencore_subr.py プロジェクト: NCAR/KGen
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)
コード例 #6
0
ファイル: gen_typedecl_in_module.py プロジェクト: NCAR/KGen
    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)
コード例 #7
0
ファイル: gen_type.py プロジェクト: NCAR/KGen
    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)