<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bojan Zivkovic</title>
    <description>The latest articles on Forem by Bojan Zivkovic (@bzivkovic86).</description>
    <link>https://forem.com/bzivkovic86</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3842240%2F96af7f70-6af3-450d-af80-0fff136b510d.png</url>
      <title>Forem: Bojan Zivkovic</title>
      <link>https://forem.com/bzivkovic86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bzivkovic86"/>
    <language>en</language>
    <item>
      <title>ARForge v1.3.0 — validation profiles, architecture reports, and ARXML export fixes</title>
      <dc:creator>Bojan Zivkovic</dc:creator>
      <pubDate>Tue, 21 Apr 2026 07:08:28 +0000</pubDate>
      <link>https://forem.com/bzivkovic86/arforge-v130-validation-profiles-architecture-reports-and-arxml-export-fixes-334b</link>
      <guid>https://forem.com/bzivkovic86/arforge-v130-validation-profiles-architecture-reports-and-arxml-export-fixes-334b</guid>
      <description>&lt;p&gt;v1.3.0 focuses on making ARForge useful beyond modeling and export. Two new features address real workflow gaps: extensible validation for project-specific governance, and an architecture report command that produces documentation directly from the validated model. A round of ARXML export fixes continues the push toward rock-solid checker compatibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Validation extension system
&lt;/h2&gt;

&lt;p&gt;The core validation set in ARForge covers 191 semantic rules. That's a solid baseline, but real projects have their own requirements on top of that: naming conventions, structural policies, rules specific to a team's process or an OEM's requirements. Until now, accommodating those meant modifying ARForge internals.&lt;/p&gt;

&lt;p&gt;v1.3.0 introduces validation profiles. You write a YAML file that defines additional rules, enables or disables rules from the core set, and load it at validation time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;arforge validate project.yaml &lt;span class="nt"&gt;--profile&lt;/span&gt; profile.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A profile can run alongside the core rules or replace them entirely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;core+extensions&lt;/span&gt;   &lt;span class="c1"&gt;# or: extensions-only&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;disable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;CORE-046&lt;/span&gt;           &lt;span class="c1"&gt;# disable specific core rule&lt;/span&gt;
    &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PROJ-001&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SWC&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;names&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;must&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'Swc_'"&lt;/span&gt;
        &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;error&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;swc&lt;/span&gt;
        &lt;span class="na"&gt;check&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;name_prefix&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Swc_"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mechanism is built on the existing validation registry, so custom rules participate in the same finding code system, severity levels, and deterministic output ordering as core rules. The profile system is designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project-specific naming convention enforcement&lt;/li&gt;
&lt;li&gt;Structural policies that vary per program or OEM&lt;/li&gt;
&lt;li&gt;Selective disabling of rules that don't apply to a given project context&lt;/li&gt;
&lt;li&gt;Team-specific governance without patching ARForge core&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Architecture report command
&lt;/h2&gt;

&lt;p&gt;Every AUTOSAR project eventually needs architecture documentation for reviews, integration handoffs, and pull requests. In most projects that documentation is written by hand, maintained separately from the model, and gradually drifts out of sync.&lt;/p&gt;

&lt;p&gt;ARForge now generates it from the validated model directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;arforge report project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; report.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated Markdown report includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SWC count and list&lt;/li&gt;
&lt;li&gt;Interface counts by kind: Sender-Receiver, Client-Server, Mode-Switch&lt;/li&gt;
&lt;li&gt;Port counts: provides and requires&lt;/li&gt;
&lt;li&gt;Component prototype count&lt;/li&gt;
&lt;li&gt;Connector count&lt;/li&gt;
&lt;li&gt;Unconnected ports summary&lt;/li&gt;
&lt;li&gt;Unused elements summary&lt;/li&gt;
&lt;li&gt;Basic timing relationships derived from runnable event definitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output is deterministic, renders natively in GitHub markdown, and works as a CI/CD artifact. A sample report header looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# ARForge Architecture Report — DemoSystem&lt;/span&gt;

&lt;span class="gu"&gt;## Summary&lt;/span&gt;

| Metric | Count |
|--------|-------|
| SWC types | 5 |
| Sender-Receiver interfaces | 4 |
| Client-Server interfaces | 3 |
| Mode-Switch interfaces | 1 |
| Component prototypes | 6 |
| Assembly connectors | 11 |
| Unconnected ports | 2 |
| Unused elements | 0 |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The report command complements &lt;code&gt;validate&lt;/code&gt;. Validation tells you what is wrong. The report tells you what is there. Both are derived from the same source of truth — the validated YAML model.&lt;/p&gt;

&lt;p&gt;For CI/CD workflows, you can generate the report on every commit and attach it as an artifact. Architecture documentation that writes itself and is always current.&lt;/p&gt;




&lt;h2&gt;
  
  
  ARXML export and schema fixes
&lt;/h2&gt;

