DataType Editor
What This Chapter Covers
This chapter describes the DataType editor, which defines application data types, implementation data types, and physical units. It covers the screen layout, the editable properties of all 9 categories, the rules for the 11 built-in primitives, and the real-time validation messages. ARXML import and export are covered in 13. Import and Export.
This chapter is for users who define the data types that interfaces or SWCs will use. A project must be open before you start.
Double-click the design ▸ System ▸ DataType node in the Explorer to open the editor in a tab.
The editor saves to a single DataType model, which holds both data types and units.
10.1 Screen Layout
Two tab buttons sit at the top of the editor, and the contents of the selected tab appear below them.
| Tab | Contents |
|---|---|
| DataType | The data type list and its detail form |
| Unit | The physical unit list and its detail form |
DataType Tab Layout

DataType tab — four areas: the list, Configuration plus the MEMBERS table, Preview, and Validation
Drag the borders between the three areas, and the horizontal border between Preview and Validation, to resize them.
Unit Tab Layout
The unit list (Unit, with + and - buttons) sits on the left, and the Configuration form and
Preview sit side by side on the right. The Unit tab has no search, filter, or Validation area.

Unit tab — the list and Configuration without search, filter, or Validation, and a Preview holding the conversion formula, graph, SI-to-unit conversion table, comparison bars, and value converter
Compact Mode Embedded in the Interface Editor
The right panel of the 09. Interface Editor contains the same DataType
editor. In this compact mode the tab buttons, the type list, the Unit tab, and the Validation
panel are all hidden. Only the properties form (top 60%, header DATA TYPE) and Preview
(bottom 40%, header PREVIEW) are stacked vertically, and you can drag the horizontal border
between them. The layout lets you define a type on the spot while you build an interface, and
your edits are saved to the same DataType model. Compact mode has no shortcuts of its own; it
leaves saving and undo to the Interface editor.

The DataType editor in compact mode inside the right panel of the Interface editor — only the DATA TYPE and PREVIEW areas remain
10.2 Data Type Categories (9 Kinds)
Pick the Category from a group of buttons (a segmented control). They appear in this order: PRIMITIVE, ALIAS, ENUMERATION, FIXED_ARRAY, DYNAMIC_ARRAY, STRING, STRUCTURE, MAP, UNION.
The 9 Category segments — only PRIMITIVE is dimmed and cannot be selected
Every category has the common NAME, Category, and Description properties. Description is a
multi-line field and always comes last in the form. The meaning and the category-specific
properties of the 9 categories are as follows.
| Category | Meaning | Category-specific properties |
|---|---|---|
| PRIMITIVE | Built-in basic type | Min / Max (every property is read-only) |
| ALIAS | An alias (typedef) for another type | BaseType, C++ Namespace, Factor, Offset, Min, Max, Unit |
| ENUMERATION | Enumeration | BaseType, C++ Namespace, plus the ENUMERATION table |
| FIXED_ARRAY | Fixed-length array | Element Type, Array Size, C++ Namespace |
| DYNAMIC_ARRAY | Variable-length array | Element Type, Max Size, C++ Namespace |
| STRING | String (AP only) | Max Size, C++ Namespace |
| STRUCTURE | Structure | C++ Namespace, plus the MEMBERS table |
| MAP | Associative array (AP only) | Key Type, Value Type, C++ Namespace |
| UNION | Union | C++ Namespace, plus the MEMBERS table |
BaseType, Element Type, Key Type, Value Type, and Unit are all searchable selection boxes. The type itself is never offered as a candidate, and the rest of the candidate range differs per property.
| Property | Candidates |
|---|---|
| BaseType of ALIAS and ENUMERATION | The 11 built-in primitives only (user-defined types cannot be selected) |
| Element Type of FIXED_ARRAY and DYNAMIC_ARRAY | All other types |
| Type of a STRUCTURE or UNION member | All other types |
| Key Type of MAP | The 10 built-in primitives except boolean, plus types in the STRING category |
| Value Type of MAP | All other types |
| Unit of ALIAS | Every unit on the Unit tab. The label reads DisplayName [name] when a DisplayName exists (for example km/h [KilometersPerHour]), and just the name otherwise |

