Ejemplo n.º 1
0
    def create_subr_write_typedecl_in_module(self, node):
        parent = node.kgen_parent
        stmt = node.kgen_stmt

        raw_entity_names = set([
            uname.firstpartname()
            for uname, req in KGGenType.get_state(stmt.geninfo)
        ])
        entity_names = [
            e for e in raw_entity_names
            if not stmt.get_variable(e).is_parameter()
        ]

        raw_out_entity_names = set([
            uname.firstpartname()
            for uname, req in KGGenType.get_state_out(stmt.geninfo)
        ])
        out_entity_names = [
            e for e in raw_out_entity_names
            if not stmt.get_variable(e).is_parameter()
        ]

        #entity_names = set([ uname.firstpartname() for uname, req in KGGenType.get_state(stmt.geninfo)])
        #out_entity_names = set([ uname.firstpartname() for uname, req in KGGenType.get_state_out(stmt.geninfo)])

        is_class_derived = check_class_derived(stmt)

        for entity_name, entity_decl in zip(entity_names, stmt.entity_decls):
            if node.kgen_parent.name + entity_name in self.state_extern_writes:
                continue
            if is_remove_state(entity_name, stmt): continue

            self.state_extern_writes.append(node.kgen_parent.name +
                                            entity_name)

            var = stmt.get_variable(entity_name)
            subrname = get_typedecl_writename(stmt, entity_name)

            if var.is_array():
                if is_zero_array(var, stmt): continue
                if stmt.is_derived() or is_class_derived:
                    self.create_write_call(
                        self.state_externs_subrs[node.kgen_parent][0],
                        subrname, entity_name, stmt, var)
                    if entity_name in out_entity_names:
                        self.create_write_call(
                            self.state_externs_subrs[node.kgen_parent][1],
                            subrname, entity_name, stmt, var)
                    if subrname not in self.state_created_subrs:
                        create_write_subr(subrname, entity_name, parent, var,
                                          stmt)
                        self.state_created_subrs.append(subrname)
                else:  # intrinsic type
                    if var.is_explicit_shape_array():
                        self.create_write_intrinsic(
                            self.state_externs_subrs[node.kgen_parent][0],
                            entity_name, stmt, var)
                        if entity_name in out_entity_names:
                            self.create_write_intrinsic(
                                self.state_externs_subrs[node.kgen_parent][1],
                                entity_name, stmt, var)
                    else:  # implicit array
                        self.create_write_call(
                            self.state_externs_subrs[node.kgen_parent][0],
                            subrname, entity_name, stmt, var)
                        if entity_name in out_entity_names:
                            self.create_write_call(
                                self.state_externs_subrs[node.kgen_parent][1],
                                subrname, entity_name, stmt, var)
                        if subrname not in self.state_created_subrs:
                            create_write_subr(subrname, entity_name, parent,
                                              var, stmt)
                            self.state_created_subrs.append(subrname)
            else:  # scalar
                if stmt.is_derived() or is_class_derived:
                    if var.is_allocatable() or var.is_pointer():
                        self.create_write_call(
                            self.state_externs_subrs[node.kgen_parent][0],
                            subrname, entity_name, stmt, var)
                        if entity_name in out_entity_names:
                            self.create_write_call(
                                self.state_externs_subrs[node.kgen_parent][1],
                                subrname, entity_name, stmt, var)
                        if subrname not in self.state_created_subrs:
                            create_write_subr(subrname, entity_name, parent,
                                              var, stmt)
                            self.state_created_subrs.append(subrname)
                    else:
                        subrname = 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]
                                    subrname = get_dtype_writename(res)
                                    break
                        if subrname is None:
                            print 'WARNING: Can not find Type resolver for %s' % stmt.name
                            namedpart_append_comment(self.state_externs_subrs[node.kgen_parent][0], EXEC_PART, \
                                'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\
                                (stmt.name, stmt.name))
                        else:
                            self.create_write_call(
                                self.state_externs_subrs[node.kgen_parent][0],
                                subrname, entity_name, stmt, var)
                            if entity_name in out_entity_names:
                                self.create_write_call(
                                    self.state_externs_subrs[node.kgen_parent]
                                    [1], subrname, entity_name, stmt, var)
                else:  # intrinsic type
                    self.create_write_intrinsic(
                        self.state_externs_subrs[node.kgen_parent][0],
                        entity_name, stmt, var)
                    if entity_name in out_entity_names:
                        self.create_write_intrinsic(
                            self.state_externs_subrs[node.kgen_parent][1],
                            entity_name, stmt, var)
Ejemplo n.º 2
0
    def create_subr_write_typedecl_in_parentblock(self, node):
        stmt = node.kgen_stmt

        argintype = []
        localintype = []
        localouttype = []
        for uname, req in KGGenType.get_state_in(stmt.geninfo):
            entity_name = uname.firstpartname()
            var = stmt.get_variable(entity_name)

            if var.is_parameter(): continue
            if is_remove_state(entity_name, stmt): continue

            if self.check_intent(entity_name, stmt):
                if (entity_name,STATE_PBLOCK_WRITE_IN_ARGS) not in argintype:
                    argintype.append((entity_name, STATE_PBLOCK_WRITE_IN_ARGS))
            elif (entity_name,STATE_PBLOCK_WRITE_IN_LOCALS) not in localintype and (entity_name,STATE_PBLOCK_WRITE_IN_ARGS) not in argintype:
                localintype.append((uname.firstpartname(), STATE_PBLOCK_WRITE_IN_LOCALS))

        for uname, req in KGGenType.get_state_out(stmt.geninfo):
            entity_name = uname.firstpartname()
            var = stmt.get_variable(entity_name)

            if var.is_parameter(): continue
            if is_remove_state(entity_name, stmt): continue

            if (entity_name,STATE_PBLOCK_WRITE_OUT_LOCALS) not in localouttype:
                localouttype.append((uname.firstpartname(), STATE_PBLOCK_WRITE_OUT_LOCALS))

            if (entity_name,STATE_PBLOCK_WRITE_IN_ARGS) in argintype: continue

            if (entity_name,STATE_PBLOCK_WRITE_IN_LOCALS) not in localintype:
                localintype.append((uname.firstpartname(), STATE_PBLOCK_WRITE_IN_LOCALS))
        vartypes = { 'argintype': argintype, 'localintype': localintype, 'localouttype': localouttype }

        # for state
        is_class_derived = check_class_derived(stmt)
        for vartypename, vartype in vartypes.iteritems():
            for entity_name, partid in vartype:
                var = stmt.get_variable(entity_name)
                subrname = get_typedecl_writename(stmt, entity_name)
                if var.is_array():
                    if is_zero_array(var, stmt): continue
                    if stmt.is_derived() or is_class_derived:
                        self.create_write_call(node.kgen_kernel_id, partid, subrname, entity_name, stmt, var)
                        if subrname not in self.state_created_subrs:
                            create_write_subr(subrname, entity_name, node.kgen_parent, var, stmt)
                            self.state_created_subrs.append(subrname)
                    else: # intrinsic type
                        if var.is_explicit_shape_array():
                            if vartypename=='argintype' or var.is_pointer():
                                self.create_write_call(node.kgen_kernel_id, partid, subrname, entity_name, stmt, var)
                                if subrname not in self.state_created_subrs:
                                    create_write_subr(subrname, entity_name, node.kgen_parent, var, stmt)
                                    self.state_created_subrs.append(subrname)
                            else:
                                self.create_write_intrinsic(node.kgen_kernel_id, partid, entity_name, stmt, var)
                        else: # implicit array
                            self.create_write_call(node.kgen_kernel_id, partid, subrname, entity_name, stmt, var)
                            if subrname not in self.state_created_subrs:
                                create_write_subr(subrname, entity_name, node.kgen_parent, var, stmt)
                                self.state_created_subrs.append(subrname)
                else: # scalar
                    if stmt.is_derived() or is_class_derived or var.is_pointer():
                        if var.is_allocatable() or var.is_pointer() or var.is_pointer():
                            self.create_write_call(node.kgen_kernel_id, partid, subrname, entity_name, stmt, var)
                            if subrname not in self.state_created_subrs:
                                create_write_subr(subrname, entity_name, node.kgen_parent, var, stmt)
                                self.state_created_subrs.append(subrname)
                        else:
                            subrname = None
                            for uname, req in stmt.unknowns.iteritems():
                                if uname.firstpartname()==stmt.name and len(req.res_stmts)>0:
                                    res = req.res_stmts[0]
                                    subrname = get_dtype_writename(res)
                                    break
                            if subrname is None:
                                print 'WARNING: Can not find Type resolver for %s'%stmt.name
                                namedpart_append_comment(node.kgen_kernel_id, partid, \
                                    'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\
                                    (stmt.name, stmt.name))
                            else:
                                self.create_write_call(node.kgen_kernel_id, partid, subrname, entity_name, stmt, var)
                    else: # intrinsic type
                        self.create_write_intrinsic(node.kgen_kernel_id, partid, entity_name, stmt, var)
Ejemplo n.º 3
0
    def create_subr_write_typedecl_in_parentblock(self, node):
        stmt = node.kgen_stmt

        argintype = []
        localintype = []
        localouttype = []
        for uname, req in KGGenType.get_state_in(stmt.geninfo):
            entity_name = uname.firstpartname()
            var = stmt.get_variable(entity_name)

            if var.is_parameter(): continue
            if is_remove_state(entity_name, stmt): continue

            if self.check_intent(entity_name, stmt):
                if (entity_name, STATE_PBLOCK_WRITE_IN_ARGS) not in argintype:
                    argintype.append((entity_name, STATE_PBLOCK_WRITE_IN_ARGS))
            elif (entity_name,
                  STATE_PBLOCK_WRITE_IN_LOCALS) not in localintype and (
                      entity_name,
                      STATE_PBLOCK_WRITE_IN_ARGS) not in argintype:
                localintype.append(
                    (uname.firstpartname(), STATE_PBLOCK_WRITE_IN_LOCALS))

        for uname, req in KGGenType.get_state_out(stmt.geninfo):
            entity_name = uname.firstpartname()
            var = stmt.get_variable(entity_name)

            if var.is_parameter(): continue
            if is_remove_state(entity_name, stmt): continue

            if (entity_name,
                    STATE_PBLOCK_WRITE_OUT_LOCALS) not in localouttype:
                localouttype.append(
                    (uname.firstpartname(), STATE_PBLOCK_WRITE_OUT_LOCALS))

            if (entity_name, STATE_PBLOCK_WRITE_IN_ARGS) in argintype: continue

            if (entity_name, STATE_PBLOCK_WRITE_IN_LOCALS) not in localintype:
                localintype.append(
                    (uname.firstpartname(), STATE_PBLOCK_WRITE_IN_LOCALS))
        vartypes = {
            'argintype': argintype,
            'localintype': localintype,
            'localouttype': localouttype
        }

        # for state
        is_class_derived = check_class_derived(stmt)
        for vartypename, vartype in vartypes.iteritems():
            for entity_name, partid in vartype:
                var = stmt.get_variable(entity_name)
                subrname = get_typedecl_writename(stmt, entity_name)
                if var.is_array():
                    if is_zero_array(var, stmt): continue
                    if stmt.is_derived() or is_class_derived:
                        self.create_write_call(node.kgen_kernel_id, partid,
                                               subrname, entity_name, stmt,
                                               var)
                        if subrname not in self.state_created_subrs:
                            create_write_subr(subrname, entity_name,
                                              node.kgen_parent, var, stmt)
                            self.state_created_subrs.append(subrname)
                    else:  # intrinsic type
                        if var.is_explicit_shape_array():
                            if vartypename == 'argintype' or var.is_pointer():
                                self.create_write_call(node.kgen_kernel_id,
                                                       partid, subrname,
                                                       entity_name, stmt, var)
                                if subrname not in self.state_created_subrs:
                                    create_write_subr(subrname, entity_name,
                                                      node.kgen_parent, var,
                                                      stmt)
                                    self.state_created_subrs.append(subrname)
                            else:
                                self.create_write_intrinsic(
                                    node.kgen_kernel_id, partid, entity_name,
                                    stmt, var)
                        else:  # implicit array
                            self.create_write_call(node.kgen_kernel_id, partid,
                                                   subrname, entity_name, stmt,
                                                   var)
                            if subrname not in self.state_created_subrs:
                                create_write_subr(subrname, entity_name,
                                                  node.kgen_parent, var, stmt)
                                self.state_created_subrs.append(subrname)
                else:  # scalar
                    if stmt.is_derived() or is_class_derived or var.is_pointer(
                    ):
                        if var.is_allocatable() or var.is_pointer(
                        ) or var.is_pointer():
                            self.create_write_call(node.kgen_kernel_id, partid,
                                                   subrname, entity_name, stmt,
                                                   var)
                            if subrname not in self.state_created_subrs:
                                create_write_subr(subrname, entity_name,
                                                  node.kgen_parent, var, stmt)
                                self.state_created_subrs.append(subrname)
                        else:
                            subrname = None
                            for uname, req in stmt.unknowns.iteritems():
                                if uname.firstpartname() == stmt.name and len(
                                        req.res_stmts) > 0:
                                    res = req.res_stmts[0]
                                    subrname = get_dtype_writename(res)
                                    break
                            if subrname is None:
                                print 'WARNING: Can not find Type resolver for %s' % stmt.name
                                namedpart_append_comment(node.kgen_kernel_id, partid, \
                                    'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\
                                    (stmt.name, stmt.name))
                            else:
                                self.create_write_call(node.kgen_kernel_id,
                                                       partid, subrname,
                                                       entity_name, stmt, var)
                    else:  # intrinsic type
                        self.create_write_intrinsic(node.kgen_kernel_id,
                                                    partid, entity_name, stmt,
                                                    var)
Ejemplo n.º 4
0
    def create_subr_write_typedecl_in_module(self, node):
        parent = node.kgen_parent
        stmt = node.kgen_stmt

        raw_entity_names = set([ uname.firstpartname() for uname, req in KGGenType.get_state(stmt.geninfo)])
        entity_names = [ e for e in raw_entity_names if not stmt.get_variable(e).is_parameter() ]
        
        raw_out_entity_names = set([ uname.firstpartname() for uname, req in KGGenType.get_state_out(stmt.geninfo)])
        out_entity_names = [ e for e in raw_out_entity_names if not stmt.get_variable(e).is_parameter() ]

        #entity_names = set([ uname.firstpartname() for uname, req in KGGenType.get_state(stmt.geninfo)])
        #out_entity_names = set([ uname.firstpartname() for uname, req in KGGenType.get_state_out(stmt.geninfo)])

        is_class_derived = check_class_derived(stmt)

        for entity_name, entity_decl in zip(entity_names, stmt.entity_decls):
            if node.kgen_parent.name+entity_name in self.state_extern_writes: continue
            if is_remove_state(entity_name, stmt): continue

            self.state_extern_writes.append(node.kgen_parent.name+entity_name)

            var = stmt.get_variable(entity_name)
            subrname = get_typedecl_writename(stmt, entity_name)

            if var.is_array():
                if is_zero_array(var, stmt): continue
                if stmt.is_derived() or is_class_derived:
                    self.create_write_call(self.state_externs_subrs[node.kgen_parent][0], subrname, entity_name, stmt, var)
                    if entity_name in out_entity_names:
                        self.create_write_call(self.state_externs_subrs[node.kgen_parent][1], subrname, entity_name, stmt, var)
                    if subrname not in self.state_created_subrs:
                        create_write_subr(subrname, entity_name, parent, var, stmt)
                        self.state_created_subrs.append(subrname)
                else: # intrinsic type
                    if var.is_explicit_shape_array():
                        self.create_write_intrinsic(self.state_externs_subrs[node.kgen_parent][0], entity_name, stmt, var)
                        if entity_name in out_entity_names:
                            self.create_write_intrinsic(self.state_externs_subrs[node.kgen_parent][1], entity_name, stmt, var)
                    else: # implicit array
                        self.create_write_call(self.state_externs_subrs[node.kgen_parent][0], subrname, entity_name, stmt, var)
                        if entity_name in out_entity_names:
                            self.create_write_call(self.state_externs_subrs[node.kgen_parent][1], subrname, entity_name, stmt, var)
                        if subrname not in self.state_created_subrs:
                            create_write_subr(subrname, entity_name, parent, var, stmt)
                            self.state_created_subrs.append(subrname)
            else: # scalar
                if stmt.is_derived() or is_class_derived:
                    if var.is_allocatable() or var.is_pointer():
                        self.create_write_call(self.state_externs_subrs[node.kgen_parent][0], subrname, entity_name, stmt, var)
                        if entity_name in out_entity_names:
                            self.create_write_call(self.state_externs_subrs[node.kgen_parent][1], subrname, entity_name, stmt, var)
                        if subrname not in self.state_created_subrs:
                            create_write_subr(subrname, entity_name, parent, var, stmt)
                            self.state_created_subrs.append(subrname)
                    else:
                        subrname = 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]
                                    subrname = get_dtype_writename(res)
                                    break
                        if subrname is None:
                            print 'WARNING: Can not find Type resolver for %s'%stmt.name
                            namedpart_append_comment(self.state_externs_subrs[node.kgen_parent][0], EXEC_PART, \
                                'ERROR: "%s" is not resolved. Call statements to write "%s" is not created here.'%\
                                (stmt.name, stmt.name))
                        else:
                            self.create_write_call(self.state_externs_subrs[node.kgen_parent][0], subrname, entity_name, stmt, var)
                            if entity_name in out_entity_names:
                                self.create_write_call(self.state_externs_subrs[node.kgen_parent][1], subrname, entity_name, stmt, var)
                else: # intrinsic type
                    self.create_write_intrinsic(self.state_externs_subrs[node.kgen_parent][0], entity_name, stmt, var)
                    if entity_name in out_entity_names:
                        self.create_write_intrinsic(self.state_externs_subrs[node.kgen_parent][1], entity_name, stmt, var)