&lt;p&gt;v1.2.0 achieved the AUTOSAR File Checker passing with zero errors. v1.3.0 continues improving that baseline with a focused round of correctness fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client-server ARXML export structure corrected&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CLIENT-COM-SPEC&lt;/code&gt; emission fixed&lt;/li&gt;
&lt;li&gt;Operation references in client-server interfaces and ports corrected&lt;/li&gt;
&lt;li&gt;Event tag naming in generated ARXML fixed&lt;/li&gt;
&lt;li&gt;ModeDeclarationGroup export further improved&lt;/li&gt;
&lt;li&gt;Monolithic and split export alignment maintained&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Client-server communication in particular was an area with lingering structural issues. These fixes tighten the export to match what the AUTOSAR specification requires and what downstream tools expect.&lt;/p&gt;




&lt;h2&gt;
  
  
  The full pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YAML model
    │
    ▼
arforge validate      ← 191 core rules + optional project profiles
    │
    ├──▶ arforge report     ← Markdown architecture summary
    │                          for reviews, PRs, CI/CD artifacts
    │
    ├──▶ arforge export     ← schema-valid, checker-passing ARXML
    │                          monolithic or split
    │
    ├──▶ arforge diagram    ← PlantUML topology + per-SWC diagrams
    │                          renders in VS Code and GitHub markdown
    │
    └──▶ arforge generate   ← .c and .h skeletons per SWC
                               correct Rte_ signatures from model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every output is derived from the validated YAML model. Nothing is maintained separately. Nothing drifts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/bzivkovic1986/arforge
&lt;span class="nb"&gt;cd &lt;/span&gt;arforge
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Validate with optional profile&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli validate examples/autosar.project.yaml
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli validate examples/autosar.project.yaml &lt;span class="nt"&gt;--profile&lt;/span&gt; my-profile.yaml

&lt;span class="c"&gt;# Generate architecture report&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli report examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/report.md

&lt;span class="c"&gt;# Export ARXML&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli &lt;span class="nb"&gt;export &lt;/span&gt;examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/out

&lt;span class="c"&gt;# Generate diagrams&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli diagram examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/diagrams

&lt;span class="c"&gt;# Generate C skeletons&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli generate code examples/autosar.project.yaml &lt;span class="nt"&gt;--lang&lt;/span&gt; c &lt;span class="nt"&gt;--out&lt;/span&gt; build/code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full release notes at &lt;a href="https://github.com/bzivkovic1986/arforge/releases/tag/v1.3.0" rel="noopener noreferrer"&gt;github.com/bzivkovic1986/arforge/releases/tag/v1.3.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apache-2.0. Runs on Linux and Windows. No license server, no GUI dependency, no commercial toolchain required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: &lt;code&gt;autosar&lt;/code&gt; &lt;code&gt;embedded&lt;/code&gt; &lt;code&gt;opensource&lt;/code&gt; &lt;code&gt;automotive&lt;/code&gt; &lt;code&gt;cprogramming&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>autosar</category>
      <category>embedded</category>
      <category>opensource</category>
      <category>automotive</category>
    </item>
    <item>
      <title>ARForge v1.2.0 — Schema-valid ARXML, SubComposition support, and zero checker errors</title>
      <dc:creator>Bojan Zivkovic</dc:creator>
      <pubDate>Tue, 14 Apr 2026 12:06:09 +0000</pubDate>
      <link>https://forem.com/bzivkovic86/arforge-v120-schema-valid-arxml-subcomposition-support-and-zero-checker-errors-1ak3</link>
      <guid>https://forem.com/bzivkovic86/arforge-v120-schema-valid-arxml-subcomposition-support-and-zero-checker-errors-1ak3</guid>
      <description>&lt;p&gt;ARForge just hit a milestone that separates it from "tool that generates something that looks like ARXML" to "tool that generates correct ARXML."&lt;/p&gt;

&lt;p&gt;v1.2.0 passes the AUTOSAR File Checker with zero errors. Monolithic export. Split export. Both clean.&lt;/p&gt;

&lt;p&gt;If you work with AUTOSAR Classic, you know exactly why that line matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this release is different
&lt;/h2&gt;

&lt;p&gt;Previous versions of ARForge could model SWCs and compositions in YAML, validate them against 191 semantic rules, and export ARXML that was structurally plausible. But plausible is not the same as correct. Real AUTOSAR toolchains run checkers. Schema validators catch things that look right but aren't. Until now, ARForge output had gaps that would surface under that scrutiny.&lt;/p&gt;

&lt;p&gt;v1.2.0 closes those gaps. The generated ARXML is schema-valid, checker-passing, and consistent whether you export monolithic or split by SWC.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Full SubComposition support
&lt;/h3&gt;

&lt;p&gt;This is the feature that makes ARForge usable on real projects rather than examples.&lt;/p&gt;

&lt;p&gt;Real AUTOSAR system designs have hierarchy. A top-level composition contains sub-compositions, which contain component instances, which have ports connected at multiple levels. Without SubComposition support, any non-trivial architecture hit a modeling wall immediately.&lt;/p&gt;

