use a2lmacros::a2l_specification;
use crate::a2ml;
use crate::ifdata;
use crate::parser::{A2lVersion, BlockContent, ParseContext, ParserError, ParserState};
use crate::tokenizer::A2lTokenType;
use crate::writer;
use crate::ItemList;
#[derive(PartialEq, Eq, Clone)]
pub struct BlockInfo<T> {
pub incfile: Option<String>,
pub line: u32,
pub uid: u32,
pub start_offset: u32,
pub end_offset: u32,
pub item_location: T,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub(crate) struct Comment {
pub(crate) comment: String,
pub(crate) is_included: bool,
pub(crate) line: u32,
pub(crate) uid: u32,
pub(crate) start_offset: u32,
}
pub trait A2lObject<T> {
fn get_layout(&self) -> &BlockInfo<T>;
fn get_layout_mut(&mut self) -> &mut BlockInfo<T>;
fn reset_location(&mut self);
fn merge_includes(&mut self);
fn get_line(&self) -> u32;
}
pub trait A2lObjectName {
fn get_name(&self) -> &str;
}
pub trait A2lObjectNameSetter {
fn set_name(&mut self, name: String);
}
pub(crate) trait PositionRestricted {
fn pos_restrict(&self) -> Option<u16> {
None
}
}
pub(crate) trait ParseableA2lObject: Sized {
fn parse(
parser: &mut ParserState,
context: &ParseContext,
start_offset: u32,
) -> Result<Self, ParserError>;
}
a2l_specification! {
keyword A2L_FILE {
[-> ASAP2_VERSION]
[-> A2ML_VERSION]
[-> PROJECT]!
}
enum AddrType {
PBYTE,
PWORD,
PLONG,
PLONGLONG (1.70 ..),
DIRECT
}
enum DataTypeSize {
BYTE,
WORD,
LONG
}
enum DataType {
UBYTE,
SBYTE,
UWORD,
SWORD,
ULONG,
SLONG,
A_UINT64 (1.60 ..),
A_INT64 (1.60 ..),
FLOAT16_IEEE (1.71 ..),
FLOAT32_IEEE,
FLOAT64_IEEE
}
enum IndexOrder {
INDEX_INCR,
INDEX_DECR
}
block A2ML {
}
keyword A2ML_VERSION {
uint version_no
uint upgrade_no
}
keyword ADDR_EPK {
ulong address
}
keyword ADDRESS_TYPE {
AddrType address_type
}
keyword ALIGNMENT_BYTE {
uint alignment_border
}
keyword ALIGNMENT_FLOAT16_IEEE {
uint alignment_border
}
keyword ALIGNMENT_FLOAT32_IEEE {
uint alignment_border
}
keyword ALIGNMENT_FLOAT64_IEEE {
uint alignment_border
}
keyword ALIGNMENT_INT64 {
uint alignment_border
}
keyword ALIGNMENT_LONG {
uint alignment_border
}
keyword ALIGNMENT_WORD {
uint alignment_border
}
block ANNOTATION {
[-> ANNOTATION_LABEL]
[-> ANNOTATION_ORIGIN]
[-> ANNOTATION_TEXT]
}
keyword ANNOTATION_LABEL {
string label
}
keyword ANNOTATION_ORIGIN {
string origin
}
block ANNOTATION_TEXT {
{string annotation_text}* annotation_text_list
}
keyword ARRAY_SIZE {
uint number
}
block AR_COMPONENT {
string component_type
[-> AR_PROTOTYPE_OF]
}
keyword AR_PROTOTYPE_OF {
ident name
}
keyword ASAP2_VERSION {
uint version_no
uint upgrade_no
}
enum AxisDescrAttribute {
CURVE_AXIS,
COM_AXIS,
FIX_AXIS,
RES_AXIS,
STD_AXIS
}
block AXIS_DESCR {
AxisDescrAttribute attribute
ident input_quantity
ident conversion
uint max_axis_points
float lower_limit
float upper_limit
[-> ANNOTATION]*
[-> AXIS_PTS_REF]
[-> BYTE_ORDER]
[-> CURVE_AXIS_REF]
[-> DEPOSIT]
[-> EXTENDED_LIMITS]
[-> FIX_AXIS_PAR]
[-> FIX_AXIS_PAR_DIST]
[-> FIX_AXIS_PAR_LIST]
[-> FORMAT]
[-> MAX_GRAD]
[-> MONOTONY]
[-> PHYS_UNIT] (1.60 ..)
[-> READ_ONLY]
[-> STEP_SIZE] (1.60 ..)
}
block AXIS_PTS {
ident name
string long_identifier
ulong address
ident input_quantity
ident deposit_record
float max_diff
ident conversion
uint max_axis_points
float lower_limit
float upper_limit
[-> ANNOTATION]*
[-> BYTE_ORDER]
[-> CALIBRATION_ACCESS]
[-> DEPOSIT]
[-> DISPLAY_IDENTIFIER]
[-> ECU_ADDRESS_EXTENSION]
[-> EXTENDED_LIMITS]
[-> FORMAT]
[-> FUNCTION_LIST]
[-> GUARD_RAILS]
[-> IF_DATA]*
[-> MAX_REFRESH] (1.70 ..)
[-> MODEL_LINK] (1.70 ..)
[-> MONOTONY]
[-> PHYS_UNIT] (1.60 ..)
[-> READ_ONLY]
[-> REF_MEMORY_SEGMENT]
[-> STEP_SIZE] (1.60 ..)
[-> SYMBOL_LINK]
}
keyword AXIS_PTS_REF {
ident axis_points
}
keyword AXIS_PTS_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
IndexOrder index_incr
AddrType addressing
}
keyword AXIS_RESCALE_X /_Y /_Z / _4 / _5 {
uint position
DataType datatype
uint max_number_of_rescale_pairs
IndexOrder index_incr
AddrType addressing
}
keyword BIT_MASK {
uint64 mask
}
block BIT_OPERATION {
[-> LEFT_SHIFT]
[-> RIGHT_SHIFT]
[-> SIGN_EXTEND]
}
block BLOB {
ident name
string long_identifier
ulong start_address
ulong size
[-> ADDRESS_TYPE]
[-> ANNOTATION]*
[-> CALIBRATION_ACCESS]
[-> DISPLAY_IDENTIFIER]
[-> ECU_ADDRESS_EXTENSION]
[-> IF_DATA]*
[-> MAX_REFRESH]
[-> MODEL_LINK]
[-> SYMBOL_LINK]
}
enum ByteOrderEnum {
LITTLE_ENDIAN (.. 1.51),
BIG_ENDIAN (.. 1.51),
MSB_LAST,
MSB_FIRST,
MSB_FIRST_MSW_LAST (1.70 ..),
MSB_LAST_MSW_FIRST (1.70 ..)
}
keyword BYTE_ORDER {
ByteOrderEnum byte_order
}
enum CalibrationAccessEnum {
CALIBRATION,
NO_CALIBRATION,
NOT_IN_MCD_SYSTEM,
OFFLINE_CALIBRATION
}
keyword CALIBRATION_ACCESS {
CalibrationAccessEnum calibration_access
}
block CALIBRATION_HANDLE {
{long handle}* handle_list
[-> CALIBRATION_HANDLE_TEXT]* (1.60 ..)
}
keyword CALIBRATION_HANDLE_TEXT {
string text
}
block CALIBRATION_METHOD {
string method
ulong version
[-> CALIBRATION_HANDLE]*
}
enum CharacteristicType {
ASCII,
CURVE,
MAP,
CUBOID,
CUBE_4 (1.60 ..),
CUBE_5 (1.60 ..),
VAL_BLK,
VALUE
}
block CHARACTERISTIC {
ident name
string long_identifier
CharacteristicType characteristic_type
ulong address
ident deposit
float max_diff
ident conversion
float lower_limit
float upper_limit
[-> ANNOTATION]*
[-> AXIS_DESCR]*
[-> BIT_MASK]
[-> BYTE_ORDER]
[-> CALIBRATION_ACCESS]
[-> COMPARISON_QUANTITY]
[-> DEPENDENT_CHARACTERISTIC]
[-> DISCRETE] (1.60 ..)
[-> DISPLAY_IDENTIFIER]
[-> ECU_ADDRESS_EXTENSION]
[-> ENCODING] (1.70 ..)
[-> EXTENDED_LIMITS]
[-> FORMAT]
[-> FUNCTION_LIST]
[-> GUARD_RAILS]
[-> IF_DATA]*
[-> MAP_LIST]
[-> MATRIX_DIM]
[-> MAX_REFRESH]
[-> MODEL_LINK] (1.70 ..)
[-> NUMBER] [-> PHYS_UNIT] (1.60 ..)
[-> READ_ONLY]
[-> REF_MEMORY_SEGMENT]
[-> STEP_SIZE] (1.60 ..)
[-> SYMBOL_LINK] (1.60 ..)
[-> VIRTUAL_CHARACTERISTIC]
}
keyword COEFFS {
float a
float b
float c
float d
float e
float f
}
keyword COEFFS_LINEAR {
float a
float b
}
keyword COMPARISON_QUANTITY {
ident name
}
enum ConversionType {
IDENTICAL (1.60 ..),
FORM,
LINEAR (1.60 ..),
RAT_FUNC,
TAB_INTP,
TAB_NOINTP,
TAB_VERB
}
block COMPU_METHOD {
ident name
string long_identifier
ConversionType conversion_type
string format
string unit
[-> COEFFS]
[-> COEFFS_LINEAR] (1.60 ..)
[-> COMPU_TAB_REF]
[-> FORMULA]
[-> REF_UNIT]
[-> STATUS_STRING_REF] (1.60 ..)
}
block COMPU_TAB {
ident name
string long_identifier
ConversionType conversion_type
uint number_value_pairs
{
float in_val
float out_val
}* tab_entry
[-> DEFAULT_VALUE]
[-> DEFAULT_VALUE_NUMERIC] (1.60 ..)
}
keyword COMPU_TAB_REF {
ident conversion_table
}
block COMPU_VTAB {
ident name
string long_identifier
ConversionType conversion_type
uint number_value_pairs
{
float in_val
string out_val
}* value_pairs
[-> DEFAULT_VALUE]
}
block COMPU_VTAB_RANGE {
ident name
string long_identifier
uint number_value_triples
{
float in_val_min
float in_val_max
string out_val
}* value_triples
[-> DEFAULT_VALUE]
}
keyword CONSISTENT_EXCHANGE {}
keyword CONVERSION {
ident name
}
keyword CPU_TYPE {
string cpu
}
keyword CURVE_AXIS_REF {
ident curve_axis
}
keyword CUSTOMER {
string customer
}
keyword CUSTOMER_NO {
string number
}
keyword DATA_SIZE {
uint size
}
block DEF_CHARACTERISTIC {
{ ident identifier }* identifier_list
}
keyword DEFAULT_VALUE {
string display_string
}
keyword DEFAULT_VALUE_NUMERIC {
float display_value
}
block DEPENDENT_CHARACTERISTIC {
string formula
{ident characteristic}* characteristic_list
}
enum DepositMode {
ABSOLUTE,
DIFFERENCE
}
keyword DEPOSIT {
DepositMode mode
}
keyword DISCRETE {}
keyword DISPLAY_IDENTIFIER {
ident display_name
}
keyword DIST_OP_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
keyword ECU {
string control_unit
}
keyword ECU_ADDRESS {
ulong address
}
keyword ECU_ADDRESS_EXTENSION {
int extension
}
keyword ECU_CALIBRATION_OFFSET {
long offset
}
enum CharacterEncoding {
UTF8,
UTF16,
UTF32
}
keyword ENCODING {
CharacterEncoding encoding
}
keyword EPK {
string identifier
}
keyword ERROR_MASK {
uint64 mask
}
keyword EXTENDED_LIMITS {
float lower_limit
float upper_limit
}
keyword FIX_AXIS_PAR {
float offset float shift uint number_apo
}
keyword FIX_AXIS_PAR_DIST {
float offset float distance uint number_apo
}
block FIX_AXIS_PAR_LIST {
{ float axis_pts_value }* axis_pts_value_list
}
keyword FIX_NO_AXIS_PTS_X / _Y / _Z / _4 / _5 {
uint number_of_axis_points
}
enum IndexMode {
ALTERNATE_CURVES,
ALTERNATE_WITH_X,
ALTERNATE_WITH_Y,
COLUMN_DIR,
ROW_DIR
}
keyword FNC_VALUES {
uint position
DataType datatype
IndexMode index_mode
AddrType address_type
}
keyword FORMAT {
string format_string
}
block FORMULA {
string fx
[-> FORMULA_INV]
}
keyword FORMULA_INV {
string gx
}
block FRAME {
ident name
string long_identifier
uint scaling_unit
ulong rate
[-> FRAME_MEASUREMENT]
[-> IF_DATA]*
}
keyword FRAME_MEASUREMENT {
{ ident identifier}* identifier_list
}
block FUNCTION {
ident name
string long_identifier
[-> ANNOTATION]*
[-> AR_COMPONENT] (1.70 ..)
[-> DEF_CHARACTERISTIC]
[-> FUNCTION_VERSION]
[-> IF_DATA]* (1.60 ..)
[-> IN_MEASUREMENT]
[-> LOC_MEASUREMENT]
[-> OUT_MEASUREMENT]
[-> REF_CHARACTERISTIC]
[-> SUB_FUNCTION]
}
block FUNCTION_LIST {
{ident name}* name_list
}
keyword FUNCTION_VERSION {
string version_identifier
}
block GROUP {
ident name
string long_identifier
[-> ANNOTATION]*
[-> FUNCTION_LIST]
[-> IF_DATA]* (1.60 ..)
[-> REF_CHARACTERISTIC]
[-> REF_MEASUREMENT]
[-> ROOT]
[-> SUB_GROUP]
}
keyword GUARD_RAILS {}
block HEADER {
string comment
[-> PROJECT_NO]
[-> VERSION]
}
keyword IDENTIFICATION {
uint position
DataType datatype
}
block IF_DATA {
}
block IN_MEASUREMENT {
{ident identifier}* identifier_list
}
keyword INPUT_QUANTITY {
ident name
}
block INSTANCE {
ident name
string long_identifier
ident type_ref
ulong start_address
[-> ADDRESS_TYPE] (1.71 ..)
[-> ANNOTATION]*
[-> CALIBRATION_ACCESS]
[-> DISPLAY_IDENTIFIER]
[-> ECU_ADDRESS_EXTENSION]
[-> IF_DATA]*
[-> LAYOUT]
[-> MATRIX_DIM]
[-> MAX_REFRESH]
[-> MODEL_LINK]
[-> OVERWRITE]*
[-> READ_WRITE]
[-> SYMBOL_LINK]
}
keyword LAYOUT {
IndexMode index_mode
}
keyword LEFT_SHIFT {
ulong bitcount
}
keyword LIMITS {
float lower_limit
float upper_limit
}
block LOC_MEASUREMENT {
{ident identifier}* identifier_list
}
block MAP_LIST {
{ident name}* name_list
}
keyword MATRIX_DIM {
{uint dim}* dim_list }
keyword MAX_GRAD {
float max_gradient
}
keyword MAX_REFRESH {
uint scaling_unit
ulong rate
}
block MEASUREMENT {
ident name
string long_identifier
DataType datatype
ident conversion
uint resolution
float accuracy
float lower_limit
float upper_limit
[-> ADDRESS_TYPE] (1.70 ..)
[-> ANNOTATION]*
[-> ARRAY_SIZE] (.. 1.51)
[-> BIT_MASK]
[-> BIT_OPERATION]
[-> BYTE_ORDER]
[-> DISCRETE] (1.60 ..)
[-> DISPLAY_IDENTIFIER]
[-> ECU_ADDRESS]
[-> ECU_ADDRESS_EXTENSION]
[-> ERROR_MASK]
[-> FORMAT]
[-> FUNCTION_LIST]
[-> IF_DATA]*
[-> LAYOUT] (1.60 ..)
[-> MATRIX_DIM]
[-> MAX_REFRESH]
[-> MODEL_LINK] (1.70 ..)
[-> PHYS_UNIT] (1.60 ..)
[-> READ_WRITE]
[-> REF_MEMORY_SEGMENT]
[-> SYMBOL_LINK] (1.60 ..)
[-> VIRTUAL]
}
enum ProgType {
PRG_CODE,
PRG_DATA,
PRG_RESERVED
}
block MEMORY_LAYOUT {
ProgType prog_type
ulong address
ulong size
long[5] offset
[-> IF_DATA]*
}
enum PrgType {
CALIBRATION_VARIABLES,
CODE,
DATA,
EXCLUDE_FROM_FLASH,
OFFLINE_DATA,
RESERVED,
SERAM,
VARIABLES
}
enum MemoryType {
EEPROM,
EPROM,
FLASH,
RAM,
ROM,
REGISTER,
NOT_IN_ECU (1.70 ..)
}
enum MemoryAttribute {
INTERN,
EXTERN
}
block MEMORY_SEGMENT {
ident name
string long_identifier
PrgType prg_type
MemoryType memory_type
MemoryAttribute attribute
ulong address
ulong size
long[5] offset
[-> IF_DATA]*
}
block MOD_COMMON {
string comment
[-> ALIGNMENT_BYTE]
[-> ALIGNMENT_FLOAT16_IEEE] (1.71 ..)
[-> ALIGNMENT_FLOAT32_IEEE]
[-> ALIGNMENT_FLOAT64_IEEE]
[-> ALIGNMENT_INT64] (1.60 ..)
[-> ALIGNMENT_LONG]
[-> ALIGNMENT_WORD]
[-> BYTE_ORDER]
[-> DATA_SIZE]
[-> DEPOSIT]
[-> S_REC_LAYOUT] (.. 1.60) }
block MOD_PAR {
string comment
[-> ADDR_EPK]*
[-> CALIBRATION_METHOD]*
[-> CPU_TYPE]
[-> CUSTOMER]
[-> CUSTOMER_NO]
[-> ECU]
[-> ECU_CALIBRATION_OFFSET]
[-> EPK]
[-> MEMORY_LAYOUT]*
[-> MEMORY_SEGMENT]*
[-> NO_OF_INTERFACES]
[-> PHONE_NO]
[-> SUPPLIER]
[-> SYSTEM_CONSTANT]*
[-> USER]
[-> VERSION]
}
keyword MODEL_LINK {
string model_link
}
block MODULE {
ident name
string long_identifier
[-> A2ML]
[-> AXIS_PTS]*
[-> BLOB]* (1.70 ..)
[-> CHARACTERISTIC]*
[-> COMPU_METHOD]*
[-> COMPU_TAB]*
[-> COMPU_VTAB]*
[-> COMPU_VTAB_RANGE]*
[-> FRAME]*
[-> FUNCTION]*
[-> GROUP]*
[-> IF_DATA]*
[-> INSTANCE]* (1.70 ..)
[-> MEASUREMENT]*
[-> MOD_COMMON]
[-> MOD_PAR]
[-> RECORD_LAYOUT]*
[-> TRANSFORMER]* (1.70 ..)
[-> TYPEDEF_AXIS]* (1.70 ..)
[-> TYPEDEF_BLOB]* (1.70 ..)
[-> TYPEDEF_CHARACTERISTIC]* (1.70 ..)
[-> TYPEDEF_MEASUREMENT]* (1.70 ..)
[-> TYPEDEF_STRUCTURE]* (1.70 ..)
[-> UNIT]*
[-> USER_RIGHTS]*
[-> VARIANT_CODING]
}
enum MonotonyType {
MON_DECREASE,
MON_INCREASE,
STRICT_DECREASE,
STRICT_INCREASE,
MONOTONOUS (1.60 ..),
STRICT_MON (1.60 ..),
NOT_MON (1.60 ..)
}
keyword MONOTONY {
MonotonyType monotony
}
keyword NO_AXIS_PTS_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
keyword NO_OF_INTERFACES {
uint num
}
keyword NO_RESCALE_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
keyword NUMBER {
uint number
}
keyword OFFSET_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
block OUT_MEASUREMENT {
{ident identifier}* identifier_list
}
block OVERWRITE {
ident name
ulong axis_number
[-> CONVERSION]
[-> EXTENDED_LIMITS]
[-> FORMAT]
[-> INPUT_QUANTITY]
[-> LIMITS]
[-> MONOTONY]
[-> PHYS_UNIT]
}
keyword PHONE_NO {
string telnum
}
keyword PHYS_UNIT {
string unit
}
block PROJECT {
ident name
string long_identifier
[-> HEADER]
[-> MODULE]+
}
keyword PROJECT_NO {
ident project_number
}
keyword READ_ONLY {}
keyword READ_WRITE {}
block RECORD_LAYOUT {
ident name
[-> ALIGNMENT_BYTE]
[-> ALIGNMENT_FLOAT16_IEEE] (1.71 ..)
[-> ALIGNMENT_FLOAT32_IEEE]
[-> ALIGNMENT_FLOAT64_IEEE]
[-> ALIGNMENT_INT64]
[-> ALIGNMENT_LONG]
[-> ALIGNMENT_WORD]
[-> AXIS_PTS_X/_Y/_Z/_4/_5]
[-> AXIS_RESCALE_X/_Y/_Z/_4/_5]
[-> DIST_OP_X/_Y/_Z/_4/_5]
[-> FIX_NO_AXIS_PTS_X/_Y/_Z/_4/_5]
[-> FNC_VALUES]
[-> IDENTIFICATION]
[-> NO_AXIS_PTS_X/_Y/_Z/_4/_5]
[-> NO_RESCALE_X/_Y/_Z/_4/_5]
[-> OFFSET_X/_Y/_Z/_4/_5]
[-> RESERVED]*
[-> RIP_ADDR_W/_X/_Y/_Z/_4/_5]
[-> SRC_ADDR_X/_Y/_Z/_4/_5]
[-> SHIFT_OP_X/_Y/_Z/_4/_5]
[-> STATIC_RECORD_LAYOUT] (1.60 ..)
[-> STATIC_ADDRESS_OFFSETS] (1.70 ..)
}
block REF_CHARACTERISTIC {
{ ident identifier}* identifier_list
}
block REF_GROUP {
{ ident identifier}* identifier_list
}
block REF_MEASUREMENT {
{ ident identifier}* identifier_list
}
keyword REF_MEMORY_SEGMENT {
ident name
}
keyword REF_UNIT {
ident unit
}
keyword RESERVED {
uint position
DataTypeSize data_size
}
keyword RIGHT_SHIFT {
ulong bitcount
}
keyword RIP_ADDR_W / _X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
keyword ROOT {}
keyword SHIFT_OP_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
keyword SIGN_EXTEND {}
keyword SI_EXPONENTS {
int length
int mass
int time
int electric_current
int temperature
int amount_of_substance
int luminous_intensity
}
keyword SRC_ADDR_X / _Y / _Z / _4 / _5 {
uint position
DataType datatype
}
keyword STATIC_ADDRESS_OFFSETS {}
keyword STATIC_RECORD_LAYOUT {}
keyword STATUS_STRING_REF {
ident conversion_table
}
keyword STEP_SIZE {
float step_size
}
block STRUCTURE_COMPONENT {
ident name
ident component_type
ulong address_offset
[-> ADDRESS_TYPE] (1.71 ..)
[-> LAYOUT]
[-> MATRIX_DIM]
[-> SYMBOL_TYPE_LINK]
}
block SUB_FUNCTION {
{ ident identifier}* identifier_list
}
block SUB_GROUP {
{ ident identifier}* identifier_list
}
keyword SUPPLIER {
string manufacturer
}
keyword SYMBOL_LINK {
string symbol_name
long offset
}
keyword SYMBOL_TYPE_LINK {
string symbol_type
}
keyword SYSTEM_CONSTANT {
string name
string value
}
keyword S_REC_LAYOUT {
ident name
}
enum TransformerTrigger {
ON_USER_REQUEST,
ON_CHANGE
}
block TRANSFORMER {
ident name
string version
string dllname_32bit
string dllname_64bit
uint timeout
TransformerTrigger trigger
ident inverse_transformer
[-> TRANSFORMER_IN_OBJECTS]
[-> TRANSFORMER_OUT_OBJECTS]
}
block TRANSFORMER_IN_OBJECTS {
{ident identifier}* identifier_list
}
block TRANSFORMER_OUT_OBJECTS {
{ident identifier}* identifier_list
}
block TYPEDEF_AXIS {
ident name
string long_identifier
ident input_quantity
ident record_layout
float max_diff
ident conversion
uint max_axis_points
float lower_limit
float upper_limit
[-> BYTE_ORDER]
[-> DEPOSIT]
[-> EXTENDED_LIMITS]
[-> FORMAT]
[-> MONOTONY]
[-> PHYS_UNIT]
[-> STEP_SIZE]
}
block TYPEDEF_BLOB {
ident name
string long_identifier
ulong size
[-> ADDRESS_TYPE] (1.71 ..)
}
block TYPEDEF_CHARACTERISTIC {
ident name
string long_identifier
CharacteristicType characteristic_type
ident record_layout
float max_diff
ident conversion
float lower_limit
float upper_limit
[-> AXIS_DESCR]*
[-> BIT_MASK]
[-> BYTE_ORDER]
[-> DISCRETE]
[-> ENCODING]
[-> EXTENDED_LIMITS]
[-> FORMAT]
[-> MATRIX_DIM]
[-> NUMBER]
[-> PHYS_UNIT]
[-> STEP_SIZE]
}
block TYPEDEF_MEASUREMENT {
ident name
string long_identifier
DataType datatype
ident conversion
uint resolution
float accuracy
float lower_limit
float upper_limit
[-> ADDRESS_TYPE]
[-> BIT_MASK]
[-> BIT_OPERATION]
[-> BYTE_ORDER]
[-> DISCRETE]
[-> ERROR_MASK]
[-> FORMAT]
[-> LAYOUT]
[-> MATRIX_DIM]
[-> PHYS_UNIT]
}
block TYPEDEF_STRUCTURE {
ident name
string long_identifier
ulong total_size
[-> ADDRESS_TYPE]
[-> CONSISTENT_EXCHANGE]
[-> STRUCTURE_COMPONENT]*
[-> SYMBOL_TYPE_LINK]
}
enum UnitType {
DERIVED,
EXTENDED_SI
}
block UNIT {
ident name
string long_identifier
string display
UnitType unit_type
[-> REF_UNIT]
[-> SI_EXPONENTS]
[-> UNIT_CONVERSION]
}
keyword UNIT_CONVERSION {
float gradient
float offset
}
keyword USER {
string user_name
}
block USER_RIGHTS {
ident user_level_id
[-> READ_ONLY]
[-> REF_GROUP]*
}
block VAR_ADDRESS {
{ ulong address}* address_list
}
block VAR_CHARACTERISTIC {
ident name
{ ident criterion_name }* criterion_name_list
[-> VAR_ADDRESS]
}
block VAR_CRITERION {
ident name
string long_identifier
{ident value}* value_list
[-> VAR_MEASUREMENT]
[-> VAR_SELECTION_CHARACTERISTIC]
}
block VAR_FORBIDDEN_COMB {
{
ident criterion_name
ident criterion_value
}* combination
}
keyword VAR_MEASUREMENT {
ident name
}
enum VarNamingTag {
NUMERIC
}
keyword VAR_NAMING {
VarNamingTag tag
}
keyword VAR_SELECTION_CHARACTERISTIC {
ident name
}
keyword VAR_SEPARATOR {
string separator
}
block VARIANT_CODING {
[-> VAR_CHARACTERISTIC]*
[-> VAR_CRITERION]*
[-> VAR_FORBIDDEN_COMB]*
[-> VAR_NAMING]
[-> VAR_SEPARATOR]
}
keyword VERSION {
string version_identifier
}
block VIRTUAL {
{ ident measuring_channel }* measuring_channel_list
}
block VIRTUAL_CHARACTERISTIC {
string formula
{ident characteristic }* characteristic_list
}
}
#[derive(Clone)]
pub struct A2ml {
pub a2ml_text: String,
merged_a2ml_text: String,
pub(crate) __block_info: BlockInfo<(u32, ())>,
}
impl std::fmt::Debug for A2ml {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("A2ml")
.field("a2ml_text", &self.a2ml_text)
.finish()
}
}
impl A2ml {
#[must_use]
pub fn new(a2ml_text: String) -> Self {
let merged_a2ml_text = a2ml_text.clone();
Self {
a2ml_text,
merged_a2ml_text,
__block_info: BlockInfo {
incfile: None,
line: 0,
uid: 0,
start_offset: 1,
end_offset: 1,
item_location: (0, ()),
},
}
}
pub(crate) fn parse(
parser: &mut ParserState,
context: &ParseContext,
start_offset: u32,
) -> Result<Self, ParserError> {
let fileid = parser.get_incfilename(context.fileid);
let line = context.line;
let uid = parser.get_next_id();
let token = parser.expect_token(context, A2lTokenType::String)?;
let __a2ml_text_location = parser.get_line_offset();
let a2ml_text = parser.get_token_text(token).to_string();
let filename = &parser.filenames[context.fileid];
let merged_a2ml_text = match a2ml::parse_a2ml(filename, &a2ml_text) {
Ok((a2mlspec, computed_merged_a2ml_text)) => {
parser.a2mlspec.push(a2mlspec);
computed_merged_a2ml_text
}
Err(errmsg) => {
parser.error_or_log(ParserError::A2mlError {
filename: filename.to_string(),
error_line: parser.last_token_position,
errmsg,
})?;
String::new()
}
};
parser.expect_token(context, A2lTokenType::End)?;
let ident = parser.get_identifier(context)?;
if ident != "A2ML" {
parser.error_or_log(ParserError::IncorrectEndTag {
filename: parser.filenames[context.fileid].to_string(),
error_line: parser.last_token_position,
tag: ident.clone(),
block: context.element.clone(),
block_line: context.line,
})?;
}
Ok(A2ml {
a2ml_text,
merged_a2ml_text,
__block_info: BlockInfo {
incfile: fileid,
line,
uid,
start_offset,
end_offset: 1, item_location: (__a2ml_text_location, ()),
},
})
}
pub(crate) fn stringify(&self, indent: usize) -> String {
let mut writer = writer::Writer::new(indent);
let text_fixed = self
.a2ml_text
.split("\r\n")
.collect::<Vec<&str>>()
.join("\n");
writer.add_str_raw(&text_fixed, self.__block_info.item_location.0);
writer.finish()
}
}
impl A2lObject<(u32, ())> for A2ml {
fn get_layout(&self) -> &BlockInfo<(u32, ())> {
&self.__block_info
}
fn get_layout_mut(&mut self) -> &mut BlockInfo<(u32, ())> {
&mut self.__block_info
}
fn reset_location(&mut self) {
self.merge_includes();
self.__block_info.uid = 0;
}
fn merge_includes(&mut self) {
self.__block_info.incfile = None;
self.a2ml_text = self.merged_a2ml_text.clone();
}
fn get_line(&self) -> u32 {
self.__block_info.line
}
}
impl PartialEq for A2ml {
fn eq(&self, other: &Self) -> bool {
self.a2ml_text == other.a2ml_text
}
}
#[derive(Clone)]
pub struct IfData {
pub ifdata_items: Option<a2ml::GenericIfData>,
pub ifdata_valid: bool,
pub(crate) __block_info: BlockInfo<()>,
}
impl std::fmt::Debug for IfData {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("IfData")
.field("ifdata_items", &self.ifdata_items)
.finish()
}
}
impl IfData {
#[must_use]
pub fn new() -> Self {
Self {
ifdata_items: None,
ifdata_valid: false,
__block_info: BlockInfo {
incfile: None,
line: 0,
uid: 0,
start_offset: 1,
end_offset: 1,
item_location: (),
},
}
}
pub(crate) fn parse(
parser: &mut ParserState,
context: &ParseContext,
start_offset: u32,
) -> Result<Self, ParserError> {
let fileid = parser.get_incfilename(context.fileid);
let line = context.line;
let uid = parser.get_next_id();
let (ifdata_items, ifdata_valid) = ifdata::parse_ifdata(parser, context)?;
parser.expect_token(context, A2lTokenType::End)?;
let end_offset = parser.get_line_offset();
let ident = parser.get_identifier(context)?;
if ident != "IF_DATA" {
parser.error_or_log(ParserError::IncorrectEndTag {
filename: parser.filenames[context.fileid].to_string(),
error_line: parser.last_token_position,
tag: ident.clone(),
block: context.element.clone(),
block_line: context.line,
})?;
}
Ok(IfData {
ifdata_items,
ifdata_valid,
__block_info: BlockInfo {
incfile: fileid,
line,
uid,
start_offset,
end_offset,
item_location: (),
},
})
}
pub(crate) fn stringify(&self, indent: usize) -> String {
if let Some(ifdata_items) = &self.ifdata_items {
ifdata_items.write(indent - 1)
} else {
String::new()
}
}
}
impl Default for IfData {
fn default() -> Self {
Self::new()
}
}
impl A2lObject<()> for IfData {
fn get_layout(&self) -> &BlockInfo<()> {
&self.__block_info
}
fn get_layout_mut(&mut self) -> &mut BlockInfo<()> {
&mut self.__block_info
}
fn reset_location(&mut self) {
self.merge_includes();
self.__block_info.uid = 0;
}
fn merge_includes(&mut self) {
self.__block_info.incfile = None;
if let Some(ifdata_items) = &mut self.ifdata_items {
ifdata_items.merge_includes();
}
}
fn get_line(&self) -> u32 {
self.__block_info.line
}
}
impl PartialEq for IfData {
fn eq(&self, other: &Self) -> bool {
self.ifdata_items == other.ifdata_items
}
}
impl PositionRestricted for Asap2Version {
fn pos_restrict(&self) -> Option<u16> {
Some(1)
}
}
impl PositionRestricted for A2mlVersion {
fn pos_restrict(&self) -> Option<u16> {
Some(2)
}
}
impl PositionRestricted for Project {
fn pos_restrict(&self) -> Option<u16> {
Some(3)
}
}
impl PositionRestricted for AxisPtsDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for AxisRescaleDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for DistOpDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for FncValues {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for Identification {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for NoAxisPtsDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for NoRescaleDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for OffsetDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for Reserved {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for RipAddrDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for ShiftOpDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for SrcAddrDim {
fn pos_restrict(&self) -> Option<u16> {
Some(self.position)
}
}
impl PositionRestricted for A2lFile {}
impl PositionRestricted for A2ml {}
impl PositionRestricted for AddrEpk {}
impl PositionRestricted for AddressType {}
impl PositionRestricted for AlignmentByte {}
impl PositionRestricted for AlignmentFloat16Ieee {}
impl PositionRestricted for AlignmentFloat32Ieee {}
impl PositionRestricted for AlignmentFloat64Ieee {}
impl PositionRestricted for AlignmentInt64 {}
impl PositionRestricted for AlignmentLong {}
impl PositionRestricted for AlignmentWord {}
impl PositionRestricted for Annotation {}
impl PositionRestricted for AnnotationLabel {}
impl PositionRestricted for AnnotationOrigin {}
impl PositionRestricted for AnnotationText {}
impl PositionRestricted for ArComponent {}
impl PositionRestricted for ArPrototypeOf {}
impl PositionRestricted for ArraySize {}
impl PositionRestricted for AxisDescr {}
impl PositionRestricted for AxisPts {}
impl PositionRestricted for AxisPtsRef {}
impl PositionRestricted for BitMask {}
impl PositionRestricted for BitOperation {}
impl PositionRestricted for Blob {}
impl PositionRestricted for ByteOrder {}
impl PositionRestricted for CalibrationAccess {}
impl PositionRestricted for CalibrationHandle {}
impl PositionRestricted for CalibrationHandleText {}
impl PositionRestricted for CalibrationMethod {}
impl PositionRestricted for Characteristic {}
impl PositionRestricted for Coeffs {}
impl PositionRestricted for CoeffsLinear {}
impl PositionRestricted for ComparisonQuantity {}
impl PositionRestricted for CompuMethod {}
impl PositionRestricted for CompuTab {}
impl PositionRestricted for CompuTabRef {}
impl PositionRestricted for CompuVtab {}
impl PositionRestricted for CompuVtabRange {}
impl PositionRestricted for ConsistentExchange {}
impl PositionRestricted for Conversion {}
impl PositionRestricted for CpuType {}
impl PositionRestricted for CurveAxisRef {}
impl PositionRestricted for Customer {}
impl PositionRestricted for CustomerNo {}
impl PositionRestricted for DataSize {}
impl PositionRestricted for DefCharacteristic {}
impl PositionRestricted for DefaultValue {}
impl PositionRestricted for DefaultValueNumeric {}
impl PositionRestricted for DependentCharacteristic {}
impl PositionRestricted for Deposit {}
impl PositionRestricted for Discrete {}
impl PositionRestricted for DisplayIdentifier {}
impl PositionRestricted for Ecu {}
impl PositionRestricted for EcuAddress {}
impl PositionRestricted for EcuAddressExtension {}
impl PositionRestricted for EcuCalibrationOffset {}
impl PositionRestricted for Encoding {}
impl PositionRestricted for Epk {}
impl PositionRestricted for ErrorMask {}
impl PositionRestricted for ExtendedLimits {}
impl PositionRestricted for FixAxisPar {}
impl PositionRestricted for FixAxisParDist {}
impl PositionRestricted for FixAxisParList {}
impl PositionRestricted for FixNoAxisPtsDim {}
impl PositionRestricted for Format {}
impl PositionRestricted for Formula {}
impl PositionRestricted for FormulaInv {}
impl PositionRestricted for Frame {}
impl PositionRestricted for FrameMeasurement {}
impl PositionRestricted for Function {}
impl PositionRestricted for FunctionList {}
impl PositionRestricted for FunctionVersion {}
impl PositionRestricted for Group {}
impl PositionRestricted for GuardRails {}
impl PositionRestricted for Header {}
impl PositionRestricted for IfData {}
impl PositionRestricted for InMeasurement {}
impl PositionRestricted for InputQuantity {}
impl PositionRestricted for Instance {}
impl PositionRestricted for Layout {}
impl PositionRestricted for LeftShift {}
impl PositionRestricted for Limits {}
impl PositionRestricted for LocMeasurement {}
impl PositionRestricted for MapList {}
impl PositionRestricted for MatrixDim {}
impl PositionRestricted for MaxGrad {}
impl PositionRestricted for MaxRefresh {}
impl PositionRestricted for Measurement {}
impl PositionRestricted for MemoryLayout {}
impl PositionRestricted for MemorySegment {}
impl PositionRestricted for ModCommon {}
impl PositionRestricted for ModPar {}
impl PositionRestricted for ModelLink {}
impl PositionRestricted for Module {}
impl PositionRestricted for Monotony {}
impl PositionRestricted for NoOfInterfaces {}
impl PositionRestricted for Number {}
impl PositionRestricted for OutMeasurement {}
impl PositionRestricted for Overwrite {}
impl PositionRestricted for PhoneNo {}
impl PositionRestricted for PhysUnit {}
impl PositionRestricted for ProjectNo {}
impl PositionRestricted for ReadOnly {}
impl PositionRestricted for ReadWrite {}
impl PositionRestricted for RecordLayout {}
impl PositionRestricted for RefCharacteristic {}
impl PositionRestricted for RefGroup {}
impl PositionRestricted for RefMeasurement {}
impl PositionRestricted for RefMemorySegment {}
impl PositionRestricted for RefUnit {}
impl PositionRestricted for RightShift {}
impl PositionRestricted for Root {}
impl PositionRestricted for SRecLayout {}
impl PositionRestricted for SiExponents {}
impl PositionRestricted for SignExtend {}
impl PositionRestricted for StaticAddressOffsets {}
impl PositionRestricted for StaticRecordLayout {}
impl PositionRestricted for StatusStringRef {}
impl PositionRestricted for StepSize {}
impl PositionRestricted for StructureComponent {}
impl PositionRestricted for SubFunction {}
impl PositionRestricted for SubGroup {}
impl PositionRestricted for Supplier {}
impl PositionRestricted for SymbolLink {}
impl PositionRestricted for SymbolTypeLink {}
impl PositionRestricted for SystemConstant {}
impl PositionRestricted for Transformer {}
impl PositionRestricted for TransformerInObjects {}
impl PositionRestricted for TransformerOutObjects {}
impl PositionRestricted for TypedefAxis {}
impl PositionRestricted for TypedefBlob {}
impl PositionRestricted for TypedefCharacteristic {}
impl PositionRestricted for TypedefMeasurement {}
impl PositionRestricted for TypedefStructure {}
impl PositionRestricted for Unit {}
impl PositionRestricted for UnitConversion {}
impl PositionRestricted for User {}
impl PositionRestricted for UserRights {}
impl PositionRestricted for VarAddress {}
impl PositionRestricted for VarCharacteristic {}
impl PositionRestricted for VarCriterion {}
impl PositionRestricted for VarForbiddenComb {}
impl PositionRestricted for VarMeasurement {}
impl PositionRestricted for VarNaming {}
impl PositionRestricted for VarSelectionCharacteristic {}
impl PositionRestricted for VarSeparator {}
impl PositionRestricted for VariantCoding {}
impl PositionRestricted for Version {}
impl PositionRestricted for Virtual {}
impl PositionRestricted for VirtualCharacteristic {}
#[cfg(test)]
mod test {
use super::*;
fn trait_test_helper<L, T: std::fmt::Debug + A2lObject<L> + PositionRestricted>(item: &mut T) {
item.get_layout_mut().uid = 1;
assert_eq!(item.get_layout().uid, 1);
item.reset_location();
assert_eq!(item.get_layout().uid, 0);
assert_eq!(item.get_line(), 0);
item.merge_includes();
let _res = item.pos_restrict();
let dbg_disp = format!("{item:#?}");
assert!(!dbg_disp.is_empty());
}
#[test]
fn traits_test() {
let mut item = A2lFile::new(Project::new("".to_string(), "".to_string()));
trait_test_helper(&mut item);
let mut item = A2ml::new("".to_string());
trait_test_helper(&mut item);
let mut item = A2mlVersion::new(0, 0);
trait_test_helper(&mut item);
let mut item = AddrEpk::new(0);
trait_test_helper(&mut item);
let mut item = AddressType::new(AddrType::Direct);
trait_test_helper(&mut item);
let mut item = AlignmentByte::new(0);
trait_test_helper(&mut item);
let mut item = AlignmentFloat16Ieee::new(0);
trait_test_helper(&mut item);
let mut item = AlignmentFloat32Ieee::new(0);
trait_test_helper(&mut item);
let mut item = AlignmentFloat64Ieee::new(0);
trait_test_helper(&mut item);
let mut item = AlignmentInt64::new(0);
trait_test_helper(&mut item);
let mut item = AlignmentLong::new(0);
trait_test_helper(&mut item);
let mut item = AlignmentWord::new(0);
trait_test_helper(&mut item);
let mut item = Annotation::new();
trait_test_helper(&mut item);
let mut item = AnnotationLabel::new("".to_string());
trait_test_helper(&mut item);
let mut item = AnnotationOrigin::new("".to_string());
trait_test_helper(&mut item);
let mut item = AnnotationText::new();
trait_test_helper(&mut item);
let mut item = ArComponent::new("".to_string());
trait_test_helper(&mut item);
let mut item = ArPrototypeOf::new("".to_string());
trait_test_helper(&mut item);
let mut item = ArraySize::new(0);
trait_test_helper(&mut item);
let mut item = Asap2Version::new(0, 0);
trait_test_helper(&mut item);
let mut item = AxisDescr::new(
AxisDescrAttribute::StdAxis,
"".to_string(),
"".to_string(),
0,
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = AxisPts::new(
"".to_string(),
"".to_string(),
0,
"".to_string(),
"".to_string(),
0.0,
"".to_string(),
0,
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = AxisPtsDim::new(0, DataType::Ubyte, IndexOrder::IndexIncr, AddrType::Direct);
trait_test_helper(&mut item);
let mut item = AxisPtsRef::new("".to_string());
trait_test_helper(&mut item);
let mut item = AxisRescaleDim::new(
0,
DataType::Float16Ieee,
0,
IndexOrder::IndexIncr,
AddrType::Direct,
);
trait_test_helper(&mut item);
let mut item = BitMask::new(0);
trait_test_helper(&mut item);
let mut item = BitOperation::new();
trait_test_helper(&mut item);
let mut item = Blob::new("".to_string(), "".to_string(), 0, 0);
trait_test_helper(&mut item);
let mut item = ByteOrder::new(ByteOrderEnum::MsbFirst);
trait_test_helper(&mut item);
let mut item = CalibrationAccess::new(CalibrationAccessEnum::Calibration);
trait_test_helper(&mut item);
let mut item = CalibrationHandle::new();
trait_test_helper(&mut item);
let mut item = CalibrationHandleText::new("".to_string());
trait_test_helper(&mut item);
let mut item = CalibrationMethod::new("".to_string(), 0);
trait_test_helper(&mut item);
let mut item = Characteristic::new(
"".to_string(),
"".to_string(),
CharacteristicType::Value,
0,
"".to_string(),
0.0,
"".to_string(),
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = Coeffs::new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
trait_test_helper(&mut item);
let mut item = CoeffsLinear::new(0.0, 0.0);
trait_test_helper(&mut item);
let mut item = ComparisonQuantity::new("".to_string());
trait_test_helper(&mut item);
let mut item = CompuMethod::new(
"".to_string(),
"".to_string(),
ConversionType::Identical,
"".to_string(),
"".to_string(),
);
trait_test_helper(&mut item);
let mut item = CompuTab::new("".to_string(), "".to_string(), ConversionType::Identical, 0);
trait_test_helper(&mut item);
let mut item = CompuTabRef::new("".to_string());
trait_test_helper(&mut item);
let mut item = CompuVtab::new("".to_string(), "".to_string(), ConversionType::Identical, 0);
trait_test_helper(&mut item);
let mut item = CompuVtabRange::new("".to_string(), "".to_string(), 0);
trait_test_helper(&mut item);
let mut item = ConsistentExchange::new();
trait_test_helper(&mut item);
let mut item = Conversion::new("".to_string());
trait_test_helper(&mut item);
let mut item = CpuType::new("".to_string());
trait_test_helper(&mut item);
let mut item = CurveAxisRef::new("".to_string());
trait_test_helper(&mut item);
let mut item = Customer::new("".to_string());
trait_test_helper(&mut item);
let mut item = CustomerNo::new("".to_string());
trait_test_helper(&mut item);
let mut item = DataSize::new(0);
trait_test_helper(&mut item);
let mut item = DefCharacteristic::new();
trait_test_helper(&mut item);
let mut item = DefaultValue::new("".to_string());
trait_test_helper(&mut item);
let mut item = DefaultValueNumeric::new(0.0);
trait_test_helper(&mut item);
let mut item = DependentCharacteristic::new("".to_string());
trait_test_helper(&mut item);
let mut item = Deposit::new(DepositMode::Absolute);
trait_test_helper(&mut item);
let mut item = Discrete::new();
trait_test_helper(&mut item);
let mut item = DisplayIdentifier::new("".to_string());
trait_test_helper(&mut item);
let mut item = Ecu::new("".to_string());
trait_test_helper(&mut item);
let mut item = EcuAddress::new(0);
trait_test_helper(&mut item);
let mut item = EcuAddressExtension::new(0);
trait_test_helper(&mut item);
let mut item = EcuCalibrationOffset::new(0);
trait_test_helper(&mut item);
let mut item = Encoding::new(CharacterEncoding::Utf8);
trait_test_helper(&mut item);
let mut item = Epk::new("".to_string());
trait_test_helper(&mut item);
let mut item = ErrorMask::new(0);
trait_test_helper(&mut item);
let mut item = ExtendedLimits::new(0.0, 0.0);
trait_test_helper(&mut item);
let mut item = FixAxisPar::new(0.0, 0.0, 0);
trait_test_helper(&mut item);
let mut item = FixAxisParDist::new(0.0, 0.0, 0);
trait_test_helper(&mut item);
let mut item = FixAxisParList::new();
trait_test_helper(&mut item);
let mut item = FixNoAxisPtsDim::new(0);
trait_test_helper(&mut item);
let mut item = FncValues::new(0, DataType::AUint64, IndexMode::RowDir, AddrType::Direct);
trait_test_helper(&mut item);
let mut item = Format::new("".to_string());
trait_test_helper(&mut item);
let mut item = Formula::new("".to_string());
trait_test_helper(&mut item);
let mut item = FormulaInv::new("".to_string());
trait_test_helper(&mut item);
let mut item = Frame::new("".to_string(), "".to_string(), 0, 0);
trait_test_helper(&mut item);
let mut item = FrameMeasurement::new();
trait_test_helper(&mut item);
let mut item = Function::new("".to_string(), "".to_string());
trait_test_helper(&mut item);
let mut item = FunctionList::new();
trait_test_helper(&mut item);
let mut item = FunctionVersion::new("".to_string());
trait_test_helper(&mut item);
let mut item = Group::new("".to_string(), "".to_string());
trait_test_helper(&mut item);
let mut item = GuardRails::new();
trait_test_helper(&mut item);
let mut item = Header::new("".to_string());
trait_test_helper(&mut item);
let mut item = Identification::new(0, DataType::Sbyte);
trait_test_helper(&mut item);
let mut item = IfData::new();
trait_test_helper(&mut item);
let mut item = InMeasurement::new();
trait_test_helper(&mut item);
let mut item = InputQuantity::new("".to_string());
trait_test_helper(&mut item);
let mut item = Instance::new("".to_string(), "".to_string(), "".to_string(), 0);
trait_test_helper(&mut item);
let mut item = Layout::new(IndexMode::RowDir);
trait_test_helper(&mut item);
let mut item = LeftShift::new(0);
trait_test_helper(&mut item);
let mut item = Limits::new(0.0, 0.0);
trait_test_helper(&mut item);
let mut item = LocMeasurement::new();
trait_test_helper(&mut item);
let mut item = MapList::new();
trait_test_helper(&mut item);
let mut item = MatrixDim::new();
trait_test_helper(&mut item);
let mut item = MaxGrad::new(0.0);
trait_test_helper(&mut item);
let mut item = MaxRefresh::new(0, 0);
trait_test_helper(&mut item);
let mut item = Measurement::new(
"".to_string(),
"".to_string(),
DataType::Sword,
"".to_string(),
0,
0.0,
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = MemoryLayout::new(ProgType::PrgReserved, 0, 0, [0, 0, 0, 0, 0]);
trait_test_helper(&mut item);
let mut item = MemorySegment::new(
"".to_string(),
"".to_string(),
PrgType::Code,
MemoryType::Flash,
MemoryAttribute::Extern,
0,
0,
[0, 0, 0, 0, 0],
);
trait_test_helper(&mut item);
let mut item = ModCommon::new("".to_string());
trait_test_helper(&mut item);
let mut item = ModPar::new("".to_string());
trait_test_helper(&mut item);
let mut item = ModelLink::new("".to_string());
trait_test_helper(&mut item);
let mut item = Module::new("".to_string(), "".to_string());
trait_test_helper(&mut item);
let mut item = Monotony::new(MonotonyType::MonIncrease);
trait_test_helper(&mut item);
let mut item = NoAxisPtsDim::new(0, DataType::Ubyte);
trait_test_helper(&mut item);
let mut item = NoOfInterfaces::new(0);
trait_test_helper(&mut item);
let mut item = NoRescaleDim::new(0, DataType::Float32Ieee);
trait_test_helper(&mut item);
let mut item = Number::new(0);
trait_test_helper(&mut item);
let mut item = OffsetDim::new(0, DataType::Ulong);
trait_test_helper(&mut item);
let mut item = OutMeasurement::new();
trait_test_helper(&mut item);
let mut item = Overwrite::new("".to_string(), 0);
trait_test_helper(&mut item);
let mut item = PhoneNo::new("".to_string());
trait_test_helper(&mut item);
let mut item = PhysUnit::new("".to_string());
trait_test_helper(&mut item);
let mut item = Project::new("".to_string(), "".to_string());
trait_test_helper(&mut item);
let mut item = ProjectNo::new("".to_string());
trait_test_helper(&mut item);
let mut item = ReadOnly::new();
trait_test_helper(&mut item);
let mut item = ReadWrite::new();
trait_test_helper(&mut item);
let mut item = RecordLayout::new("".to_string());
trait_test_helper(&mut item);
let mut item = RefCharacteristic::new();
trait_test_helper(&mut item);
let mut item = RefGroup::new();
trait_test_helper(&mut item);
let mut item = RefMeasurement::new();
trait_test_helper(&mut item);
let mut item = RefMemorySegment::new("".to_string());
trait_test_helper(&mut item);
let mut item = RefUnit::new("".to_string());
trait_test_helper(&mut item);
let mut item = Reserved::new(0, DataTypeSize::Long);
trait_test_helper(&mut item);
let mut item = RightShift::new(0);
trait_test_helper(&mut item);
let mut item = RipAddrDim::new(0, DataType::Ubyte);
trait_test_helper(&mut item);
let mut item = Root::new();
trait_test_helper(&mut item);
let mut item = SRecLayout::new("".to_string());
trait_test_helper(&mut item);
let mut item = ShiftOpDim::new(0, DataType::Slong);
trait_test_helper(&mut item);
let mut item = SiExponents::new(0, 0, 0, 0, 0, 0, 0);
trait_test_helper(&mut item);
let mut item = SignExtend::new();
trait_test_helper(&mut item);
let mut item = SrcAddrDim::new(0, DataType::Sbyte);
trait_test_helper(&mut item);
let mut item = StaticAddressOffsets::new();
trait_test_helper(&mut item);
let mut item = StaticRecordLayout::new();
trait_test_helper(&mut item);
let mut item = StatusStringRef::new("".to_string());
trait_test_helper(&mut item);
let mut item = StepSize::new(0.0);
trait_test_helper(&mut item);
let mut item = StructureComponent::new("".to_string(), "".to_string(), 0);
trait_test_helper(&mut item);
let mut item = SubFunction::new();
trait_test_helper(&mut item);
let mut item = SubGroup::new();
trait_test_helper(&mut item);
let mut item = Supplier::new("".to_string());
trait_test_helper(&mut item);
let mut item = SymbolLink::new("".to_string(), 0);
trait_test_helper(&mut item);
let mut item = SymbolTypeLink::new("".to_string());
trait_test_helper(&mut item);
let mut item = SystemConstant::new("".to_string(), "".to_string());
trait_test_helper(&mut item);
let mut item = Transformer::new(
"".to_string(),
"".to_string(),
"".to_string(),
"".to_string(),
0,
TransformerTrigger::OnChange,
"".to_string(),
);
trait_test_helper(&mut item);
let mut item = TransformerInObjects::new();
trait_test_helper(&mut item);
let mut item = TransformerOutObjects::new();
trait_test_helper(&mut item);
let mut item = TypedefAxis::new(
"".to_string(),
"".to_string(),
"".to_string(),
"".to_string(),
0.0,
"".to_string(),
0,
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = TypedefBlob::new("".to_string(), "".to_string(), 0);
trait_test_helper(&mut item);
let mut item = TypedefCharacteristic::new(
"".to_string(),
"".to_string(),
CharacteristicType::Value,
"".to_string(),
0.0,
"".to_string(),
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = TypedefMeasurement::new(
"".to_string(),
"".to_string(),
DataType::Ubyte,
"".to_string(),
0,
0.0,
0.0,
0.0,
);
trait_test_helper(&mut item);
let mut item = TypedefStructure::new("".to_string(), "".to_string(), 0);
trait_test_helper(&mut item);
let mut item = Unit::new(
"".to_string(),
"".to_string(),
"".to_string(),
UnitType::Derived,
);
trait_test_helper(&mut item);
let mut item = UnitConversion::new(0.0, 0.0);
trait_test_helper(&mut item);
let mut item = User::new("".to_string());
trait_test_helper(&mut item);
let mut item = UserRights::new("".to_string());
trait_test_helper(&mut item);
let mut item = VarAddress::new();
trait_test_helper(&mut item);
let mut item = VarCharacteristic::new("".to_string());
trait_test_helper(&mut item);
let mut item = VarCriterion::new("".to_string(), "".to_string());
trait_test_helper(&mut item);
let mut item = VarForbiddenComb::new();
trait_test_helper(&mut item);
let mut item = VarMeasurement::new("".to_string());
trait_test_helper(&mut item);
let mut item = VarNaming::new(VarNamingTag::Numeric);
trait_test_helper(&mut item);
let mut item = VarSelectionCharacteristic::new("".to_string());
trait_test_helper(&mut item);
let mut item = VarSeparator::new("".to_string());
trait_test_helper(&mut item);
let mut item = VariantCoding::new();
trait_test_helper(&mut item);
let mut item = Version::new("".to_string());
trait_test_helper(&mut item);
let mut item = Virtual::new();
trait_test_helper(&mut item);
let mut item = VirtualCharacteristic::new("".to_string());
trait_test_helper(&mut item);
}
}