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)
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)
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)
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)