&lt;p&gt;v1.2.0 adds full support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nested compositions as first-class model artifacts&lt;/li&gt;
&lt;li&gt;Delegation ports connecting outer composition ports to inner component ports&lt;/li&gt;
&lt;li&gt;Internal port connections within sub-compositions&lt;/li&gt;
&lt;li&gt;Correct ARXML generation for the full hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In YAML, a sub-composition looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;subCompositions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PowertrainSubSystem"&lt;/span&gt;
    &lt;span class="na"&gt;typeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PowertrainComposition"&lt;/span&gt;
    &lt;span class="na"&gt;delegationPorts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;outerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pp_VehicleSpeed"&lt;/span&gt;
        &lt;span class="na"&gt;innerComponent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedSensor_1"&lt;/span&gt;
        &lt;span class="na"&gt;innerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pp_VehicleSpeed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The export handles the full ARXML hierarchy correctly, including port mappings between levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Schema-valid ARXML across both export modes
&lt;/h3&gt;

&lt;p&gt;A persistent issue in earlier versions was that monolithic and split exports produced subtly different structures. Running a checker on one would pass where the other failed. This created a reliability problem — you couldn't trust the output without knowing which export mode had been validated.&lt;/p&gt;

&lt;p&gt;v1.2.0 unifies the export logic. Both modes now produce identical structure, deterministic element ordering, and schema-compliant output. The checker result is the same regardless of how you export.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Both of these now produce schema-valid, checker-passing output&lt;/span&gt;
arforge &lt;span class="nb"&gt;export &lt;/span&gt;demo-project/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/out
arforge &lt;span class="nb"&gt;export &lt;/span&gt;demo-project/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/out &lt;span class="nt"&gt;--split-by-swc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ModeDeclarationGroup fixes
&lt;/h3&gt;

&lt;p&gt;Mode handling had a number of structural issues that caused schema violations. v1.2.0 fixes them properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correct &lt;code&gt;CATEGORY = EXPLICIT_ORDER&lt;/code&gt; handling&lt;/li&gt;
&lt;li&gt;Proper &lt;code&gt;ON-TRANSITION-VALUE&lt;/code&gt; and per-mode &lt;code&gt;VALUE&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;Fixed placement of &lt;code&gt;INITIAL-MODE-REF&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Correct emission of &lt;code&gt;MODE-DECLARATIONS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Resolved unresolved mode references that previously caused checker failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These weren't cosmetic fixes. Invalid ModeDeclarationGroup structure produces ARXML that downstream tools reject. The generated output now matches what the AUTOSAR specification requires.&lt;/p&gt;

&lt;h3&gt;
  
  
  YAML model enhancements
&lt;/h3&gt;

&lt;p&gt;New modeling capabilities on the YAML side to support the above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;modeDeclarationGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BswMApplicationMode"&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXPLICIT_ORDER"&lt;/span&gt;
    &lt;span class="na"&gt;modes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;STARTUP"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="na"&gt;onTransitionValue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RUN"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="na"&gt;onTransitionValue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SHUTDOWN"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
        &lt;span class="na"&gt;onTransitionValue&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The checker result
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo080ganoqqram1hyjqwf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo080ganoqqram1hyjqwf.png" alt="AUTOSAR Checker Monolithic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5mu6k2a8nknzaux1yj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj5mu6k2a8nknzaux1yj3.png" alt="AUTOSAR Checker Split by SWC"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both exports. This is the line that matters for anyone who needs to hand off ARXML to a downstream tool, an integration partner, or a customer. The output is correct.&lt;/p&gt;




&lt;h2&gt;
  
  
  Known limitations
&lt;/h2&gt;

&lt;p&gt;Being transparent about what is not yet modeled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;HandleOutOfRange&lt;/code&gt; in ComSpecs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;supportsMultipleInstantiation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handleTerminationAndRestart&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Runnable &lt;code&gt;symbol&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ModeSwitchEvent&lt;/code&gt; activation&lt;/li&gt;
&lt;li&gt;Full delegation port data element mapping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are warning-level findings in the checker, not errors. They do not affect the validity of the generated output. They are on the roadmap.&lt;/p&gt;




&lt;h2&gt;
  
  
  Breaking change
&lt;/h2&gt;

&lt;p&gt;The ModeDeclarationGroup ARXML structure changed. If you were relying on the previously generated (invalid) structure, the new output will differ. The old structure was schema-invalid. The new one is correct.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where ARForge stands now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YAML model
    │
    ▼
arforge validate      ← 191 semantic rules, three severity levels
    │
    ├──▶ arforge export     ← schema-valid, checker-passing ARXML
    │                          monolithic or split, identical structure
    │
    ├──▶ arforge diagram    ← PlantUML topology + per-SWC diagrams
    │                          renders in VS Code and GitHub markdown
    │
    └──▶ arforge generate   ← .c and .h skeletons per SWC
                               correct Rte_ signatures from model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pipeline now produces output you can trust at every stage. The ARXML is correct. The diagrams reflect the actual model. The C skeletons derive from validated port definitions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/bzivkovic1986/arforge
&lt;span class="nb"&gt;cd &lt;/span&gt;arforge
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Validate&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli validate examples/autosar.project.yaml

&lt;span class="c"&gt;# Export — schema-valid, checker-passing&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli &lt;span class="nb"&gt;export &lt;/span&gt;examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/out

&lt;span class="c"&gt;# Generate diagrams&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli diagram examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/diagrams

