Type-safe Interfaces for Heterogeneous Embedded Systems.
One YAML. Four Languages. Generated code for FPGA, C, C++ and Python — including glue code across all boundaries.
embgen doesn't replace your code generator — it's the missing layer that keeps your hardware and software interfaces consistent.
The Problem
Manual Interface Synchronization
FPGA engineer changes a register — firmware developer and test team must manually follow suit. Every change is a risk.
Error-prone Glue Layers
FPGA-to-C, C-to-C++, C++-to-Python transitions are hand-written. Type mismatches and alignment errors cost days of debugging.
No Single Source of Truth
Register docs in Excel, C headers maintained manually, Python wrappers outdated. Three truths — none of them current.
Features
One YAML file. Four languages. Fully type-safe.
Code Generation
Generate type-safe code for VHDL, C, C++ and Python from a single YAML definition. Consistent and reproducible.
- VHDL: AXI-Lite Entities, Config Packages, AXI-Stream FIFO
- C: volatile structs, bitfield macros, HAL functions, DMA ring buffer
- C++: RAII wrappers, virtual interfaces, std::function observer, template ring buffer
- Python: ctypes descriptors, cffi/pybind11, dataclasses
embgen generate system.yml --targets vhdl,c,cpp,python
Automatic Glue Code
Every language boundary is automatically bridged — type-safe and without boilerplate.
- FPGA → C: Platform HAL (Linux/bare-metal), mmap, DMA, IRQ handler
- C → C++: extern "C" wrapper, RAII bridge, std::function event bridge
- C++ → Python: pybind11 modules or ctypes fallback
- CMakeLists.txt + pyproject.toml with --build-system flag
embgen generate system.yml --build-system
Incremental Generation
Content hash comparison instead of timestamps — only changed files are written.
- SHA256-based content hash excluding timestamp lines
- --force flag: rewrite everything, --clean: remove orphans
- Manifest-based cleanup: removed interfaces = removed files
- Status: "65 file(s) (3 written, 62 unchanged)"
embgen generate system.yml --clean
Compliance & Traceability
CycloneDX SBOM, compliance reports and seamless embtrace integration for EU CRA.
- CycloneDX 1.5 SBOM export from interfaces.yaml
- Interface compliance reports: orphans, SHA256 integrity, coverage
- interfaces.yaml as integration artifact for embtrace
- PlantUML diagrams and manifest diff
embgen sbom interfaces.yaml --format json
5 Interface Types
Each type generates language-specific artifacts — from VHDL entities to Python descriptors.
register
Memory-mapped read/write registers with bitfield definitions and automatic address calculation.
function
Synchronous call/return. For HAL abstractions and driver APIs.
event
Asynchronous notifications. IRQs, callbacks and observer pattern.
stream
Continuous data streams. For high-throughput sensor data and signal processing.
config
Static parameters. Compile-time constants consistent across all languages.
4x4 Boundary Matrix
Every provider/consumer combination generates matching glue code. Automatically resolved.
Import / Export
Import existing models, export to industry standards.
Enterprise Architect / XMI
ImportConvert XMI 2.1 exports from Enterprise Architect directly into an embgen system.yml. Stereotype-based mapping.
embgen import xmi diagram.xmi --output system.yml
SystemRDL
ImportImport SystemRDL register definitions (.rdl) directly. Access mapping, reset values, field descriptions.
embgen import systemrdl registers.rdl -o system.yml
IP-XACT (IEEE 1685)
Import ExportImport and export IP-XACT XML. Dual namespace support (2014 + 2009) for FPGA vendor tools.
embgen import ip-xact component.xml -o system.yml embgen export ip-xact system.yml -o component.xml
SysML v2
ImportImport SysML v2 JSON or REST API (SysON). Heuristic type/kind inference from PartDefinitions and Ports.
embgen import sysml --json-file model.json -o system.yml embgen import sysml --base-url URL --project-id ID
One YAML, Four Languages
A single declarative system definition generates consistent code across all language boundaries.
system.yml (Input)
system: name: sensor_platform version: "1.0.0" components: - id: adc_frontend type: fpga provides: - id: adc_ctrl kind: register fields: - name: enable bits: "0" access: rw - name: sample_rate bits: "15:8" access: rw - id: adc_data kind: stream data_type: int16 - id: signal_proc type: cpp consumes: [adc_frontend.adc_ctrl, adc_frontend.adc_data] - id: test_gui type: python consumes: [signal_proc.processed]
Generated Output
embgen generate system.yml --targets vhdl,c,cpp,python gen/ vhdl/ adc_frontend_adc_ctrl_pkg.vhd adc_frontend_adc_ctrl_axi.vhd adc_frontend_adc_data_axis.vhd c/ adc_frontend_adc_ctrl.h adc_frontend_adc_data_stream.h cpp/ adc_frontend_adc_ctrl_wrapper.hpp adc_frontend_adc_data_buffer.hpp python/ adc_frontend_adc_ctrl.py glue/ fpga_to_c_adc_ctrl_hal.c fpga_to_c_adc_data_dma.c c_to_cpp_adc_ctrl_bridge.cpp cpp_to_python_pybind.cpp interfaces.yaml 15 file(s) generated (15 written, 0 unchanged)
License Model
Open-core: Free to start, professional features when you need them.
Community
Free
For evaluation and small projects
- Register interface type
- 1 target language (VHDL or C)
- embgen validate + generate
- embgen info + schema
- No glue code
- No import/export
Professional
On Request
For productive embedded teams
- All 5 interface types
- All 4 targets (VHDL, C, C++, Python)
- Automatic glue code
- Manifest, Diagram, Diff, SBOM
- Compliance reports
- EA/XMI import, template overrides
Enterprise
On Request
For Large Enterprises and OEMs
- Everything from Professional
- SystemRDL Import
- IP-XACT Import + Export (IEEE 1685)
- SysML v2 Import (JSON + REST API)
- Unlimited components
- Priority support
embgen + embtrace
Two tools, one end-to-end workflow for CRA-compliant embedded systems.
Seamless Integration
-
embgen generates type-safe interfaces and produces
interfaces.yamlas a manifest -
embtrace uses
interfaces.yamlas input for interface SBOM and compliance tracking - CycloneDX SBOM from embgen feeds directly into embtrace SBOM merge
- Compliance reports from embgen become part of the embtrace evidence package
Architecture
embgen embtrace ┌──────────────┐ ┌──────────────────┐ │ system.yml │ │ Yocto/Buildroot │ └──────┬───────┘ └────────┬─────────┘ │ │ embgen generate embtrace sbom import │ │ ┌──────┴───────┐ ┌────────┴─────────┐ │ VHDL, C, C++ │ │ Product SBOM │ │ Python, Glue │ │ (CycloneDX 1.5) │ └──────┬───────┘ └────────┬─────────┘ │ │ ┌──────┴───────┐ │ │ interfaces │──────────────────►│ │ .yaml │ Interface-SBOM │ └──────────────┘ │ │ ┌────────┴─────────┐ │ CRA Evidence │ │ Package │ └──────────────────┘
Developed by Innomatica GmbH — based on over 10 years of experience in embedded software development for heterogeneous SoC platforms.
embgen was born from daily work with the TC4 test system — 23 Zynq modules with FPGA, Cortex-A53, Cortex-R5F and Python test environment. Real-world dogfooding instead of theoretical feature lists.
Ready for Consistent Interfaces?
We help embedded teams automate their interface layers — from the YAML definition to the generated code.