BaseType candidates for ALIAS — only the 11 built-in primitives appear
You cannot select PRIMITIVE. The PRIMITIVE button in the segmented control is dimmed and blocked from clicks, and the data layer also rejects a change to PRIMITIVE. If a type that is not a built-in primitive became PRIMITIVE, every field would be locked read-only with no way back, and the value could not be saved to a file in the first place.
10.3 The MEMBERS / ENUMERATION Sub-Table
Selecting STRUCTURE, UNION, or ENUMERATION attaches a sub-table below the Configuration form.
The title is ENUMERATION for ENUMERATION and MEMBERS for the others. The table layout per
category is as follows.
| Category | Columns | Add button tooltip | Defaults for a new row |
|---|---|---|---|
| STRUCTURE | #, Type, Name, Optional, delete | Add Member | Name SubElement_0, type uint8, Optional False |
| UNION | #, Type, Name, delete | Add Member | Name Member_0, type uint8 |
| ENUMERATION | #, Name, Value, delete | Add Enumeration | Name Literal_0, value is the current maximum + 1 (0 if there is none) |

The MEMBERS table of a STRUCTURE — the # drag handle, the Type / Name / Optional columns, and the × that removes a row
- The
#cell is a drag handle and shows the row number counted from 0. Click this cell and drag the row up or down to reorder it. - The × button at the end of a row deletes that row (tooltip
Remove MemberorRemove Enumeration). - You can drag the border of the two middle columns (
Type/Namefor STRUCTURE and UNION,Name/Valuefor ENUMERATION) to change their width. The#,Optional, and delete cells have a fixed width. - The name cell is checked strictly. A name that is empty, contains only whitespace, or breaks the AUTOSAR rules is not saved, and the previous name is kept. Leading and trailing whitespace is trimmed before the value is saved.
- The
Valueof an ENUMERATION accepts integers only. When BaseType points at a built-in primitive, the value you type is clamped automatically to the representable range of that primitive. For example, with BaseTypeuint8, typing 300 changes the value to 255. When BaseType is empty or points at a type whose range is unknown, no clamping happens and no range check happens either. When BaseType is empty, aBaseType is requirederror appears in the Validation panel instead; when BaseType is set but its range is unknown, nothing is reported. When BaseType is empty or points at a type whose range is unknown, the value is not clamped, and the Validation panel reports the range overflow as an error instead.
10.4 Working with the List (DataType Tab)
The list panel offers the following operations.
| Operation | Description |
|---|---|
+ (tooltip Add DataType) | Creates a new type. The name is DataType followed by the current number of items in the list, and Category is empty |
− (tooltip Delete selected DataType) | Deletes the selected type without asking for confirmation. The BaseType, Element Type, Key Type, Value Type, and member types of other types that pointed at it are cleared (they are not replaced with another type) |
⋯ (tooltip More actions) | Opens the filter and sort popover |
| Search | The placeholder is search.... It filters names by case-insensitive partial match |
| Arrow keys | Focus the list and move the selection with the up and down arrow keys |
![Category badges and filter state — with only ENUMERATION selected, the list title reads DataType [ENUMERATION]](/docs/assets/images/10-07-list-badges-49b1298f319566beb716f4f72be86d26.png)
Category badges and filter state — with only ENUMERATION selected, the list title reads DataType [ENUMERATION]
The number in the name is the list length including the 11 built-in primitives. So in a
project with no user-defined types, the first type you create is named DataType11, not
DataType0. Names are not checked for duplicates, so creating a new type after deleting one in
the middle can collide with an existing name. In that case a Duplicate ShortName error appears
in the Validation panel.
Because a new type has no Category, a Category is required hint appears below the Category
segmented control, and an error appears in the Validation panel as well. The hint disappears once
you pick a category.
Selecting a built-in primitive and clicking − does nothing. Primitives cannot be deleted.
The ⋯ Menu
The popover has the following sections.
| Section | Items |
|---|---|
Filter by Category | Check boxes for the 9 categories, plus the All button on the right (tooltip Select All / Deselect All) |
Sort by | Default (Added Order) / Name (A-Z) / Category |