&lt;span class="c"&gt;# Generate C skeletons&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli generate code examples/autosar.project.yaml &lt;span class="nt"&gt;--lang&lt;/span&gt; c &lt;span class="nt"&gt;--out&lt;/span&gt; build/code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VS Code integration with YAML schema autocomplete and inline diagnostics is included out of the box.&lt;/p&gt;

&lt;p&gt;Full release notes at &lt;a href="https://github.com/bzivkovic1986/arforge/releases/tag/v1.2.0" rel="noopener noreferrer"&gt;github.com/bzivkovic1986/arforge/releases/tag/v1.2.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apache-2.0. Runs on Linux and Windows. No license server, no GUI dependency, no commercial toolchain required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: &lt;code&gt;autosar&lt;/code&gt; &lt;code&gt;embedded&lt;/code&gt; &lt;code&gt;opensource&lt;/code&gt; &lt;code&gt;automotive&lt;/code&gt; &lt;code&gt;cprogramming&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>autosar</category>
      <category>embedded</category>
      <category>opensource</category>
      <category>automotive</category>
    </item>
    <item>
      <title>ARForge just became a full AUTOSAR Classic design pipeline — PlantUML diagrams and C code generation, zero vendor tooling</title>
      <dc:creator>Bojan Zivkovic</dc:creator>
      <pubDate>Wed, 08 Apr 2026 08:27:44 +0000</pubDate>
      <link>https://forem.com/bzivkovic86/arforge-just-became-a-full-autosar-classic-design-pipeline-plantuml-diagrams-and-c-code-3fjl</link>
      <guid>https://forem.com/bzivkovic86/arforge-just-became-a-full-autosar-classic-design-pipeline-plantuml-diagrams-and-c-code-3fjl</guid>
      <description>&lt;p&gt;If you've ever worked on an AUTOSAR Classic project, you know the drill. The architecture lives in a GUI tool that costs more than most engineers' monthly salary. The ARXML it produces is machine-readable XML that technically contains all the information but is practically unreadable for humans. Your git diffs are walls of noise. Your CI pipeline can't touch the toolchain because it requires a license server. And somewhere in a shared drive there's a PowerPoint with a system diagram that stopped being accurate three months ago.&lt;/p&gt;

&lt;p&gt;ARForge was built to fix this from the ground up. It lets you describe AUTOSAR Classic SWCs and compositions in plain YAML, validate them against 191 semantic rules, and export standards-compliant ARXML — all from a CLI, on any machine, with no license dependencies.&lt;/p&gt;

&lt;p&gt;The latest release adds two features that extend the pipeline from design all the way through to implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  PlantUML diagram generation
&lt;/h2&gt;

&lt;p&gt;ARForge now generates PlantUML diagrams directly from your validated model. Two diagram types are supported.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System topology diagrams&lt;/strong&gt; show the full composition: every component instance, every port, and every assembly connector between them. You see at a glance which SWC provides what interface, which one consumes it, and exactly how they're wired. The diagram is color-coded by SWC category and connector type, with a legend included.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Per-SWC diagrams&lt;/strong&gt; show each component in isolation with its provides and requires ports, interface references, and runnable triggers. These are the diagrams you want open during an architecture review when you're discussing a single component without the noise of the full system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;arforge diagram demo-project/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/diagrams
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97hhjmyzbtqs5o95xkkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97hhjmyzbtqs5o95xkkv.png" alt="VSCode Plantuml preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output is standard PlantUML markup. It renders natively in VS Code with the PlantUML extension, in GitHub markdown preview, and in any PlantUML-compatible tool. The diagrams live in your repository alongside the YAML source that generated them.&lt;/p&gt;

&lt;p&gt;The key property here is that the diagram is always a function of the validated model. When the model changes, you regenerate. There is no separate diagram file to keep in sync, no stale PowerPoint, no "I think this is still accurate." You run the command and the output reflects reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  C code skeleton generation
&lt;/h2&gt;

&lt;p&gt;ARForge now generates &lt;code&gt;.c&lt;/code&gt; and &lt;code&gt;.h&lt;/code&gt; implementation templates for every SWC in your composition, derived directly from your validated model.&lt;/p&gt;

