Typsichere Interfaces für heterogene Embedded-Systeme.

Ein YAML. Vier Sprachen. Generierter Code für FPGA, C, C++ und Python — inklusive Glue-Code über alle Grenzen hinweg.

embgen ersetzt nicht euren Codegenerator — es ist die fehlende Schicht, die eure Hardware- und Software-Interfaces konsistent hält.

Das Problem

Manuelle Interface-Synchronisation

FPGA-Ingenieur ändert ein Register — Firmware-Entwickler und Test-Team müssen manuell nachziehen. Jede Änderung ein Risiko.

Fehleranfällige Glue-Schichten

FPGA-to-C, C-to-C++, C++-to-Python Übergänge sind handgeschrieben. Typ-Mismatches und Alignment-Fehler kosten Tage im Debugging.

Keine Single Source of Truth

Register-Docs in Excel, C-Header manuell gepflegt, Python-Wrapper veraltet. Drei Wahrheiten — keine davon aktuell.

Features

Eine YAML-Datei. Vier Sprachen. Vollständig typsicher.

Code-Generierung

Aus einer YAML-Definition typsicheren Code für VHDL, C, C++ und Python generieren. Konsistent und reproduzierbar.

  • VHDL: AXI-Lite Entities, Config-Packages, AXI-Stream FIFO
  • C: volatile structs, Bitfield-Makros, HAL-Funktionen, DMA Ring-Buffer
  • C++: RAII-Wrapper, virtual Interfaces, std::function Observer, Template Ring-Buffer
  • Python: ctypes-Deskriptoren, cffi/pybind11, dataclasses
embgen generate system.yml --targets vhdl,c,cpp,python

Automatischer Glue-Code

Jede Sprachgrenze wird automatisch überbrückt — typsicher und ohne 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-Module oder ctypes-Fallback
  • CMakeLists.txt + pyproject.toml mit --build-system Flag
embgen generate system.yml --build-system

Inkrementelle Generierung

Content-Hash-Vergleich statt Timestamp — nur geänderte Dateien werden geschrieben.

  • SHA256-basierter Content-Hash ohne Timestamp-Zeile
  • --force Flag: Alles neu schreiben, --clean: Waisen löschen
  • Manifest-basiertes Cleanup: entfernte Interfaces = entfernte Dateien
  • Status: "65 file(s) (3 written, 62 unchanged)"
embgen generate system.yml --clean

Compliance & Traceability

CycloneDX SBOM, Compliance-Reports und nahtlose embtrace-Integration für EU CRA.

  • CycloneDX 1.5 SBOM-Export aus interfaces.yaml
  • Interface-Compliance-Reports: Orphans, SHA256-Integrität, Coverage
  • interfaces.yaml als Integrations-Artefakt zu embtrace
  • PlantUML-Diagramme und Manifest-Diff
embgen sbom interfaces.yaml --format json

5 Interface-Typen

Jeder Typ erzeugt sprachspezifische Artefakte — von VHDL-Entities bis Python-Deskriptoren.

register

Memory-mapped Read/Write Register mit Bitfeld-Definitionen und automatischer Address-Berechnung.

VHDL: AXI-Lite Slave Entity
C: volatile struct + Bitfield-Makros
C++: RAII Register-Wrapper
Python: ctypes-Deskriptoren

function

Synchroner Call/Return. Für HAL-Abstraktionen und Treiber-APIs.

C: HAL-Funktionsprototypen + Error-Codes
C++: Pure virtual Interface
Python: ctypes/cffi Wrapper

event

Asynchrone Benachrichtigungen. IRQs, Callbacks und Observer-Pattern.

VHDL: IRQ Pulse
C: IRQ Handler
C++: std::function Observer
Python: queue/signal

stream

Kontinuierliche Datenströme. Für High-Throughput Sensor-Daten und Signalverarbeitung.

VHDL: AXI-Stream Entity (FIFO)
C: DMA Ring-Buffer
C++: span/iterator Template
Python: shared memory

config

Statische Parameter. Compile-Time-Konstanten über alle Sprachen hinweg konsistent.