The ⋯ menu — the 9 Filter by Category entries and the 3 Sort by entries, with the tooltip of the All button visible
- A type with no category assigned always appears, regardless of the filter.
- The filter state appears in the list title. With everything selected (or everything cleared) it
reads
DataType; with one category selected,DataType [ALIAS]; with several,DataType (3/9). - Sorting changes only the display order on screen. The order saved to the file stays the same.
- Each list item carries a category badge in the form
[ENUMERATION]. Built-in primitive items are styled differently to set them apart. - When there are no types at all,
No DataTypes yetandClick [+] to add manuallyappear. When a search or filter returns nothing,No matching DataTypesappears.
10.5 Validation Panel
The Validation area at the bottom right of the DataType tab checks your edits in real time. It
refreshes about 0.3 seconds after an edit. When nothing is wrong, No validation issues appears.
When something is wrong, a summary such as 2 errors, 1 warning appears at the top with the
individual entries listed below it. Click an entry to select that type in the list.

The summary and entries in the Validation panel, and the BaseType is required message shown directly on the BASETYPE field
A message has the form [index] "type name" — text. The index is the position in the list counted
from 0, including the built-in primitives, and it does not change when you change the sort or the
filter.
Errors (error)
The checks reported as errors, and their messages, are as follows.
| Check | Message |
|---|---|
| Missing name | [0] ShortName is empty |
| Category not set | [0] "MyType" — Category is not set |
| Missing BaseType on ALIAS or ENUMERATION | [0] "MyType" — BaseType is required |
| Factor of an ALIAS is 0 | [0] "MyType" — Factor must not be 0 |
| Min > Max on an ALIAS | [0] "MyType" — Min (10) > Max (5) |
| Missing Element Type on FIXED_ARRAY or DYNAMIC_ARRAY | [0] "MyType" — Element Type is required |
| Array Size of a FIXED_ARRAY missing, or 0 or less | [0] "MyType" — Array Size is required |
| Missing Key Type or Value Type on MAP | [0] "MyType" — Key Type is required / — Value Type is required |
| Duplicate name | [1] Duplicate ShortName: "MyType" |
| Self-reference | — Self-reference in BaseType/Element Type / — Self-reference in Key Type / — Self-reference in Value Type / — Member[0] self-reference |
| Circular reference | [0] "A" — Circular reference: A -> B -> A |
Structure and Enumeration Detail Errors
The detail checks on members and literals are as follows.
| Check | Message |
|---|---|
| Missing member name | — Member[0] name is empty |
| Member type not set | — Member[0] type is not set |
| Duplicate member name | — Duplicate member name: "value" |
| Missing literal name | — Literal[0] name is empty |
| Duplicate literal name | — Duplicate literal name: "on" |
| Duplicate literal value | — Duplicate literal value: 3 |
| Fractional literal value while BaseType is an integer | — Literal[0] value 1.5 is not an integer (BaseType is not float) |
| Literal value outside the BaseType range | — Literal[0] value 300 is out of BaseType range [0, 255] |
Warnings (warning)
The following item is reported as a warning.
| Check | Message |
|---|---|
| Max Size of a STRING not set | [0] "MyString" — Max Size not set, default 255 will be applied |
Field Errors That Appear as You Type
Separately from the Validation panel, the following conditions appear directly below the field concerned.
| Target | Condition | Message |
|---|---|---|
| Factor of an ALIAS | The value is 0 | Factor=0 is not valid for LINEAR conversion (constant = TEXTTABLE) |
| Min / Max of an ALIAS | Min > Max (on both fields) | Min (10) > Max (5) |
| Array Size of a FIXED_ARRAY | Empty, or 0 or less | Array Size is required |
| BaseType / Element Type / Key Type / Value Type | Points at the type itself | Self-reference is not allowed |
| A reference field required by the category | Empty | BaseType is required / Element Type is required / Key Type is required / Value Type is required |
Per-Row Errors in MEMBERS / ENUMERATION
Each row of the sub-table (10.3) has its own error display as well.
| Target | Condition | Message |
|---|---|---|
| Member or literal name | Empty | Name is required |
| Member or literal name | Collides with another row | Duplicate name |
| Member name | Breaks the AUTOSAR rules (warning) | Must start with a letter, then letters/digits/underscores only |
| Member type | Empty | Type is required |
| Member type | Points at the type itself | Self-reference is not allowed |
| Literal value | Collides with another row | Duplicate value |
| Literal value | Fractional while BaseType is an integer | Not an integer (BaseType is not float) |
| Literal value | Outside the BaseType range | Out of range [0, 255] |