&lt;p&gt;What you get for each SWC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runnable stubs with correct signatures matching your timing and event triggers (&lt;code&gt;TimingEvent&lt;/code&gt;, &lt;code&gt;InitEvent&lt;/code&gt;, &lt;code&gt;DataReceiveEvent&lt;/code&gt;, &lt;code&gt;OperationInvokedEvent&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Typed local variable declarations for every sender-receiver read and write, with the correct implementation data type&lt;/li&gt;
&lt;li&gt;Client-server call stubs with correct argument lists derived from your interface definitions&lt;/li&gt;
&lt;li&gt;TODO markers and inline comments indicating where your application logic goes&lt;/li&gt;
&lt;li&gt;A header file with the matching declarations
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;arforge generate code demo-project/autosar.project.yaml &lt;span class="nt"&gt;--lang&lt;/span&gt; c &lt;span class="nt"&gt;--out&lt;/span&gt; build/code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqxfmpk5ggu8gxfstry3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqxfmpk5ggu8gxfstry3a.png" alt="VSCode C-code generation preview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The generated file header makes the origin explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Generated by ARForge.
 * SWC: PlatformSWC
 * Category: application
 * This file is a starter skeleton and does not contain application logic.
 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A realistic example. If your SWC has a &lt;code&gt;TimingEvent&lt;/code&gt; at 10ms and a client-server port that calls &lt;code&gt;GetHealthStatus&lt;/code&gt; and &lt;code&gt;GetVoltage&lt;/code&gt;, the generated runnable looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Trigger: TimingEvent(10 ms) */&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Cyclic_10ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* Client-server calls */&lt;/span&gt;
    &lt;span class="cm"&gt;/* Operation signature: uint8 GetHealthStatus(void) */&lt;/span&gt;
    &lt;span class="n"&gt;uint8&lt;/span&gt; &lt;span class="n"&gt;get_health_status_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cm"&gt;/* TODO: get_health_status_result = Rte_Call_Rp_FakeChipHandling_GetHealthStatus(); */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Operation signature: void GetVoltage(uint16* Value) */&lt;/span&gt;
    &lt;span class="n"&gt;uint16&lt;/span&gt; &lt;span class="n"&gt;get_voltage_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="cm"&gt;/* TODO: Rte_Call_Rp_FakeChipHandling_GetVoltage(&amp;amp;get_voltage_value); */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Rte_Call_&lt;/code&gt; signatures are derived from the actual port name, interface name, and operation definition in your YAML model. They are not guessed or templated with placeholder names. If your model is valid, the signatures are correct.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the pipeline looks like end to end
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;YAML model
    │
    ▼
arforge validate      ← 191 semantic rules, three severity levels
    │
    ├──▶ arforge export     ← standards-compliant ARXML, deterministic output
    │
    ├──▶ arforge diagram    ← PlantUML topology + per-SWC diagrams
    │
    └──▶ arforge generate   ← .c and .h skeletons per SWC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The YAML is your single source of truth. Everything downstream is generated and regeneratable. Nothing needs to be kept manually in sync.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters for open source tooling in automotive
&lt;/h2&gt;

&lt;p&gt;Commercial AUTOSAR tooling is not going away. Vector DaVinci and EB Tresos are deeply embedded in OEM and Tier 1 workflows and will stay there for production programs. That's not the problem ARForge is trying to solve.&lt;/p&gt;

&lt;p&gt;The gap it fills is everything around that: greenfield architecture work done before a tool platform is selected, consultants and smaller suppliers who can't justify a license seat for design exploration, teams who want their AUTOSAR model to live in version control and participate in CI like any other codebase, and engineers who want to understand the architecture without opening a GUI.&lt;/p&gt;

&lt;p&gt;Open source in safety-critical domains has a credibility problem because the bar for production use is legitimately high. But there's a large and real space between "not used in production" and "not useful." ARForge is not trying to replace your RTE vendor. It's trying to make the design and architecture layer accessible, version-controlled, and automatable without requiring a commercial toolchain to participate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/bzivkovic1986/arforge
&lt;span class="nb"&gt;cd &lt;/span&gt;arforge
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Validate the demo project&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli validate examples/autosar.project.yaml

&lt;span class="c"&gt;# Generate diagrams&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli diagram examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/diagrams

&lt;span class="c"&gt;# Generate C skeletons&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli generate code examples/autosar.project.yaml &lt;span class="nt"&gt;--lang&lt;/span&gt; c &lt;span class="nt"&gt;--out&lt;/span&gt; build/code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VS Code integration is included out of the box. YAML schema autocomplete, inline diagnostics, and task runner work automatically once you open the repo.&lt;/p&gt;

&lt;p&gt;Full documentation at &lt;a href="https://github.com/bzivkovic1986/arforge/blob/main/docs/index.md" rel="noopener noreferrer"&gt;docs/index.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Apache-2.0. Runs on Linux and Windows. No license server, no GUI dependency, no commercial toolchain required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: &lt;code&gt;autosar&lt;/code&gt; &lt;code&gt;embedded&lt;/code&gt; &lt;code&gt;opensource&lt;/code&gt; &lt;code&gt;automotive&lt;/code&gt; &lt;code&gt;cprogramming&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>autosar</category>
      <category>embedded</category>
      <category>opensource</category>
      <category>automotive</category>
    </item>
    <item>
      <title>Designing AUTOSAR Classic SWCs Without DaVinci Developer</title>
      <dc:creator>Bojan Zivkovic</dc:creator>
      <pubDate>Wed, 25 Mar 2026 09:05:47 +0000</pubDate>
      <link>https://forem.com/bzivkovic86/designing-autosar-classic-swcs-without-davinci-developer-4g61</link>
      <guid>https://forem.com/bzivkovic86/designing-autosar-classic-swcs-without-davinci-developer-4g61</guid>
      <description>&lt;p&gt;I spent over a decade working in Classic AUTOSAR. In every company I worked at, the same frustration kept showing up: SWC design was locked inside a proprietary GUI tool, ARXML files were unreadable in code review, validation was a manual process, and the license costs were significant enough that not every engineer on the team had access.&lt;/p&gt;

&lt;p&gt;So during some free time I built &lt;a href="https://github.com/bzivkovic1986/arforge" rel="noopener noreferrer"&gt;ARForge&lt;/a&gt; — a lightweight, open source tool that lets you design AUTOSAR Classic SWCs in plain YAML, validate them with a semantic rule engine, and export standards-compliant ARXML. No GUI, no license server. Runs on Linux and Windows. Fits into a CI pipeline.&lt;/p&gt;

&lt;p&gt;This article walks through a complete example — from defining interfaces and SWC types to wiring a composition and exporting ARXML.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem with current tooling
&lt;/h2&gt;

&lt;p&gt;If you have worked with DaVinci Developer, you know the pain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every change produces a large XML diff that is nearly impossible to review meaningfully in a pull request&lt;/li&gt;
&lt;li&gt;Validation is tied to the tool — you cannot run it in CI without the license&lt;/li&gt;
&lt;li&gt;The tool is GUI-first, which makes scripting and automation awkward&lt;/li&gt;
&lt;li&gt;License costs mean not everyone on the team has access, creating bottlenecks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are engineering problems. They are tooling problems. The underlying AUTOSAR modeling concepts — SWC types, ports, runnables, interfaces, compositions — are not inherently complex. They just need a better authoring format.&lt;/p&gt;

&lt;p&gt;YAML is that format. It is human-readable, diff-friendly, version-controllable, and trivially scriptable. Every change to a SWC definition is a meaningful, reviewable line in a pull request.&lt;/p&gt;




&lt;h2&gt;
  
  
  What ARForge supports
&lt;/h2&gt;

&lt;p&gt;ARForge targets a practical AUTOSAR Classic 4.2 subset that covers the design layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base, implementation, and application data types with constraints, units, and compu methods&lt;/li&gt;
&lt;li&gt;Sender-Receiver interfaces with data elements and full ComSpec (implicit, explicit, queued)&lt;/li&gt;
&lt;li&gt;Client-Server interfaces with operations, arguments, return types, possible errors, sync/async call modes&lt;/li&gt;
&lt;li&gt;Mode-Switch interfaces with &lt;code&gt;ModeDeclarationGroup&lt;/code&gt; support&lt;/li&gt;
&lt;li&gt;SWC types with ports, runnables, and all standard event kinds: &lt;code&gt;TimingEvent&lt;/code&gt;, &lt;code&gt;InitEvent&lt;/code&gt;, &lt;code&gt;OperationInvokedEvent&lt;/code&gt;, &lt;code&gt;DataReceiveEvent&lt;/code&gt;, &lt;code&gt;ModeSwitchEvent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Runnable access definitions (&lt;code&gt;reads&lt;/code&gt;, &lt;code&gt;writes&lt;/code&gt;, &lt;code&gt;calls&lt;/code&gt;, &lt;code&gt;raisesErrors&lt;/code&gt;) validated against port direction and interface kind&lt;/li&gt;
&lt;li&gt;System compositions with component prototypes and port-level assembly connectors&lt;/li&gt;
&lt;li&gt;191 stable semantic validation finding codes across all supported constructs&lt;/li&gt;
&lt;li&gt;Deterministic ARXML export, monolithic or split by SWC&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A complete example
&lt;/h2&gt;

&lt;p&gt;Let's build a small system: a &lt;code&gt;SpeedSensor&lt;/code&gt; SWC that publishes vehicle speed and manages the ECU power state, and a &lt;code&gt;SpeedDisplay&lt;/code&gt; SWC that consumes both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Define the data types
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# types/base_types.yaml&lt;/span&gt;
&lt;span class="na"&gt;baseTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uint16"&lt;/span&gt;
    &lt;span class="na"&gt;bitLength&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;
    &lt;span class="na"&gt;signedness&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unsigned"&lt;/span&gt;
    &lt;span class="na"&gt;nativeDeclaration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uint16"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# types/implementation_types.yaml&lt;/span&gt;
&lt;span class="na"&gt;implementationDataTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Impl_VehicleSpeed_U16"&lt;/span&gt;
    &lt;span class="na"&gt;baseTypeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uint16"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# types/application_types.yaml&lt;/span&gt;
&lt;span class="na"&gt;applicationDataTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;App_VehicleSpeed"&lt;/span&gt;
    &lt;span class="na"&gt;implementationTypeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Impl_VehicleSpeed_U16"&lt;/span&gt;
    &lt;span class="na"&gt;constraint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
      &lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;250&lt;/span&gt;
    &lt;span class="na"&gt;unitRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;km_per_h"&lt;/span&gt;
    &lt;span class="na"&gt;compuMethodRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CM_VehicleSpeed_Kph"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2 — Define a mode declaration group
&lt;/h3&gt;

&lt;p&gt;Mode declaration groups are first-class model artifacts in ARForge. They are defined once and referenced by mode-switch interfaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# modes/power_state.yaml&lt;/span&gt;
&lt;span class="na"&gt;modeDeclarationGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mdg_PowerState"&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Power&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;state&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;modes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ECU."&lt;/span&gt;
    &lt;span class="na"&gt;initialMode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OFF"&lt;/span&gt;
    &lt;span class="na"&gt;modes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OFF"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ON"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SLEEP"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3 — Define the interfaces
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# interfaces/If_VehicleSpeed.yaml&lt;/span&gt;
&lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If_VehicleSpeed"&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sender-receiver&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;interface&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vehicle&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;speed."&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;senderReceiver"&lt;/span&gt;
  &lt;span class="na"&gt;dataElements&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VehicleSpeed"&lt;/span&gt;
      &lt;span class="na"&gt;typeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;App_VehicleSpeed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# interfaces/If_PowerState.yaml&lt;/span&gt;
&lt;span class="na"&gt;interface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If_PowerState"&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mode&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;switch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;interface&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ECU&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;power&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;state."&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;modeSwitch"&lt;/span&gt;
  &lt;span class="na"&gt;modeGroupRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mdg_PowerState"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4 — Define the SWC types
&lt;/h3&gt;

&lt;p&gt;This is where the design intent lives. The &lt;code&gt;SpeedSensor&lt;/code&gt; provides a speed value on a cyclic 10 ms runnable and manages the power state mode port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# swcs/SpeedSensor.yaml&lt;/span&gt;
&lt;span class="na"&gt;swc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedSensor"&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SWC&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;that&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;publishes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;current&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vehicle&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;speed."&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pp_VehicleSpeed"&lt;/span&gt;
      &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;provides"&lt;/span&gt;
      &lt;span class="na"&gt;interfaceRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If_VehicleSpeed"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pp_PowerState"&lt;/span&gt;
      &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;provides"&lt;/span&gt;
      &lt;span class="na"&gt;interfaceRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If_PowerState"&lt;/span&gt;
  &lt;span class="na"&gt;runnables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Runnable_PublishVehicleSpeed"&lt;/span&gt;
      &lt;span class="na"&gt;timingEventMs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
      &lt;span class="na"&gt;writes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Pp_VehicleSpeed"&lt;/span&gt;
          &lt;span class="na"&gt;dataElement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VehicleSpeed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;SpeedDisplay&lt;/code&gt; requires both. It reads speed cyclically and also reacts to the power state entering &lt;code&gt;ON&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# swcs/SpeedDisplay.yaml&lt;/span&gt;
&lt;span class="na"&gt;swc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedDisplay"&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SWC&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;that&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reads&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vehicle&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;speed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reacts&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;power&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;state."&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rp_VehicleSpeed"&lt;/span&gt;
      &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requires"&lt;/span&gt;
      &lt;span class="na"&gt;interfaceRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If_VehicleSpeed"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rp_PowerState"&lt;/span&gt;
      &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requires"&lt;/span&gt;
      &lt;span class="na"&gt;interfaceRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;If_PowerState"&lt;/span&gt;
  &lt;span class="na"&gt;runnables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Runnable_ReadVehicleSpeed"&lt;/span&gt;
      &lt;span class="na"&gt;timingEventMs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
      &lt;span class="na"&gt;reads&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rp_VehicleSpeed"&lt;/span&gt;
          &lt;span class="na"&gt;dataElement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VehicleSpeed"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Runnable_OnPowerOn"&lt;/span&gt;
      &lt;span class="na"&gt;modeSwitchEvents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rp_PowerState"&lt;/span&gt;
          &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ON"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that the &lt;code&gt;modeSwitchEvents&lt;/code&gt; trigger references a mode name directly. ARForge validates that &lt;code&gt;ON&lt;/code&gt; is declared in &lt;code&gt;Mdg_PowerState&lt;/code&gt; and that &lt;code&gt;Rp_PowerState&lt;/code&gt; is a requires port on a mode-switch interface. If either is wrong, you get a stable finding code before any ARXML is generated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — Wire the composition
&lt;/h3&gt;

&lt;p&gt;The system file instantiates SWC types as component prototypes and connects their ports.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# system.yaml&lt;/span&gt;
&lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DemoSystem"&lt;/span&gt;
  &lt;span class="na"&gt;composition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Composition_DemoSystem"&lt;/span&gt;
    &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedSensor_1"&lt;/span&gt;
        &lt;span class="na"&gt;typeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedSensor"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedDisplay_1"&lt;/span&gt;
        &lt;span class="na"&gt;typeRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedDisplay"&lt;/span&gt;
    &lt;span class="na"&gt;connectors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedSensor_1.Pp_VehicleSpeed"&lt;/span&gt;
        &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedDisplay_1.Rp_VehicleSpeed"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedSensor_1.Pp_PowerState"&lt;/span&gt;
        &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SpeedDisplay_1.Rp_PowerState"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connector endpoints use &lt;code&gt;InstanceName.PortName&lt;/code&gt; syntax. The distinction between SWC type and component prototype is correctly modeled — you can instantiate the same type multiple times.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6 — The project manifest
&lt;/h3&gt;

&lt;p&gt;The aggregator manifest ties everything together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# autosar.project.yaml&lt;/span&gt;
&lt;span class="na"&gt;autosar&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4.2"&lt;/span&gt;
  &lt;span class="na"&gt;rootPackage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DEMO"&lt;/span&gt;

&lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;baseTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types/base_types.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;implementationDataTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types/implementation_types.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;applicationDataTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;types/application_types.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;units&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;units/units.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;compuMethods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;compu_methods/compu_methods.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;modeDeclarationGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;modes/*.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;interfaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interfaces/If_VehicleSpeed.yaml"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interfaces/If_PowerState.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;swcs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;swcs/SpeedSensor.yaml"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;swcs/SpeedDisplay.yaml"&lt;/span&gt;
  &lt;span class="na"&gt;system&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system.yaml"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7 — Validate and export
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Validate — runs 191 semantic rules, exits non-zero on any error finding&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli validate autosar.project.yaml

&lt;span class="c"&gt;# Export — blocked if validation has errors&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli &lt;span class="nb"&gt;export &lt;/span&gt;autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/out &lt;span class="nt"&gt;--split-by-swc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validation output looks like this when something is wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ERROR]   CORE-028-MSE-UNKNOWN-MODE    Runnable 'Runnable_OnPowerOn': modeSwitchEvent references unknown mode 'STARTUP' on port 'Rp_PowerState'
[WARNING] CORE-050                     SR consumer 'SpeedDisplay_1.Rp_VehicleSpeed' runs faster than its producer

Summary: 1 error, 1 warning, 0 info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finding codes are stable across versions. You can grep for them, suppress specific ones in CI, or use them as references in bug reports.&lt;/p&gt;




&lt;h2&gt;
  
  
  The validation engine
&lt;/h2&gt;

&lt;p&gt;This is where ARForge goes beyond a simple generator. The semantic validation layer catches problems that an XML schema cannot — things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a runnable reading from a port that doesn't exist on the SWC&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;modeSwitchEvent&lt;/code&gt; referencing a mode not declared in the group&lt;/li&gt;
&lt;li&gt;a CS port with async ComSpec trying to set a timeout&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;requires&lt;/code&gt; SR port that a runnable reads from but which has no incoming connector in the composition&lt;/li&gt;
&lt;li&gt;a sender-receiver consumer running at a shorter period than its producer&lt;/li&gt;
&lt;li&gt;a port declared on an SWC type but never accessed by any runnable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;191 rules, organized by domain, each with a stable &lt;code&gt;CORE-XXX&lt;/code&gt; identifier. Every rule has explicit test fixtures for both valid and invalid inputs in the test suite.&lt;/p&gt;




&lt;h2&gt;
  
  
  CI integration
&lt;/h2&gt;

&lt;p&gt;Because ARForge is a CLI tool with deterministic output and stable exit codes, it drops into any pipeline without modification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example GitHub Actions step&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Validate AUTOSAR model&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python -m arforge.cli validate autosar.project.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is something DaVinci Developer fundamentally cannot do. Your ARXML is generated from a validated, version-controlled source of truth on every push.&lt;/p&gt;




&lt;h2&gt;
  
  
  VS Code integration
&lt;/h2&gt;

&lt;p&gt;ARForge ships with a &lt;code&gt;.vscode/&lt;/code&gt; configuration that enables YAML schema autocomplete and inline diagnostics for all ARForge file types out of the box. Install the Python and YAML (Red Hat) extensions, open the repo, and the editor knows what fields are valid in an SWC file, an interface file, or a system file without any manual setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it is not
&lt;/h2&gt;

&lt;p&gt;ARForge covers the SWC design layer. It is not a DaVinci replacement for production integration workflows at large Tier-1s — it does not generate RTE contract headers, configure BSW modules, or manage OS task mapping. It is also not a round-trip tool yet: ARXML import is planned but not implemented, so it works best for greenfield design or as a parallel design environment.&lt;/p&gt;

&lt;p&gt;The target audience is engineers who want the design phase to feel like software engineering — text files, version control, automated validation, CI — rather than a proprietary GUI session.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/bojanzivkovic/arforge
&lt;span class="nb"&gt;cd &lt;/span&gt;arforge
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate        &lt;span class="c"&gt;# Windows: .venv\Scripts\activate&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Run the included example&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli validate examples/autosar.project.yaml
python &lt;span class="nt"&gt;-m&lt;/span&gt; arforge.cli &lt;span class="nb"&gt;export &lt;/span&gt;examples/autosar.project.yaml &lt;span class="nt"&gt;--out&lt;/span&gt; build/out &lt;span class="nt"&gt;--split-by-swc&lt;/span&gt;

&lt;span class="c"&gt;# Run the test suite&lt;/span&gt;
pytest &lt;span class="nt"&gt;-q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository includes a complete working example project and a corpus of invalid model fixtures — one per validation rule — that you can use as a reference for what each rule checks.&lt;/p&gt;

&lt;p&gt;Feedback, issues, and pull requests are welcome on GitHub. If you are working in Classic AUTOSAR and have thoughts on the tool, the feature gaps, or what would make it useful in your workflow — I would genuinely like to hear from you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;ARForge is an independent open source project, unaffiliated with any AUTOSAR tooling vendor. Licensed under Apache-2.0.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
