# Copyright (C) 2009-2017 Anders Logg, Martin Sandve Alnæs, Marie E. Rognes,
# Kristian B. Oelgaard, and others
#
# This file is part of FFCx.(https://www.fenicsproject.org)
#
# SPDX-License-Identifier: LGPL-3.0-or-later
"""Compiler stage 4: Code generation.
This module implements the generation of C code for the body of each
UFC function from an intermediate representation (IR).
"""
from __future__ import annotations
import logging
import typing
import numpy.typing as npt
from ffcx.codegeneration.C.expressions import generator as expression_generator
from ffcx.codegeneration.C.file import generator as file_generator
from ffcx.codegeneration.C.form import generator as form_generator
from ffcx.codegeneration.C.integrals import generator as integral_generator
from ffcx.ir.representation import DataIR
logger = logging.getLogger("ffcx")
[docs]
class CodeBlocks(typing.NamedTuple):
"""Storage of code blocks of the form (declaration, implementation).
Blocks for integrals, forms and expressions, and start and end of file output
"""
file_pre: list[tuple[str, str]]
integrals: list[tuple[str, str]]
forms: list[tuple[str, str]]
expressions: list[tuple[str, str]]
file_post: list[tuple[str, str]]
[docs]
def generate_code(ir: DataIR, options: dict[str, int | float | npt.DTypeLike]) -> CodeBlocks:
"""Generate code blocks from intermediate representation."""
logger.info(79 * "*")
logger.info("Compiler stage 3: Generating code")
logger.info(79 * "*")
code_integrals = [integral_generator(integral_ir, options) for integral_ir in ir.integrals]
code_forms = [form_generator(form_ir, options) for form_ir in ir.forms]
code_expressions = [
expression_generator(expression_ir, options) for expression_ir in ir.expressions
]
code_file_pre, code_file_post = file_generator(options)
return CodeBlocks(
file_pre=[code_file_pre],
integrals=code_integrals,
forms=code_forms,
expressions=code_expressions,
file_post=[code_file_post],
)