.. FMFL v0.1 — Functional Model Language (IR), execution phases, types, standard library. ================================================================================ FMFL v0.1 specification ================================================================================ :Status: Draft v0.1 This document specifies the *Functional Model Language* (FMFL), semantic types, execution phases, and the normative **Standard Library** surface. For FMF packaging and XML, see :doc:`fmf_v0_1`. The concrete syntax is **Python-like** (indented suites, no semicolons, ``#`` comments) while semantics remain target-agnostic. -------------------------------------------------------------------------------- D. FMFL v0.1 specification -------------------------------------------------------------------------------- D.1 Purpose ~~~~~~~~~~~ FMFL is an **intermediate** representation: compact, easy to parse, and easy to lower to multiple targets. It is **not** a user-facing modeling language; it may be generated from a graph editor or from library templates. D.2 Execution phases (v0.1, normative) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Hosts **SHALL** support the following **two** behavioral phases for each FMFL unit bound to an element instance: .. list-table:: :header-rows: 1 :widths: 22 78 * - Phase - Semantics * - **1. Init phase** - Executed **once** after configuration. Assigns **initial values** to local names and **MAY** assign output ports for initial outputs. **SHALL NOT** cause **side effects** in v0.1 (no I/O, no mutation outside the instance’s assigned variables/ports/parameters as defined by this specification). * - **2. Equations phase** - Executed **once per evaluation step**. **Pure functional** evaluation: given fixed inputs (input ports, parameters, and any state defined in v0.2+), assignments define outputs; v0.1 does not specify host I/O during this phase. Load, configure, stop, and scheduling are **host** concerns (see :doc:`index`, section G). D.3 Determinism and evaluation order ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * **Evaluation order** within a phase is defined **only** by the **textual order** of statements in the FMFL file (and by any explicit dataflow implied by assignments). Hosts **SHALL NOT** reorder statements in a way that changes observable results relative to that order. * **Numeric values** of locals not assigned before use **SHALL** be treated as **numeric zero** of the expression’s semantic type context (v0.1: real context uses **0.0**). Authors **SHOULD** assign explicitly where readability matters. * **Algebraic loops**, **cyclic equation systems**, and **temporary local variables** are **permitted**; resolving consistency (fixed-point, tearing, rejection) is **the responsibility of library and model authors**, not the v0.1 host contract. D.4 Ports, local variables, parameters, and state ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 :widths: 22 78 * - Category - Meaning * - **Input port** - External input to the element (declared in FMF with ``kind="in"``). Read-only in FMFL. * - **Output port** - External output (``kind="out"``). Assigned in FMFL. * - **Local variable** - **Temporary** name introduced by assignment inside the FMFL unit; not an external port. * - **Parameter** - **Constant** for the instance, declared in FMF; exposed as a read-only name in FMFL. * - **State** *(v0.2+)* - **Persistent** across steps; not normative in v0.1. Assignments **MAY** target output ports and local variables in the **equations** suite; the **init** suite **MAY** assign locals and output ports for initialization. D.5 Semantic type system (v0.1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FMFL uses **abstract semantic types** only; the IR **SHALL NOT** fix concrete storage (e.g. IEEE ``float``, ``float64``, ``int16``). .. list-table:: :header-rows: 1 :widths: 18 82 * - Semantic type - Role * - **Real** - Real-valued scalar (algebraic use in v0.1). * - **Int** - Integer scalar *(minimal use in v0.1; literals and ports **MAY** use ``int`` in FMF)*. * - **Bool** - Boolean scalar. **Type profiles / target profiles** (development vs controller, fixed-point, etc.) **SHALL** map these semantic types to concrete representations during code generation. Example (informative): *Development*: ``Real`` → IEEE ``float64``; *Embedded controller*: ``Real`` → fixed-point or integer-based representation. **One** semantic definition in the model; **profiles** decide numeric representation and codegen — no duplicate parallel float/int FMFL dialects as a default. FMF ```` uses lowercase tokens ``real``, ``int``, ``bool`` aligned to **Real**, **Int**, **Bool**. D.6 Minimal language core ~~~~~~~~~~~~~~~~~~~~~~~~~ **Files** * UTF-8 text, line-oriented. * Optional first line: ``fmfl 0.1`` (recommended). **Literals** * Real literals: lexical subset of Python 3 floating literals. * Integer literals: lexical subset of Python 3 integers. * Boolean literals: ``True``, ``False``. **References** * Identifiers: Python identifier rules. Names **MUST** resolve to an input port, output port, parameter, or local already assigned in an earlier line or in **init**. **Operators (scalar, v0.1)** * Arithmetic: ``+``, ``-``, ``*``, ``/`` with usual precedence; unary ``-``. * Intrinsics: ``abs``, ``min``, ``max`` as in the Standard Library note below. **Assignments** * One statement per line: `` = `` (no semicolon). * ```` is an **output port** or a **local variable** (locals may be introduced by first assignment). **Comments** * ``#`` to end of line. D.7 Initialization and equations blocks (syntax) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Structure** * ``init:`` and ``equations:`` each introduce an indented suite (Python indentation rules; 4 spaces **RECOMMENDED**). * Empty suites **SHALL** contain ``pass`` on an indented line. **``init:``** * Runs in the **init phase** (D.2). **No side effects** (v0.1). **``equations:``** * Runs in the **equations phase** (D.2). **Pure** evaluation for that step. The keyword ``run:`` is **deprecated** and **SHALL NOT** appear in conforming v0.1 FMFL; processors **MAY** accept ``run:`` as an alias for ``equations:`` when documented as a transitional extension. D.8 Syntax sketch (informative) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. code-block:: text file ::= [VERSION_LINE] (INIT_BLOCK | EQUATIONS_BLOCK)+ VERSION_LINE ::= "fmfl" VERSION NEWLINE INIT_BLOCK ::= "init:" NEWLINE INDENT statement+ DEDENT EQUATIONS_BLOCK ::= "equations:" NEWLINE INDENT statement+ DEDENT statement ::= assign NEWLINE assign ::= TARGET "=" expr D.9 Examples (informative) ~~~~~~~~~~~~~~~~~~~~~~~~~~ **Add** .. code-block:: python fmfl 0.1 init: pass equations: out = in0 + in1 **Mul** .. code-block:: python fmfl 0.1 init: pass equations: out = in0 * in1 -------------------------------------------------------------------------------- E. Standard library (normative, v0.1) -------------------------------------------------------------------------------- The FMF v0.1 **standard library** (library ``name`` **SHALL** be ``std``; host references **SHALL** use ``std.`` or unqualified ```` per :doc:`fmf_v0_1`, C.1.1) **SHALL** provide at least the following elements for interoperability: * **Add** * **Sub** * **Mul** * **Div** Each **SHALL** use the port names and semantics in the table below. **SHOULD** additionally provide **Neg**, **Abs**, **Min**, and **Max** with the same naming conventions where extended interoperability is desired. .. list-table:: :header-rows: 1 :widths: 12 28 20 40 * - id - Purpose - Ports - FMFL (``equations`` suite) * - Add - Real addition - ``in0``, ``in1`` → ``out`` - ``out = in0 + in1`` * - Sub - Real subtraction - ``in0``, ``in1`` → ``out`` - ``out = in0 - in1`` * - Mul - Real multiplication - ``in0``, ``in1`` → ``out`` - ``out = in0 * in1`` * - Div - Real division - ``in0``, ``in1`` → ``out`` - ``out = in0 / in1`` * - Neg - Unary negation - ``in0`` → ``out`` - ``out = -in0`` * - Abs - Absolute value - ``in0`` → ``out`` - ``out = abs(in0)`` *(see note)* * - Min - Minimum of two reals - ``in0``, ``in1`` → ``out`` - ``out = min(in0, in1)`` * - Max - Maximum of two reals - ``in0``, ``in1`` → ``out`` - ``out = max(in0, in1)`` For **Add**, **Sub**, **Mul**, and **Div**, graphics **SHALL** follow the FMF triple-icon rules with **``*_16.svg`` preferred** for single-resolution hosts (see :doc:`fmf_v0_1`, C.3.1). Icon artwork is aligned with Synarius Studio BasicOperator vector glyphs (blue fill ``#2468dc``, dark stroke ``#16161c``). **Note on ``abs``, ``min``, ``max``:** these are **intrinsic** functions; code generators **SHALL** map them to safe target equivalents. If a host cannot implement an intrinsic, that element **SHALL NOT** be exposed in that profile.