diff --git a/README.md b/README.md new file mode 100644 index 0000000..7a66182 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# reactor-uc Documentation + +Source for the [micro-LF](https://micro-lf.org) documentation website, built with [MkDocs Material](https://squidfunk.github.io/mkdocs-material/). + +## Local Development + +### Prerequisites + +You need Python 3 and pip, or [Nix](https://nixos.org/). + +### Option 1: pip (virtual environment) + +```bash +python3 -m venv venv +source venv/bin/activate +pip install -r requirements.txt +``` + +Then start the live-reloading development server: + +```bash +mkdocs serve +``` + +The site will be available at [http://127.0.0.1:8000](http://127.0.0.1:8000). MkDocs watches for file changes and automatically reloads the browser. + +### Option 2: Nix + +If you have Nix with flakes enabled: + +```bash +nix develop +mkdocs serve +``` + +Or using the legacy `shell.nix`: + +```bash +nix-shell +mkdocs serve +``` + +## Building the Static Site + +To generate the static site output into the `site/` directory: + +```bash +mkdocs build +``` + +## Project Structure + +``` +docs/ # Markdown source files +mkdocs.yaml # MkDocs configuration +requirements.txt # Python dependencies +site/ # Generated static site output (not committed) +``` + +## Contributing + +Edit the Markdown files under `docs/` and use `mkdocs serve` to preview changes locally before submitting a pull request. The upstream repository is [lf-lang/reactor-uc](https://github.com/lf-lang/reactor-uc). diff --git a/docs/documentation/annotations.md b/docs/documentation/annotations.md index 1a960f6..fcb9463 100644 --- a/docs/documentation/annotations.md +++ b/docs/documentation/annotations.md @@ -6,108 +6,103 @@ Annotations in micro-LF allow you to configure reactor components, specify platf Configure how the reactor system is compiled and built. -- **`@build_type("")`** - - Specifies the build type for compilation optimization and debug symbols. This is only supported for the `Native` platform. - - **Valid values:** +**`@build_type("")`**{ .api-sig } - - `"DEBUG"`: Include debug symbols and disable optimizations - - `"RELEASE"`: Enable optimizations and omit debug symbols +Specifies the build type for compilation optimization and debug symbols. This is only supported for the `Native` platform. + +**Valid values:** + +- `"DEBUG"`: Include debug symbols and disable optimizations +- `"RELEASE"`: Enable optimizations and omit debug symbols ## Runtime Configuration Configure global runtime behavior and system-wide options. -- **`@logging("")`** - - Sets the logging verbosity level for the runtime system. - - **Valid values:** +**`@logging("")`**{ .api-sig } + +Sets the logging verbosity level for the runtime system. + +**Valid values:** + +- `"ERROR"`: Only log errors +- `"WARN"`: Log warnings and errors +- `"INFO"`: Log general information +- `"DEBUG"`: Log detailed debug information + +**`@timeout()`**{ .api-sig } + +Specifies a global timeout for reactor execution. The program will shutdown after this amount of logical time. + +**Parameters:** + +- ``: Logical time duration in appropriate time unit (e.g., `MSEC(5000)`, `SEC(5)`) + +**`@fast()`**{ .api-sig } + +When enabled, the reactor system runs as fast as possible without waiting for physical time to advance. Useful for simulation and testing. + +**Parameters:** - - `"ERROR"`: Only log errors - - `"WARN"`: Log warnings and errors - - `"INFO"`: Log general information - - `"DEBUG"`: Log detailed debug information +- ``: `true` to enable fast execution, `false` for real-time execution -- **`@timeout()`** - - Specifies a global timeout for reactor execution. The program will shutdown after this amount of logical time. - - **Parameters:** +**`@keepalive()`**{ .api-sig } - - ``: Logical time duration in appropriate time unit (e.g., `MSEC(5000)`, `SEC(5)`) +Controls whether the reactor keeps running when there are no more scheduled events. When disabled, the reactor may shut down prematurely. -- **`@fast()`** - - When enabled, the reactor system runs as fast as possible without waiting for physical time to advance. Useful for simulation and testing. - - **Parameters:** +**Parameters:** - - ``: `true` to enable fast execution, `false` for real-time execution +- ``: `true` to keep the reactor alive, `false` to allow shutdown -- **`@keepalive()`** - - Controls whether the reactor keeps running when there are no more scheduled events. When disabled, the reactor may shut down prematurely. - - **Parameters:** +**`@clock_sync("")`**{ .api-sig } - - ``: `true` to keep the reactor alive, `false` to allow shutdown +Globally enables or disables clock synchronization across a federation. -- **`@clock_sync("")`** - - Globally enables or disables clock synchronization across a federation. - - **Valid values:** +**Valid values:** - - `"on"`: Enable clock synchronization - - `"off"`: Disable clock synchronization +- `"on"`: Enable clock synchronization +- `"off"`: Disable clock synchronization ## Reactor Components Annotations for configuring individual reactor components and connections. -- **`@max_pending_event()`** - - Specifies the maximum number of elements that can be queued in a logical action's buffer. This controls memory usage and prevents unbounded growth of pending events. - - **Parameters:** - - ``: Maximum queue size (positive integer) +**`@max_pending_events()`**{ .api-sig } -- **`@buffer()`** - - Specifies the maximum number of elements that can be in transit across a delayed connection. Useful for controlling backpressure in pipelines. - - **Parameters:** +Specifies the maximum number of elements that can be queued in a logical action's buffer. This controls memory usage and prevents unbounded growth of pending events. - - ``: Maximum buffer size (positive integer) +**Parameters:** + +- ``: Maximum queue size (positive integer) + +**`@buffer()`**{ .api-sig } + +Specifies the maximum number of elements that can be in transit across a delayed connection. Useful for controlling backpressure in pipelines. + +**Parameters:** + +- ``: Maximum buffer size (positive integer) ## Platform Configuration Specify which platforms a federate should be compiled for in multi-platform federations. -- **`@platform("")`** - - Generic platform annotation for specifying target platforms. - - **Valid platforms:** - - `"NATIVE"`: Native/Linux platform - - `"PICO"`: Raspberry Pi Pico - - `"ZEPHYR"`: Zephyr RTOS - - `"RIOT"`: RIOT OS - - `"FLEXPRET"`: FlexPRET - - `"PATMOS"`: Patmos hardware - - `"ESP-IDF"`: ESP-IDF framework - - `"FREERTOS"`: FreeRTOS - - -!!! warning "Deprecation Notice" - These annotations may be deprecated in a future release. - -- **`@platform_riot()`** - Compile for RIOT OS -- **`@platform_zephyr()`** - Compile for Zephyr RTOS -- **`@platform_patmos()`** - Compile for Patmos hardware -- **`@platform_native()`** - Compile for native/Linux platform +**`@platform("")`**{ .api-sig } + +Generic platform annotation for specifying target platforms: + +**Valid platforms:** + +- `"NATIVE"`: Native (POSIX: Linux or macOS) platform +- `"PICO"`: Raspberry Pi Pico +- `"ZEPHYR"`: Zephyr RTOS +- `"RIOT"`: RIOT OS +- `"FLEXPRET"`: FlexPRET +- `"PATMOS"`: Patmos hardware +- `"ESP-IDF"`: ESP-IDF framework +- `"FREERTOS"`: FreeRTOS + +These platform names are not case-sensitive. ## Network Interfaces @@ -121,54 +116,55 @@ Define physical network interfaces on federates. These annotations are translate For practical examples and usage patterns, see [Federated Execution - Configuring Network Interfaces](../design/federated.md#configuring-network-interfaces). -- **`@interface_tcp(name="string", address="127.0.0.1:4200")`** - - TCP/IP network interface for federate communication. - - **Parameters:** - - `name`: Interface identifier - - `address`: Host and port (format: "host:port") - -- **`@interface_uart(name="uart0", uart_device=0, baud_rate=115200, data_bits=8, parity="", stop_bits=1, async=false)`** - - UART/serial interface for embedded systems communication. - - **Parameters:** - - - `name`: Interface identifier - - `uart_device`: Device number - - `baud_rate`: Communication speed (e.g., 115200) - - `data_bits`: Bits per character (typically 8) - - `parity`: Parity mode (e.g., "", "even", "odd") - - `stop_bits`: Stop bits (typically 1 or 2) - - `async`: Whether to use asynchronous mode - -- **`@interface_coap(name="coap0", address="10.0.0.1")`** - - CoAP (Constrained Application Protocol) interface for IoT communication. - - **Parameters:** - - - `name`: Interface identifier - - `address`: Server address - -- **`@interface_s4noc(core=0)`** - - S4NoC network-on-chip interface for tightly-coupled embedded systems. - - **Parameters:** - - - `core`: Core identifier - -- **`@interface_custom(name="c1", args="blabla", include="my_network.h")`** - - Custom network interface for user-defined communication protocols. - - **Parameters:** - - - `name`: Interface identifier - - `args`: Custom arguments passed to the interface - - `include`: Header file containing the interface implementation +**`@interface_tcp(name="string", address="127.0.0.1:4200")`**{ .api-sig } + +TCP/IP network interface for federate communication. + +**Parameters:** + +- `name`: Interface identifier +- `address`: Host and port (format: "host:port") + +**`@interface_uart(name="uart0", uart_device=0, baud_rate=115200, data_bits=8, parity="", stop_bits=1, async=false)`**{ .api-sig } + +UART/serial interface for embedded systems communication. + +**Parameters:** + +- `name`: Interface identifier +- `uart_device`: Device number +- `baud_rate`: Communication speed (e.g., 115200) +- `data_bits`: Bits per character (typically 8) +- `parity`: Parity mode (e.g., "", "even", "odd") +- `stop_bits`: Stop bits (typically 1 or 2) +- `async`: Whether to use asynchronous mode + +**`@interface_coap(name="coap0", address="10.0.0.1")`**{ .api-sig } + +CoAP (Constrained Application Protocol) interface for IoT communication. + +**Parameters:** + +- `name`: Interface identifier +- `address`: Server address + +**`@interface_s4noc(core=0)`**{ .api-sig } + +S4NoC network-on-chip interface for tightly-coupled embedded systems. + +**Parameters:** + +- `core`: Core identifier + +**`@interface_custom(name="c1", args="blabla", include="my_network.h")`**{ .api-sig } + +Custom network interface for user-defined communication protocols. + +**Parameters:** + +- `name`: Interface identifier +- `args`: Custom arguments passed to the interface +- `include`: Header file containing the interface implementation ## Network Configuration @@ -176,89 +172,90 @@ Configure how LF connections are mapped to network channels. These annotations w For a comprehensive overview of federated execution, see [Federated Execution](../design/federated.md). -- **`@link(left="", right="", ...)`** +**`@link(left="", right="", ...)`**{ .api-sig } + +Binds an LF connection (logical connection between reactor ports) to a specific network channel. This annotation tells the code generator that the following LF connection should be transmitted over the specified network interfaces (defined via `@interface_*` annotations). - Binds an LF connection (logical connection between reactor ports) to a specific network channel. This annotation tells the code generator that the following LF connection should be transmitted over the specified network interfaces (defined via `@interface_*` annotations). +Multiple LF connections can share the same network channel by using the same `@link` configuration - they will be multiplexed over a single physical connection. - Multiple LF connections can share the same network channel by using the same `@link` configuration - they will be multiplexed over a single physical connection. +**Parameters:** - **Parameters:** +- `left`: Name of the interface on the sending (upstream) federate +- `right`: Name of the interface on the receiving (downstream) federate +- `server_side` (optional): Which side acts as server (`"left"` or `"right"`) +- `server_port` (optional): Port number for the server - - `left`: Name of the interface on the sending (upstream) federate - - `right`: Name of the interface on the receiving (downstream) federate - - `server_side` (optional): Which side acts as server (`"left"` or `"right"`) - - `server_port` (optional): Port number for the server +**Example:** +```lf +federated reactor { + @interface_tcp(name="if1", address="127.0.0.1") + r1 = new Src() - **Example:** - ```lf - federated reactor { - @interface_tcp(name="if1", address="127.0.0.1") - r1 = new Src() + @interface_tcp(name="if1", address="127.0.0.1") + r2 = new Dst() - @interface_tcp(name="if1", address="127.0.0.1") - r2 = new Dst() + // This LF connection will use the TCP network channel + @link(left="if1", right="if1", server_side="right", server_port=1042) + r1.out -> r2.in +} +``` - // This LF connection will use the TCP network channel - @link(left="if1", right="if1", server_side="right", server_port=1042) - r1.out -> r2.in - } - ``` +For more details, see [Federated Execution - Configuring Network Interfaces](../design/federated.md#configuring-network-interfaces). - For more details, see [Federated Execution - Configuring Network Interfaces](../design/federated.md#configuring-network-interfaces). +**`@maxwait()`**{ .api-sig } -- **`@maxwait()`** +Controls how long a federate waits for messages from neighboring federates before advancing to a new tag. This is checked during tag acquisition: if an input connection hasn't received a message for the requested tag (`last_known_tag < next_tag`), the scheduler waits up to `maxwait` before proceeding. - Controls how long a federate waits for messages from neighboring federates before advancing to a new tag. This is checked during tag acquisition: if an input connection hasn't received a message for the requested tag (`last_known_tag < next_tag`), the scheduler waits up to `maxwait` before proceeding. +This is distinct from STP (Safe-To-Process) violations, which occur when a message arrives for a tag that has already been processed. - This is distinct from STP (Safe-To-Process) violations, which occur when a message arrives for a tag that has already been processed. +Can be applied to: - Can be applied to: +- **Federate instantiations**: Sets the baseline maxwait for all incoming connections +- **Individual connections**: Overrides the baseline for specific connections - - **Federate instantiations**: Sets the baseline maxwait for all incoming connections - - **Individual connections**: Overrides the baseline for specific connections +**Parameters:** - **Parameters:** +- ``: Duration (e.g., `100 ms`, `1 sec`) or special values: + - `0`: No waiting; advance immediately regardless of unresolved inputs + - `forever`: Wait indefinitely until a message arrives for the tag - - ``: Duration (e.g., `100 ms`, `1 sec`) or special values: - - `0`: No waiting; advance immediately regardless of unresolved inputs - - `forever`: Wait indefinitely until a message arrives for the tag +**Example:** +```lf +federated reactor { + r1 = new Src() + @maxwait(0) // Baseline: no waiting + r2 = new Dst() + @maxwait(forever) // Override: wait indefinitely for this connection + r1.out -> r2.in +} +``` - **Example:** - ```lf - federated reactor { - r1 = new Src() - @maxwait(0) // Baseline: no waiting - r2 = new Dst() - @maxwait(forever) // Override: wait indefinitely for this connection - r1.out -> r2.in - } - ``` +For detailed usage, see [Federated Execution - Tag Acquisition and @maxwait](../design/federated.md#tag-acquisition-and-maxwait). - For detailed usage, see [Federated Execution - Tag Acquisition and @maxwait](../design/federated.md#tag-acquisition-and-maxwait). +**`@joining_policy(policy="")`**{ .api-sig } -- **`@joining_policy(policy="")`** - - Controls how federates synchronize when joining a federation. - - **Policies:** - - `"TIMER_ALIGNED"`: Synchronize to a common time reference - - `"IMMEDIATELY"`: Begin execution immediately +Controls how federates synchronize when joining a federation. + +**Policies:** + +- `"TIMER_ALIGNED"`: Synchronize to a common time reference +- `"IMMEDIATELY"`: Begin execution immediately ## Clock Synchronization Configure distributed clock synchronization across federated systems. -- **`@clock_sync(grandmaster=true, period=3500000000, max_adj=512000, kp=0.5, ki=0.1)`** - - Enable and configure clock synchronization using a PTP-like protocol for precise time alignment across federates. - - **Parameters:** - - - `grandmaster`: Whether this federate is the time reference (true/false) - - `period`: Synchronization period in nanoseconds - - `max_adj`: Maximum clock adjustment per sync cycle (nanoseconds) - - `kp`: Proportional controller gain - - `ki`: Integral controller gain +**`@clock_sync(grandmaster=true, period=3500000000, max_adj=512000, kp=0.5, ki=0.1)`**{ .api-sig } + +Enable and configure clock synchronization using a PTP-like protocol for precise time alignment across federates. + +**Parameters:** + +- `grandmaster`: Whether this federate is the time reference (true/false) +- `period`: Synchronization period in nanoseconds +- `max_adj`: Maximum clock adjustment per sync cycle (nanoseconds) +- `kp`: Proportional controller gain +- `ki`: Integral controller gain ## Legacy Annotations (Not Supported) diff --git a/docs/documentation/reaction_api.md b/docs/documentation/reaction_api.md index aed329f..367dc3b 100644 --- a/docs/documentation/reaction_api.md +++ b/docs/documentation/reaction_api.md @@ -1,47 +1,45 @@ # Reaction API -The Reaction API provides functions and macros for use within reaction bodies, deadline violation handlers, and STP (Safe to Process) violation handlers. A pointer to the `Environment` is automatically available as `env` within reaction scope, enabling access to the environment API. Furthermore points to all effects, oberservers and sources are also made available. - -```lf -reaction(t) {= - instant_t now = env->get_logical_time(env); -=} -``` +The Reaction API provides functions and macros for use within reaction bodies, deadline violation handlers, and tardy violation handlers. A pointer to the `Environment` is automatically available as `env` within reaction scope, enabling access to the environment API. Furthermore, pointers to all effects, triggers, and sources are also made available. ## Time Query Functions Query the current logical and physical time within the reactor system. -- **`env->get_logical_time(env)`** +**`env->get_logical_time(env)`**{ .api-sig } Returns the current logical time of the reactor system. **Returns:** `instant_t` — Current logical time in nanoseconds **Example:** -```c -instant_t now = env->get_logical_time(env); + +```lf +reaction(t) {= + instant_t now = env->get_logical_time(env); + ... +=} ``` -- **`env->get_elapsed_logical_time(env)`** +**`env->get_elapsed_logical_time(env)`**{ .api-sig } Returns the elapsed logical time since the program started. **Returns:** `instant_t` — Elapsed logical time in nanoseconds -- **`env->get_physical_time(env)`** +**`env->get_physical_time(env)`**{ .api-sig } Returns the current physical (wall-clock) time. **Returns:** `instant_t` — Current physical time in nanoseconds -- **`env->get_elapsed_physical_time(env)`** +**`env->get_elapsed_physical_time(env)`**{ .api-sig } Returns the elapsed physical time since the program started. **Returns:** `instant_t` — Elapsed physical time in nanoseconds -- **`env->get_lag(env)`** +**`env->get_lag(env)`**{ .api-sig } Returns the difference between logical and physical time (lag). A positive value indicates the system is keeping up with real-time. @@ -49,7 +47,7 @@ Returns the difference between logical and physical time (lag). A positive value ## Synchronization and Waiting -- **`env->wait_for(env, duration)`** +**`env->wait_for(env, duration)`**{ .api-sig } Blocks the current reaction until the specified duration has elapsed. @@ -60,11 +58,11 @@ Blocks the current reaction until the specified duration has elapsed. Protect shared resources in concurrent environments. -- **`env->enter_critical_section(env)`** +**`env->enter_critical_section(env)`**{ .api-sig } Enters a critical section. No other reactions will execute until the critical section is left. -- **`env->leave_critical_section(env)`** +**`env->leave_critical_section(env)`**{ .api-sig } Leaves the current critical section, allowing other reactions to execute. @@ -78,7 +76,7 @@ env->leave_critical_section(env); ## Shutdown Control -- **`env->request_shutdown(env, time)`** +**`env->request_shutdown(env, time)`**{ .api-sig } Requests that the reactor system shut down gracefully after the specified time. @@ -89,9 +87,13 @@ Requests that the reactor system shut down gracefully after the specified time. ## Port Operations Read and write values on reactor ports. +To read the value of an input port, simply reference +`port->value` (or `port[i]-value` for a multiport), +where `port` is replaced with the port name. + +**`lf_set(port, value)`**{ .api-sig } -- **`lf_set(port, value)`** -- **`lf_set(port)`** +**`lf_set(port)`**{ .api-sig } Sets the value of an output port. @@ -104,7 +106,7 @@ Sets the value of an output port. lf_set(output, 42); ``` -- **`lf_set_array(port, length, array)`** +**`lf_set_array(port, length, array)`**{ .api-sig } Sets an array value on an output port. @@ -119,18 +121,7 @@ int values[] = {1, 2, 3}; lf_set_array(output, 3, values); ``` -- **`lf_get(port)`** - -Reads the current value from an input port. - -**Returns:** Current port value (type depends on port declaration) - -**Example:** -```c -int value = lf_get(input); -``` - -- **`lf_is_present(port)`** +**`lf_is_present(port)`**{ .api-sig } Checks if a port has a value present at the current logical time. @@ -139,7 +130,7 @@ Checks if a port has a value present at the current logical time. **Example:** ```c if (lf_is_present(input)) { - int value = lf_get(input); + int value = input->value; } ``` @@ -147,7 +138,7 @@ if (lf_is_present(input)) { Schedule logical actions to occur at a future logical time. -- **`lf_schedule(action, delay)`** +**`lf_schedule(action, delay)`**{ .api-sig } Schedules an action to trigger after the specified delay. @@ -160,7 +151,7 @@ Schedules an action to trigger after the specified delay. lf_schedule(my_action, MSEC(100)); // Schedule 100ms in the future ``` -- **`lf_schedule_array(action, delay, length, array)`** +**`lf_schedule_array(action, delay, length, array)`**{ .api-sig } Schedules an action with array payload to trigger after the specified delay. diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index a12ca9f..4b276d1 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -4,7 +4,7 @@ This guide walks you through setting up your first micro-LF project. ## Prerequisites -All platforms require: +The code generator requires: - **Git** - [git-scm.com](https://git-scm.com/) - **Java 17** - [openjdk.org](https://openjdk.org/projects/jdk/17/) (for the Lingua Franca compiler) @@ -13,6 +13,7 @@ Platform-specific tools: | Platform | Additional Requirements | |----------|------------------------| +| Native | cmake | | Zephyr | Python 3, west, Zephyr SDK | | RIOT | make 4.0+, ARM cross-compiler | | Pico | CMake, ARM cross-compiler, picotool | @@ -30,7 +31,7 @@ export REACTOR_UC_PATH=$(pwd)/reactor-uc ### 2. Clone a template repository -Choose a template for your target platform: +Choose a template for your target platform (except "Native", which does not need a template repo):
@@ -113,6 +114,13 @@ Choose a template for your target platform: ### 3. Build and run +=== "Native" + + ```bash + ulfc src/MyProgram.lf + bin/MyProgram + ``` + === "Zephyr" ```bash diff --git a/docs/index.md b/docs/index.md index 519b6b0..0b38399 100644 --- a/docs/index.md +++ b/docs/index.md @@ -60,6 +60,12 @@ [:octicons-arrow-right-24: FreeRTOS](platforms/freertos/index.md) +- :fontawesome-brands-linux:{ style="font-size: 48px" } + + --- + + [:octicons-arrow-right-24: POSIX (Linux / macOS)](platforms/posix/index.md) +
## Lingua Franca diff --git a/docs/platforms/posix/index.md b/docs/platforms/posix/index.md new file mode 100644 index 0000000..867dc8c --- /dev/null +++ b/docs/platforms/posix/index.md @@ -0,0 +1,36 @@ +# POSIX (Linux / macOS) + +The Native platform target compiles and runs micro-LF programs directly on POSIX-compatible operating systems. Both **Linux** and **macOS** are supported with no additional hardware or cross-compilation toolchain required. + +## Setup + +No platform-specific dependencies are needed beyond a standard C compiler (e.g. `gcc` or `clang`) and `cmake`. These are typically pre-installed on macOS (via Xcode Command Line Tools) and available through your distribution's package manager on Linux. + +## Usage + +Add the `@platform("Native")` attribute to your main reactor (or to the federated top-level reactor): + +```lf +@platform("Native") +main reactor { + ... +} +``` + +When you run the compiler, it will compile the generated C code for the native host platform and place the resulting executable binary in the `bin/` directory of your project: + +```bash +bin/MyApp +``` + +## Federated Programs + +The same attribute applies to the top-level federated reactor: + +```lf +@platform("Native") +federated reactor MyFederatedApp { + ... +} +``` + diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 056fb55..499cdd1 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -43,4 +43,26 @@ display: flex; flex-direction: column; justify-content: space-between; +} + +/* API function signature blocks */ +.api-sig { + display: block; + background-color: #e8ecf8; + border-top: 1px solid #c0c9ed; + border-bottom: 1px solid #c0c9ed; + padding: 0.45em 0.8em; + border-radius: 4px; + margin: 1.2em 0 0.4em 0; + font-size: 1em; +} + +.api-sig code { + background-color: transparent; +} + +[data-md-color-scheme="slate"] .api-sig { + background-color: rgba(50, 66, 168, 0.4); + border-top-color: rgba(100, 120, 220, 0.7); + border-bottom-color: rgba(100, 120, 220, 0.7); } \ No newline at end of file diff --git a/mkdocs.yaml b/mkdocs.yaml index ef7e8b8..b657b3f 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -34,6 +34,7 @@ nav: - FreeRTOS: platforms/freertos/index.md - ESP-IDF: platforms/esp-idf/index.md - Patmos: platforms/patmos/index.md + - POSIX (Linux / macOS): platforms/posix/index.md theme: name: material