kerncraft/kernel.py
def get_main_code(self, as_filename=False, kernel_function_name='kernel'):
        """
        Generate and return compilable source code from AST.
        """
        # TODO produce nicer code, including help text and other "comfort features".
        assert self.kernel_ast is not None, "AST does not exist, this could be due to running " \
                                            "based on a kernel description rather than code."

        fp, already_available = self._get_intermediate_file('main.c',
                                                            machine_and_compiler_dependent=False)

        # Use already cached version
        if already_available:
            code = fp.read()
        else:
            parser = CParser()
            template_code = self.CODE_TEMPLATE
            template_ast = parser.parse(clean_code(template_code,
                                                   macros=True, comments=True, pragmas=False))
            ast = deepcopy(template_ast)

            # Define and replace DECLARE_CONSTS
            replace_id(ast, "DECLARE_CONSTS", self._build_const_declartions(with_init=True))

            # Define and replace DECLARE_ARRAYS
            array_declarations, array_dimensions = self._build_array_declarations()
            replace_id(ast, "DECLARE_ARRAYS", array_declarations)

            # Define and replace DECLARE_INIT_SCALARS
            replace_id(ast, "DECLARE_INIT_SCALARS", self._build_scalar_declarations())

            # Define and replace DUMMY_CALLS
            replace_id(ast, "DUMMY_CALLS", self._build_dummy_calls())

            # Define and replace KERNEL_DECL
            ast.ext.insert(0, self._build_kernel_function_declaration(
                name=kernel_function_name))

            # Define and replace KERNEL_CALL
            replace_id(ast, "KERNEL_CALL", self._build_kernel_call())

            # Define and replace INIT_ARRAYS based on previously generated kernel
            replace_id(ast, "INIT_ARRAYS", self._build_array_initializations(array_dimensions))

            # Generate code
            code = CGenerator().visit(ast)

            # Insert missing #includes from template to top of code
            code = '\n'.join([l for l in template_code.split('\n') if l.startswith("#include")]) + \
                   '\n\n' + code

            # Store to file
            fp.write(code)
        fp.close()

        if as_filename:
            return fp.name
        else:
            return code
def get_main_code(self, as_filename=False, kernel_function_name='kernel'):
        # TODO produce nicer code, including help text and other "comfort features".
        assert self.kernel_ast is not None, "AST does not exist, this could be due to running " \
                                            "based on a kernel description rather than code."

        fp, already_available = self._get_intermediate_file('main.c',
                                                            machine_and_compiler_dependent=False)

        # Use already cached version
        if already_available:
            code = fp.read()
        else:
            parser = CParser()
            template_code = self.CODE_TEMPLATE
            template_ast = parser.parse(clean_code(template_code,
                                                   macros=True, comments=True, pragmas=False))
            ast = deepcopy(template_ast)

            # Define and replace DECLARE_CONSTS
            replace_id(ast, "DECLARE_CONSTS", self._build_const_declartions(with_init=True))

            # Define and replace DECLARE_ARRAYS
            array_declarations, array_dimensions = self._build_array_declarations()
            replace_id(ast, "DECLARE_ARRAYS", array_declarations)

            # Define and replace DECLARE_INIT_SCALARS
            replace_id(ast, "DECLARE_INIT_SCALARS", self._build_scalar_declarations())

            # Define and replace DUMMY_CALLS
            replace_id(ast, "DUMMY_CALLS", self._build_dummy_calls())

            # Define and replace KERNEL_DECL
            ast.ext.insert(0, self._build_kernel_function_declaration(
                name=kernel_function_name))

            # Define and replace KERNEL_CALL
            replace_id(ast, "KERNEL_CALL", self._build_kernel_call())

            # Define and replace INIT_ARRAYS based on previously generated kernel
            replace_id(ast, "INIT_ARRAYS", self._build_array_initializations(array_dimensions))

            # Generate code
            code = CGenerator().visit(ast)

            # Insert missing #includes from template to top of code
            code = '\n'.join([l for l in template_code.split('\n') if l.startswith("#include")]) + \
                   '\n\n' + code

            # Store to file
            fp.write(code)
        fp.close()

        if as_filename:
            return fp.name
        else:
            return code
def get_main_code ( self , as_filename = False , kernel_function_name = 'kernel' ) : # TODO produce nicer code, including help text and other "comfort features". assert self . kernel_ast is not None , "AST does not exist, this could be due to running " "based on a kernel description rather than code." fp , already_available = self . _get_intermediate_file ( 'main.c' , machine_and_compiler_dependent = False ) # Use already cached version if already_available : code = fp . read ( ) else : parser = CParser ( ) template_code = self . CODE_TEMPLATE template_ast = parser . parse ( clean_code ( template_code , macros = True , comments = True , pragmas = False ) ) ast = deepcopy ( template_ast ) # Define and replace DECLARE_CONSTS replace_id ( ast , "DECLARE_CONSTS" , self . _build_const_declartions ( with_init = True ) ) # Define and replace DECLARE_ARRAYS array_declarations , array_dimensions = self . _build_array_declarations ( ) replace_id ( ast , "DECLARE_ARRAYS" , array_declarations ) # Define and replace DECLARE_INIT_SCALARS replace_id ( ast , "DECLARE_INIT_SCALARS" , self . _build_scalar_declarations ( ) ) # Define and replace DUMMY_CALLS replace_id ( ast , "DUMMY_CALLS" , self . _build_dummy_calls ( ) ) # Define and replace KERNEL_DECL ast . ext . insert ( 0 , self . _build_kernel_function_declaration ( name = kernel_function_name ) ) # Define and replace KERNEL_CALL replace_id ( ast , "KERNEL_CALL" , self . _build_kernel_call ( ) ) # Define and replace INIT_ARRAYS based on previously generated kernel replace_id ( ast , "INIT_ARRAYS" , self . _build_array_initializations ( array_dimensions ) ) # Generate code code = CGenerator ( ) . visit ( ast ) # Insert missing #includes from template to top of code code = '\n' . join ( [ l for l in template_code . split ( '\n' ) if l . startswith ( "#include" ) ] ) + '\n\n' + code # Store to file fp . write ( code ) fp . close ( ) if as_filename : return fp . name else : return code
Generate and return compilable source code from AST.
Generate and return compilable source code from AST .