---
# System prepended metadata

title: ICON Liskov Architecture

---

# ICON Liskov Architecture


```mermaid
flowchart LR
    CMake --> IntegrationClass & PreprocessorDirectives
    IntegrationClass & PreprocessorDirectives --> Liskov
    Liskov --> IntegrationData
```

- The `Preprocessor` is triggered from within `CMake` from within the `add_gt4py_stencil` function see [Build System Integration](https://hackmd.io/ughej3z0Sfe-AZWBuB5BaQ).

  
- For the `Preprocessor` to run the annotated `IntegrationFile` must be known (the f90 file with preprocessor directives) which forms one external input into the `Preprocessor`.
  
- The other possible external input is an `IntegrationClass` which may be a Python module which contains integration information.

```mermaid
flowchart TB
    IntegrationData --> IntegrationGenerator & IntegrationWriter
    IntegrationGenerator --> IntegrationCode
    IntegrationCode --> IntegrationWriter
    IntegrationWriter --> F90File
```

 - The `Preprocessor` takes any external inputs given, and produces an `IntegrationData` instance, which contains all neccessary information to generate the integration code.
   
- The `IntegrationGenerator` consumes `IntegrationData` and generates all integration code.
  
- Finally the original `F90` file is overwritten by the newly generated `F90` file.  
  

### Basic Workflow

**Preprocessor**

1. Main entrypoint needs name of file to preprocess (e.g. `mo_solve_nonhydro.f90`)
   
2. All `!$DSL` preprocessor directive statements are read along with corresponding locations in the code, this information is used to generate `IntegrationData`.
   
3. The corresponding stencil is imported from `icon4py` and all required data for generation targets is parsed out from fencil, also used to generate `IntegrationData`.
   
4. Code generated as string in memory using `IntegrationGenerator` and original file is either overwritten (easiest starting variant), or new file generated with an infix e.g.  `mo_solve_nonhydro.dsl.f90`


### Requirements

#### High priority

- A simple grammar for directives (see [Parsing Implementation Notes](https://hackmd.io/aPVBq7egSUChB5-iu_RJQg)).
- Be able to generate all generation targets for simple stencil calls (see [Generation Targets](https://hackmd.io/M9nYjjqHSPK0Ct8YbotRUA)).
- Should be extensible (be able to add additional external inputs or change generation targets).
- Easily executable from within the ICON build system.

#### Future work
- Instead of directives, also allow additional input in the form of an `IntegrationClass`
- Support fusion of different stencils.
- Support more advanced stencils calls, e.g. stencils called inside subroutine).