VHDL: Generics (Package)
C: const struct
C++: constexpr
Python: dataclass

4x4 Boundary-Matrix

Jede Provider/Consumer-Kombination erzeugt passenden Glue-Code. Automatisch aufgelöst.

fpga → c: mmap + DMA + IRQ
c → cpp: extern "C" + RAII
cpp → python: pybind11 / ctypes
internal: Sprach-native Aufrufe

Import / Export

Bestehende Modelle importieren, in Industrie-Standards exportieren.

Enterprise Architect / XMI

Import

XMI 2.1 Export aus Enterprise Architect direkt in ein embgen system.yml konvertieren. Stereotyp-basiertes Mapping.

embgen import xmi diagram.xmi --output system.yml

SystemRDL

Import

SystemRDL-Register-Definitionen (.rdl) direkt importieren. Access-Mapping, Reset-Values, Feld-Beschreibungen.

embgen import systemrdl registers.rdl -o system.yml

IP-XACT (IEEE 1685)

Import Export

IP-XACT XML importieren und exportieren. Dual-Namespace-Support (2014 + 2009) für FPGA-Vendor-Tools.

embgen import ip-xact component.xml -o system.yml
embgen export ip-xact system.yml -o component.xml

SysML v2

Import

SysML v2 JSON oder REST-API (SysON) importieren. Heuristische Typ-/Kind-Inferenz aus PartDefinitions und Ports.

embgen import sysml --json-file model.json -o system.yml
embgen import sysml --base-url URL --project-id ID

Ein YAML, vier Sprachen

Eine deklarative Systemdefinition erzeugt konsistenten Code über alle Sprachgrenzen.

system.yml (Eingabe)

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]

Generierter 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)

Lizenz-Modell

Open-Core: Kostenloser Einstieg, professionelle Features bei Bedarf.

Community

Kostenlos

Für Evaluation und kleine Projekte

  • Register-Interface-Typ
  • 1 Target-Sprache (VHDL oder C)
  • embgen validate + generate
  • embgen info + schema
  • Kein Glue-Code
  • Kein Import/Export
Empfohlen

Professional

Auf Anfrage

Für produktive Embedded-Teams

  • Alle 5 Interface-Typen
  • Alle 4 Targets (VHDL, C, C++, Python)
  • Automatischer Glue-Code
  • Manifest, Diagram, Diff, SBOM
  • Compliance-Reports
  • EA/XMI Import, Template-Overrides

Enterprise

Auf Anfrage

Für Grossunternehmen und OEMs

  • Alles aus Professional
  • SystemRDL Import
  • IP-XACT Import + Export (IEEE 1685)
  • SysML v2 Import (JSON + REST API)
  • Unbegrenzte Komponenten
  • Prioritäts-Support

embgen + embtrace

Zwei Tools, ein durchgängiger Workflow für CRA-konforme Embedded-Systeme.

Nahtlose Integration

  • embgen generiert typsichere Interfaces und erzeugt interfaces.yaml als Manifest
  • embtrace nutzt interfaces.yaml als Input für Interface-SBOM und Compliance-Tracking
  • CycloneDX SBOM aus embgen fliesst direkt in embtrace SBOM-Merge ein
  • Compliance-Reports von embgen werden Teil des embtrace Evidence-Package

Architektur

              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         │
                                  └──────────────────┘
Ostfildern bei Stuttgart, Deutschland

Entwickelt von Innomatica GmbH — basierend auf über 10 Jahren Erfahrung in Embedded-Software-Entwicklung für heterogene SoC-Plattformen.

embgen entstand aus der täglichen Arbeit mit dem TC4-Testsystem — 23 Zynq-Module mit FPGA, Cortex-A53, Cortex-R5F und Python-Testumgebung. Reales Dogfooding statt theoretischer Feature-Listen.

536 Tests 91% Coverage mypy --strict v1.0.0

Bereit für konsistente Interfaces?

Wir helfen Embedded-Teams, ihre Interface-Schichten zu automatisieren — von der YAML-Definition bis zum generierten Code.

[email protected]