loki.backend.cgen module
- cgen(ir, **kwargs)
Generate standardized C code from one or many IR objects/trees.
- class CCodegen(depth=0, indent=' ', linewidth=90, **kwargs)
Bases:
Stringifier
Tree visitor to generate standardized C code from IR.
- standard_imports = ['stdio.h', 'stdbool.h', 'float.h', 'math.h']
- visit_Sourcefile(o, **kwargs)
- Format as
…modules… …subroutines…
- visit_Interface(o, **kwargs)
- visit_Subroutine(o, **kwargs)
Format as:
…imports… <return_type> <name>(<args>) {
…spec without imports and argument declarations… …body…
}
- visit_Node(o, **kwargs)
- Format non-supported nodes as
// <repr(Node)>
- visit_Intrinsic(o, **kwargs)
Format intrinsic nodes.
- visit_Comment(o, **kwargs)
Format comments.
- visit_CommentBlock(o, **kwargs)
Format comment blocks.
- visit_VariableDeclaration(o, **kwargs)
- Format declaration as
<type> <name> [= <initial>]
- visit_Import(o, **kwargs)
- Format C imports as
#include “<name>”
- visit_Loop(o, **kwargs)
- Format loop with explicit range as
- for (<var>=<start>; <var><criteria><end>; <var> += <incr>) {
…body…
}
- visit_WhileLoop(o, **kwargs)
- Format loop as
- while (<condition>) {
…body…
}
- visit_Conditional(o, **kwargs)
- Format conditional as
- if (<condition>) {
…body…
- [ } else if (<condition>) { ]
[…body…]
- [ } else { ]
[…body…]
}
- visit_Assignment(o, **kwargs)
- Format statement as
<target> = <expr> [<comment>]
- visit_Section(o, **kwargs)
Format the section’s body.
- visit_CallStatement(o, **kwargs)
- Format call statement as
<name>(<args>)
- visit_SymbolAttributes(o, **kwargs)
- visit_TypeDef(o, **kwargs)
- Format type definition/struct as
- struct <name> {
…declarations…
};
- visit_MultiConditional(o, **kwargs)
- Format as
switch case (<expr>) { case <value>: {
…body…
} [case <value>:] {
[…body…]
} [default:] {
[…body…]
E.g., the following
- select case (in)
- case (:2)
out = 1
- case (4, 5, 7:9)
out = 2
- case (6)
out = 3
- case default
out = 4
end select
becomes
- switch (in) {
case 0: case 1: case 2: {
out = 1; break;
} case 4: case 5: case 7: case 8: case 9: {
out = 2; break;
} case 6: {
out = 3; break;
} default: {
out = 4; breal;
}
}
- class CCodeMapper(intrinsic_type_mapper, *args, **kwargs)
Bases:
LokiStringifyMapper
A
StringifyMapper
-derived visitor for Pymbolic expression trees that converts an expression to a string adhering to standardized C.- map_logic_literal(expr, enclosing_prec, *args, **kwargs)
- map_float_literal(expr, enclosing_prec, *args, **kwargs)
- map_int_literal(expr, enclosing_prec, *args, **kwargs)
- map_string_literal(expr, enclosing_prec, *args, **kwargs)
- map_cast(expr, enclosing_prec, *args, **kwargs)
- map_variable_symbol(expr, enclosing_prec, *args, **kwargs)
- map_meta_symbol(expr, enclosing_prec, *args, **kwargs)
- map_scalar(expr, enclosing_prec, *args, **kwargs)
- map_array(expr, enclosing_prec, *args, **kwargs)
- map_array_subscript(expr, enclosing_prec, *args, **kwargs)
- map_string_subscript(expr, enclosing_prec, *args, **kwargs)
- map_logical_not(expr, enclosing_prec, *args, **kwargs)
- map_logical_or(expr, enclosing_prec, *args, **kwargs)
- map_logical_and(expr, enclosing_prec, *args, **kwargs)
- map_range_index(expr, enclosing_prec, *args, **kwargs)
- map_power(expr, enclosing_prec, *args, **kwargs)
- map_c_reference(expr, enclosing_prec, *args, **kwargs)
- map_c_dereference(expr, enclosing_prec, *args, **kwargs)
- map_inline_call(expr, enclosing_prec, *args, **kwargs)