Per-row errors in an ENUMERATION table — the two rows with the same name are marked in red and Duplicate literal name appears in Validation
DYNAMIC_ARRAY has no required-size check. As long as Element Type is set, nothing is reported as an error. Max Size is an optional property that expresses an upper bound.
10.6 Preview Panel
Preview visualizes the structure of the selected type per category. When no type is selected,
Select a DataType to preview appears. The contents per category are as follows.
| Category | Contents |
|---|---|
| PRIMITIVE | The size, the encoding, and a value range bar (for boolean the two ends read false and true) |
| ALIAS | The Base information (with a Unit row appended when a Unit is set), the Raw-to-Physical graph, and the value converter. The formula line (physical = 0.1 × raw + 0) appears only when Factor is not 1 or Offset is not 0 |
| STRUCTURE | A struct (3 members) summary and a grid of member boxes. Optional members are marked separately. With no members, (empty struct) |
| UNION | A union (3 variants) summary and a grid of member boxes. With no members, (empty union) |
| ENUMERATION | base: uint8 and literal chips (name plus value). With no literals, No literals defined |
| FIXED_ARRAY / DYNAMIC_ARRAY | An array diagram showing the element type and the length |
| STRING | A diagram of character cells, one per maximum-length character |
| MAP | A map<Key, Value> summary and two boxes, Key and Value |
The ALIAS Preview also places a value converter below the graph. Enter a Raw value on the
top line and the Physical value appears on the right; enter a Physical value on the bottom
line and the Raw value appears on the right, immediately and to two decimal places. You can also
scroll the mouse wheel over a field to raise and lower the value. The converter is a calculator
for checking that Factor and Offset behave as you intended, and it does not change the model.
The unit side has a converter of the same kind (10.8).

ALIAS Preview — the Base information, the conversion graph, and the Raw-to-Physical value converter
Click the type name of a member or an element to drill into that type, and Preview changes to
it. A ← Back button then appears at the top left so you can return to the previous type.
Built-in primitives have no further structure to expand, so they are not clickable.

