Module Sarek_ppx_lib.Sarek_lower_ir

module Ir = Sarek_ir_ppx
val mangle_type_name : string -> string

Mangle type names for C compatibility

val elttype_of_typ : Sarek_types.typ -> Ir.elttype

Convert Sarek_types.typ to Sarek_ir_ppx.elttype

val memspace_of_memspace : Sarek_types.memspace -> Ir.memspace

Convert Sarek_types.memspace to Sarek_ir_ppx.memspace

val c_type_of_typ : Sarek_types.typ -> string

Get C type string for a typ

val record_constructor_strings : string -> (string * Sarek_types.typ) list -> string list

Generate C struct definition and builder for record types

val variant_constructor_strings : string -> (string * Sarek_types.typ option) list -> string list

Generate C struct definitions and builders for variant types

val ir_lower_expr_count : int Stdlib.ref
val ir_lower_stmt_count : int Stdlib.ref
type state = {
  1. mutable next_var_id : int;
  2. fun_map : (string, Sarek_typed_ast.tparam list * Sarek_typed_ast.texpr) Stdlib.Hashtbl.t;
  3. lowering_stack : (string, unit) Stdlib.Hashtbl.t;
  4. lowered_funs : (string, Ir.helper_func) Stdlib.Hashtbl.t;
    (*

    Lowered helper functions: name -> helper_func

    *)
  5. mutable lowered_funs_order : string list;
    (*

    Order in which functions were lowered (for dependency ordering)

    *)
  6. types : (string, (string * Ir.elttype) list) Stdlib.Hashtbl.t;
    (*

    Collected record types: type_name -> (field_name, field_type); ...

    *)
  7. variants : (string, (string * Ir.elttype list) list) Stdlib.Hashtbl.t;
    (*

    Collected variant types: type_name -> (constructor_name, payload_types); ...

    *)
}

Lowering state

val create_state : (string, Sarek_typed_ast.tparam list * Sarek_typed_ast.texpr) Stdlib.Hashtbl.t -> state
val fresh_id : state -> int

Convert Sarek_ast.binop to Sarek_ir_ppx.binop

val ir_unop : Sarek_ast.unop -> Ir.unop

Convert Sarek_ast.unop to Sarek_ir_ppx.unop

val lower_memspace : Sarek_types.memspace -> Ir.memspace

Convert memspace

val make_var : string -> int -> Sarek_types.typ -> bool -> Ir.var

Create a var from typed var info

val lower_decl : mutable_:bool -> int -> string -> Sarek_types.typ -> Ir.decl

Lower a declaration

val make_returning : Ir.stmt -> Ir.stmt

Transform a statement to ensure it returns a value. This adds SReturn to leaf statements without re-traversing the original AST.

val lower_expr : state -> Sarek_typed_ast.texpr -> Ir.expr

Convert a typed expression to IR expression

val lower_stmt : state -> Sarek_typed_ast.texpr -> Ir.stmt

Convert a typed expression to IR statement

val lower_lvalue : state -> Sarek_typed_ast.texpr -> string -> Ir.lvalue
val lower_pattern : Sarek_typed_ast.tpattern -> Ir.pattern
val extract_pattern_vars : Sarek_typed_ast.tpattern -> string list
val lower_param : Sarek_typed_ast.tparam -> Ir.decl

Convert a kernel parameter to IR declaration

val lower_kernel : Sarek_typed_ast.tkernel -> Ir.kernel * string list

Lower a complete kernel

val lower_return_value : Sarek_typed_ast.tkernel -> Ir.decl option

Get the return value declaration for a kernel