<?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>DEV Community: Bojan Zivkovic</title>
    <description>The latest articles on DEV Community by Bojan Zivkovic (@bzivkovic86).</description>
    <link>https://dev.to/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>DEV Community: Bojan Zivkovic</title>
      <link>https://dev.to/bzivkovic86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bzivkovic86"/>
    <language>en</language>
    <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://dev.to/bzivkovic86/arforge-v120-schema-valid-arxml-subcomposition-support-and-zero-checker-errors-1ak3</link>
      <guid>https://dev.to/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://dev.to/bzivkovic86/arforge-just-became-a-full-autosar-classic-design-pipeline-plantuml-diagrams-and-c-code-3fjl</link>
      <guid>https://dev.to/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://dev.to/bzivkovic86/designing-autosar-classic-swcs-without-davinci-developer-4g61</link>
      <guid>https://dev.to/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>
