Rumoca
Note: Rumoca is in early development. While already usable for many practical tasks, you may encounter issues. Please file bug reports to help improve the compiler. APIs may change between releases.
A Modelica compiler written in Rust. Rumoca parses Modelica source files and exports to the DAE IR Format supporting both implicit and explicit model serialization), or via user customizable template leveraging minijinja. The DAE IR format is consumed by Cyecca (see the ir branch for ongoing integration) for model simulation, analysis, and Python library integration with CasADi, SymPy, and other backends planned (e.g. Jax).
Future targets include:
- Export: eFMI/GALEC
- Import: Base Modelica (MCP-0031) to interface with more mature compilers (OpenModelica, Dymola, etc.)
Tools
| Tool | Description |
|---|---|
rumoca |
Main compiler - parses Modelica and exports DAE IR (JSON) |
rumoca-fmt |
Code formatter for Modelica files (like rustfmt) |
rumoca-lint |
Linter for Modelica files (like clippy) |
rumoca-lsp |
Language Server Protocol server for editor integration |
| VSCode Extension | Full Modelica IDE support via the Rumoca Modelica extension |
Installation
Compiler, Formatter, and Linter
Python Package
The Python package bundles the Rust compiler, so no separate Rust installation is needed:
# Compile a Modelica file
=
# Get as JSON string or Python dict
=
=
# Compile from string (requires native bindings)
=
VSCode Extension
Prerequisites:
-
Install Rust if you haven't already (Windows users: see rustup.rs for installer):
| -
Ensure
~/.cargo/binis in your PATH (the rustup installer typically adds this automatically). You may need to restart your terminal or run: -
Install the language server:
Install the Extension:
Search for "Rumoca Modelica" in the VSCode Extensions marketplace, or install from the marketplace page.
Features:
- Syntax highlighting (semantic tokens)
- Real-time diagnostics
- Autocomplete for keywords, built-in functions, and class members
- Go to definition / Find references
- Document symbols and outline
- Code formatting
- Hover information
- Signature help
- Code folding
- Inlay hints
- Code lens with reference counts
- Rename symbol
- Call hierarchy
- Document links
Quick Start
Compile to DAE IR (JSON)
Format Modelica Files
# Format all .mo files in current directory
# Check formatting (CI mode)
# Format specific files
# Use 4-space indentation
# Configure blank lines between classes
Configuration: Create .rumoca_fmt.toml or rumoca_fmt.toml in your project:
= 2
= false
= 100
= 1
Lint Modelica Files
# Lint all .mo files in current directory
# Lint specific files
# Show only warnings and errors
# Output as JSON (for CI integration)
# List available lint rules
# Exit with error on warnings (CI mode)
Available Lint Rules:
| Rule | Level | Description |
|---|---|---|
naming-convention |
note | CamelCase for types, camelCase for variables |
missing-documentation |
note | Classes without documentation strings |
unused-variable |
warning | Declared but unused variables |
undefined-reference |
error | References to undefined variables |
parameter-no-default |
help | Parameters without default values |
empty-section |
note | Empty equation or algorithm sections |
magic-number |
help | Magic numbers that should be constants |
complex-expression |
note | Overly complex/deeply nested expressions |
inconsistent-units |
warning | Potential unit inconsistencies |
redundant-extends |
warning | Duplicate or circular extends |
Configuration: Create .rumoca_lint.toml or rumoca_lint.toml in your project. The linter searches for config files starting from the file's directory and walking up to parent directories:
= "warning" # help, note, warning, error
= ["magic-number", "missing-documentation"]
= false # exit with error on warnings
CLI options override config file settings.
Library Usage
[]
= "0.7"
use Compiler;
Use with Cyecca
=
# Use model for simulation, analysis, code generation, etc.
Custom Code Generation with Templates
Rumoca supports MiniJinja templates for custom code generation:
# Generate CasADi Python code
# Generate SymPy code
The DAE structure is passed to templates as the dae variable. Example template:
# Generated from {{ dae.model_name }}
{% for name, comp in dae.x | items %}
{{ name }}: {{ comp.type_name }} (start={{ comp.start }})
{% endfor %}
See templates/examples/ for complete template examples (CasADi, SymPy, Base Modelica).
Modelica Language Support
Fully Supported
- Class definitions:
model,class,block,connector,record,type,package,function - Components: Declarations with modifications, array subscripts
- Inheritance:
extendsclause with recursive resolution - Equations: Simple, connect, if, for, when equations
- Algorithms: Assignment, if, for, while, when statements
- Expressions: Binary/unary operators, function calls, if-expressions, arrays
- Type prefixes:
flow,stream,discrete,parameter,constant,input,output - Modifications: Component and class modifications
- Packages: Nested packages,
package.mo/package.orderdirectory structure, MODELICAPATH - Imports: Qualified, renamed, unqualified (
.*), selective ({a,b}) - Functions: Single and multi-output functions, tuple equations
(a,b) = func() - Built-in operators:
der(),pre(),reinit(),time, trig functions, array functions - Event functions:
noEvent,smooth,sample,edge,change,initial,terminal - Annotations: Parsed and exported to JSON on components
Partially Supported
| Feature | Status |
|---|---|
| Connect equations | Flow/potential semantics implemented; stream not yet supported |
| External functions | external keyword recognized; no linking |
Not Yet Implemented
| Feature | Notes |
|---|---|
| Stream connectors | inStream, actualStream operators |
| Inner/outer | Keywords recognized; lookup not implemented |
| Redeclarations | redeclare, replaceable parsed only |
| Overloaded operators | operator class prefix recognized only |
| State machines | Synchronous language elements (Ch. 17) |
| Expandable connectors | Dynamic connector sizing |
| Overconstrained connectors | Connections.root, branch, etc. |
Architecture
Modelica Source -> Parse -> Flatten -> BLT -> DAE -> DAE IR (JSON)
(AST) (Flat) (Match) (DAE)
|
Cyecca
|
CasADi/SymPy/JAX/etc.
Structural Analysis:
- Hopcroft-Karp matching (O(E√V)) for equation-variable assignment
- Tarjan's SCC algorithm for topological ordering and algebraic loop detection
- Pantelides algorithm for DAE index reduction (detects high-index systems)
- Tearing for algebraic loops (reduces nonlinear system size)
Development
# Build
# Run tests
# Check formatting
# Lint
Contributing
Contributions welcome! All contributions must be made under the Apache-2.0 license.
License
Apache-2.0 (LICENSE)
Citation
See Also
- Modelica IR - DAE IR specification
- Cyecca - Model simulation, analysis, and code generation
- Base Modelica (MCP-0031) - Planned import format
- eFMI/GALEC - Planned export format
- Modelica Language