Preview drill-down — the state after clicking a member type to drill into it. ← Back appears and the selection in the form on the left is unchanged
10.7 The 11 Built-In Primitives
PAIO manages the following 11 names as reserved words. These types are injected into memory automatically when the editor opens, and they are not saved to the model file.
| Name | Size / encoding | C declaration | C++ mapping | Value range |
|---|---|---|---|---|
boolean | 8 / BOOLEAN | unsigned char | bool | 0 ~ 1 |
float32 | 32 / IEEE754 | float | float | ±3.4028235e+38 |
float64 | 64 / IEEE754 | double | double | ±1.7976931348623157e+308 |
sint8 | 8 / 2C | signed char | int8_t | -128 ~ 127 |
sint16 | 16 / 2C | signed short | int16_t | -32768 ~ 32767 |
sint32 | 32 / 2C | signed long | int32_t | -2147483648 ~ 2147483647 |
sint64 | 64 / 2C | signed long long | int64_t | -9223372036854775808 ~ 9223372036854775807 |
uint8 | 8 / NONE | unsigned char | uint8_t | 0 ~ 255 |
uint16 | 16 / NONE | unsigned short | uint16_t | 0 ~ 65535 |
uint32 | 32 / NONE | unsigned long | uint32_t | 0 ~ 4294967295 |
uint64 | 64 / NONE | unsigned long long | uint64_t | 0 ~ 18446744073709551615 |
Keep the following points in mind.
- Inside the model, always use the AUTOSAR notation (
uint8). C++ notation such asuint8_tappears only when you export C++ ARXML. - You cannot give a user-defined type one of these 11 names. If you try,
'uint8' is a reserved built-in primitive nameappears on the field and the value is not saved. - You cannot change the name or the properties of a primitive, and you cannot delete one (every field is read-only).
- Primitives missing from the file are normal, not a loss. Their definitions are built into the tool, so there is no reason to save them, and saving them could conflict with the built-in definitions the next time the file opens. The schema also forbids these 11 names. Other types simply reference a primitive by name.
- If the file contains an item whose name is a reserved word but whose category is not PRIMITIVE, PAIO treats that item as corrupted and discards it, then injects the correct built-in definition again.
The Structure Created on Export
A single primitive is exported as four AUTOSAR representations together.
| Representation | Name |
|---|---|
| SW-BASE-TYPE | Exactly the name shown in the editor |
| APPLICATION-PRIMITIVE-DATA-TYPE | Exactly the name shown in the editor (only boolean gets CATEGORY BOOLEAN; the rest get VALUE) |
| IMPLEMENTATION-DATA-TYPE (C) | Exactly the name shown in the editor |
| STD-CPP-IMPLEMENTATION-DATA-TYPE (C++) | The C++ name (uint8_t, bool, and so on) |
Two DATA-TYPE-MAPPING-SET elements are appended automatically as well. They are named
DataTypeMappingsCP (Application to the C implementation) and DataTypeMappingsAP
(Application to the C++ implementation).
10.8 Unit Tab
List
The unit list offers the following operations.
| Operation | Description |
|---|---|
+ (tooltip Add Unit) | Creates a new unit. The name is Unit followed by the current number of items in the list |
- (tooltip Delete selected Unit) | Deletes the selected unit without asking for confirmation |
Because the 33 default units already fill the list, the first unit you create in a project with
nothing added is named Unit33.
Editable Properties
A unit has the following editable properties.
| Property | Form | Notes |
|---|---|---|
NAME | Text | Follows the AUTOSAR SHORT-NAME rules. A value that breaks the rules is not saved |
DisplayName | Text | The symbol shown on screen (km/h, %, and so on) |
FactorSiToUnit | Real number | The conversion factor from the SI unit to this unit |
OffsetSiToUnit | Real number | The conversion offset from the SI unit to this unit |
Description | Multi-line text |
The Unit property of an ALIAS type references a unit defined here.
- Renaming a unit also updates the
Unitvalue of every data type that referenced it. - Deleting a unit clears the
Unitvalue of every data type that referenced it.
Preview
Preview on the right shows the conversion of the selected unit in several forms at once (see the Unit tab figure above). From top to bottom:
| Area | Contents |
|---|---|
| Header | The form DisplayName[NAME] (km/h[Kilometer]). Without a DisplayName, only the name appears |
| Conversion formula | The form km = 0.001 × m. The multiplication term drops out when Factor is 1, and the addition term drops out when Offset is 0 |
| Graph | A straight line with the SI value on the horizontal axis and this unit's value on the vertical axis |
| Domain badge | See the explanation below |
| Conversion table | A table of a few representative SI values converted to this unit. The sample values are chosen automatically to match the magnitude of Factor |
| Comparison bars | Two bars below SI 1 = ? that compare the size of 1 SI with the corresponding unit value |
| Value converter | Enter an SI value and the unit value appears; enter a unit value and the SI value appears, immediately. The fields accept the mouse wheel as well |
| Description | Whatever you wrote in Description |
The domain badge appears only when Factor and Offset match an already known conversion. The
tool holds a table of 29 conversions across 12 domains — speed, temperature, pressure, length,
mass, time, angle, frequency, voltage, current, torque, and ratio. When the Factor and Offset of
the unit you are editing match one of them to within 1%, PAIO shows a badge with the domain name,
such as LENGTH, and a symbol pair, such as m → km. The SI placeholder in the conversion
formula and in the conversion table then changes to the actual SI symbol (m) as well. When no
conversion matches, no badge appears and the literal text SI is used — this is the case for
units whose FactorSiToUnit is 1 (Volt, Meter, Second, and so on), and it is normal.
When several candidates match, the name breaks the tie. Factor 0.001 matches all six of the
kPa,km,t,kV,kHz, andkN·mconversions, but the unit name isKilometer, so the length conversion wins. When the name does not break the tie either, the conversion that comes first in the table is used, so a unit you create yourself may get a domain badge that does not match reality. The badge is informational only and is not saved to the model.
The 33 Default Units
When a project opens, the list is filled automatically with 33 commonly used units (NoUnit,
Percent, Radian, Degree, Meter, Millimeter, Kilometer, Kilogram, Gram, Second,
Millisecond, Microsecond, Ampere, Milliampere, Kelvin, DegreeCelsius,
MetersPerSecond, KilometersPerHour, RadiansPerSecond, RevolutionsPerMinute, Hertz,
Newton, Pascal, KiloPascal, Bar, Joule, KilowattHour, Watt, Kilowatt,
NewtonMeter, Volt, Millivolt, Ohm).
A unit left at its default values is not saved to the file. At save time PAIO records only the units whose values differ from the defaults and the units some data type actually references. The reason is the same as for the primitives: information the tool always fills in should not be duplicated in the file. So a saved file may show a short or empty unit list when you open it, and that is normal.
10.9 Saving and Undo
The save and undo shortcuts are as follows.
| Operation | Shortcut | Notes |
|---|---|---|
| Save | Ctrl+S | Works while the tab is visible on screen |
| Save As | Ctrl+Shift+S | Opens the Save DataTypes dialog for choosing the save location. The extension is appended automatically if you omit it |
| Undo | Ctrl+Z | |
| Redo | Ctrl+Y or Ctrl+Shift+Z |
- On save, the value you were typing is committed before the file is written, so a value is saved
even if you press
Ctrl+Simmediately after typing it. - Undo uses a single timeline shared by the whole project. The Edit menu in the header and Undo/Redo in the command palette use the same timeline (05. UI Layout and Navigation).
- Once you save to another path with
Ctrl+Shift+S, laterCtrl+Spresses save to that path as well. To go back to the DataType model at the project's standard location, close the editor and open it again.
10.10 Integration with Other Screens
- Interface editor — The right panel holds the same DataType editor in compact mode (see 10.1).
- Initial value (ValueSpec) editor — It reads the type structure defined here to decide the input form. A structure becomes a table, an array becomes indexed rows, and an enumeration becomes a combo box. Signal initial values are the exception: because a signal does not reference a data type, the input form is built from the signal's own properties (see 07. Signal Editor, 7.11).
- Rename propagation — Renaming a type also updates the type references in the Interface model and in the ECUC configuration, including the ones you have not opened. SWC definitions are not part of this propagation.
- Validation — The Validation panel of this editor covers only the structural checks of the data types themselves. Project-wide AUTOSAR constraint checks are shown in a separate panel (see 14. Validation).
10.11 Editing Rules Summary
- Names follow the AUTOSAR SHORT-NAME rules: the first character is a letter, and the rest are letters, digits, and underscores. Unit names are also checked against a 128-character limit, while data type names are not checked for length.
- A type name is not saved if it is empty or a reserved word (one of the 11 built-in primitives). A name that does not match the rules shows a warning on the field, but the value itself is applied. Exporting ARXML in that state produces a document that does not match the schema, so fix any name that shows a warning before you use it.
- Member and literal names are stricter: a name that does not match the rules is not applied at all, and the previous name is kept.
- You cannot change the name or the properties of a built-in primitive, and you cannot delete one.
- The list sort and filter, the panel sizes, and the scroll position are screen state only and are not saved to the file.