#!/usr/bin/env python
# -*- coding: utf-8 -*-

__copyright__="""
    pySART - Simplified AUTOSAR-Toolkit for Python.

   (C) 2009-2019 by Christoph Schueler <github.com/Christoph2,
                                        cpu12.gems@googlemail.com>

   All Rights Reserved

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License along
  with this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

  """

import datetime
from functools import partial
import mmap
import re
import sqlite3

from sqlalchemy import (MetaData, schema, types, orm, event,
    create_engine, Column, ForeignKey, ForeignKeyConstraint, func,
    PassiveDefault, UniqueConstraint, CheckConstraint
)
from sqlalchemy.ext.declarative import declared_attr, as_declarative
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.orderinglist import ordering_list
from sqlalchemy.orm import relationship, backref
from sqlalchemy.engine import Engine
from sqlalchemy.sql import exists

from pya2l.utils import SingletonBase
from pya2l.model import mixins

DB_EXTENSION    = "a2ldb"

CURRENT_SCHEMA_VERSION = 10

CACHE_SIZE      = 4 # MB
PAGE_SIZE       = mmap.PAGESIZE


class MULTIPLE(SingletonBase): pass
class Uint(SingletonBase): pass
class Int(SingletonBase): pass
class Ulong(SingletonBase): pass
class Long(SingletonBase): pass
class Float(SingletonBase): pass
class String(SingletonBase): pass
class Enum(SingletonBase): pass
class Ident(SingletonBase): pass

class Datatype(SingletonBase):
    enum_values = ('UBYTE', 'SBYTE', 'UWORD', 'SWORD', 'ULONG', 'SLONG',
        'A_UINT64', 'A_INT64', 'FLOAT32_IEEE' ,'FLOAT64_IEEE'
    )

class Datasize(SingletonBase):
    enum_values = ('BYTE', 'WORD', 'LONG')

class Addrtype(SingletonBase):
    enum_values = ('PBYTE', 'PWORD', 'PLONG', 'DIRECT')

class Byteorder(SingletonBase):
    enum_values = ('LITTLE_ENDIAN', 'BIG_ENDIAN', 'MSB_LAST', 'MSB_FIRST')

class Indexorder(SingletonBase):
    enum_values = ('INDEX_INCR', 'INDEX_DECR')

class Parameter(object):
    """
    """
    def __init__(self, name, type_, multiple):
        self._name = name
        self._type = type_
        self._multiple = multiple

    @property
    def name(self):
        return self._name

    @property
    def type(self):
        return self._type

    @property
    def multiple(self):
        return self._multiple

    def __repr__(self):
        return "{}('{}' {} {})".format(self.__class__.__name__, self.name, self.type, "MULTIPLE" if self.multiple else "")

    __str__ = __repr__


class Element(object):
    """
    """
    def __init__(self, name, keyword_name, multiple):
        self._name = name
        self._keyword_name = keyword_name
        self._multiple = multiple

    @property
    def name(self):
        return self._name

    @property
    def keyword_name(self):
        return self._keyword_name

    @property
    def multiple(self):
        return self._multiple

    def __repr__(self):
        return "{}('{}' {} {})".format(self.__class__.__name__, self.name, self.keyword_name, "MULTIPLE" if self.multiple else "")

    __str__ = __repr__


def calculateCacheSize(value):
    return -(value // PAGE_SIZE)

def regexer(expr, value):
    return re.match(expr, value, re.UNICODE) is not None


@event.listens_for(Engine, "connect")
def set_sqlite3_pragmas(dbapi_connection, connection_record):
    dbapi_connection.create_function("REGEXP", 2, regexer)
    cursor = dbapi_connection.cursor()
    #cursor.execute("PRAGMA jornal_mode=WAL")
    cursor.execute("PRAGMA FOREIGN_KEYS=ON")
    cursor.execute("PRAGMA PAGE_SIZE={}".format(PAGE_SIZE))
    cursor.execute("PRAGMA CACHE_SIZE={}".format(calculateCacheSize(CACHE_SIZE * 1024 * 1024)))
    cursor.execute("PRAGMA SYNCHRONOUS=OFF") # FULL
    cursor.execute("PRAGMA LOCKING_MODE=EXCLUSIVE") # NORMAL
    cursor.execute("PRAGMA TEMP_STORE=MEMORY")  # FILE
    cursor.close()

@as_declarative()
class Base(object):

    rid = Column("rid", types.Integer, primary_key = True)

    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()

    def __repr__(self):
        columns = [c.name for c in self.__class__.__table__.c]
        result = []
        for name, value in [(n, getattr(self, n)) for n in columns if not n.startswith("_")]:
            if isinstance(value, str):
                result.append("{} = '{}'".format(name, value))
            else:
                result.append("{} = {}".format(name, value))
        return "{}({})".format(self.__class__.__name__, ", ".join(result))

def StdFloat(default = 0.0):
    return Column(types.Float, default = default, nullable = False)

def StdShort(default = 0, primary_key = False, unique = False):
    return Column(types.Integer, default = default, nullable = False,
        primary_key = primary_key, unique = unique,
        #CheckClause('BETWEEN (-32768, 32767)')
    )

def StdUShort(default = 0, primary_key = False, unique = False):
    return Column(types.Integer, default = default, nullable = False,
        primary_key = primary_key, unique = unique,
        #CheckClause('BETWEEN (0, 65535)')
    )

def StdLong(default = 0, primary_key = False, unique = False):
    return Column(types.Integer, default = default, nullable = False,
        primary_key = primary_key, unique = unique,
        #CheckClause('BETWEEN (-2147483648, 2147483647)')
    )

def StdULong(default = 0, primary_key = False, unique = False):
    return Column(types.Integer, default = default, nullable = False,
        primary_key = primary_key, unique = unique,
        #CheckClause('BETWEEN (0, 4294967295)')
    )

def StdString(default = 0, primary_key = False, unique = False):
    return Column(types.VARCHAR(256), default = default, nullable = False,
        primary_key = primary_key, unique = unique,
    )

def StdIdent(default = 0, primary_key = False, unique = False):
    return Column(types.VARCHAR(1025), default = default, nullable = False,
        primary_key = primary_key, unique = unique,
    )


class DefCharacteristicIdentifiers(Base):

    __tablename__ = "def_characteristic_identifiers"

    dci_rid = Column(types.Integer, ForeignKey("def_characteristic.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class OutMeasurementIdentifiers(Base):

    __tablename__ = "out_measurement_identifiers"

    om_rid = Column(types.Integer, ForeignKey("out_measurement.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class InMeasurementIdentifiers(Base):

    __tablename__ = "in_measurement_identifiers"

    im_rid = Column(types.Integer, ForeignKey("in_measurement.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class LocMeasurementIdentifiers(Base):

    __tablename__ = "loc_measurement_identifiers"

    lm_rid = Column(types.Integer, ForeignKey("loc_measurement.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class RefMeasurementIdentifiers(Base):

    __tablename__ = "ref_measurement_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("ref_measurement.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class FrameMeasurementIdentifiers(Base):

    __tablename__ = "frame_measurement_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("frame_measurement.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class SubGroupIdentifiers(Base):

    __tablename__ = "sub_group_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("sub_group.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class SubFunctionIdentifiers(Base):

    __tablename__ = "sub_function_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("sub_function.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class RefGroupIdentifiers(Base):

    __tablename__ = "ref_group_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("ref_group.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class MapListIdentifiers(Base):

    __tablename__ = "map_list_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("map_list.rid"))
    name = StdIdent()
    position = StdLong()

    def __init__(self, name):
        self.name = name

class VarCharacteristicIdentifiers(Base):

    __tablename__ = "var_characteristic_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("var_characteristic.rid"))
    criterionName = StdIdent()
    position = StdLong()

    def __init__(self, criterionName):
        self.criterionName = criterionName

class VarCriterionIdentifiers(Base):

    __tablename__ = "var_criterion_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("var_criterion.rid"))
    value = StdIdent()
    position = StdLong()

    def __init__(self, value):
        self.value = value

class FunctionListIdentifiers(Base):

    __tablename__ = "function_list_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("function_list.rid"))
    name = StdIdent()
    position = StdLong()

    def __init__(self, name):
        self.name = name

class RefCharacteristicIdentifiers(Base):

    __tablename__ = "ref_characteristic_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("ref_characteristic.rid"))
    identifier = StdIdent()
    position = StdLong()

    def __init__(self, identifier):
        self.identifier = identifier

class DependentCharacteristicIdentifiers(Base):

    __tablename__ = "dependent_characteristic_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("dependent_characteristic.rid"))
    characteristic = StdIdent()
    position = StdLong()

    def __init__(self, characteristic):
        self.characteristic = characteristic

class VirtualCharacteristicIdentifiers(Base):

    __tablename__ = "virtual_characteristic_identifiers"

    rm_rid = Column(types.Integer, ForeignKey("virtual_characteristic.rid"))
    characteristic = StdIdent()
    position = StdLong()

    def __init__(self, characteristic):
        self.characteristic = characteristic


class CompuTabPair(Base):

    __tablename__ = "compu_tab_pair"

    ct_rid = Column(types.Integer, ForeignKey("compu_tab.rid"))
    position = StdLong()

    inVal = StdFloat()
    outVal = StdFloat()

class CompuVtabPair(Base):

    __tablename__ = "compu_vtab_pair"

    ct_rid = Column(types.Integer, ForeignKey("compu_vtab.rid"))
    position = StdLong()

    inVal = StdFloat()
    outVal = StdString()

class CompuVtabRangeTriple(Base):

    __tablename__ = "compu_vtab_range_triple"

    ct_rid = Column(types.Integer, ForeignKey("compu_vtab_range.rid"))
    position = StdLong()

    inValMin = StdFloat()
    inValMax = StdFloat()
    outVal   = StdString()

class CalHandles(Base):

    __tablename__ = "calhandles"

    ch_rid = Column(types.Integer, ForeignKey("calibration_handle.rid"))
    handle = StdLong()
    position = StdLong()

    def __init__(self, handle):
        self.handle = handle

class VirtualMeasuringChannels(Base):

    __tablename__ = "virtual_measuring_channel"

    vmc_rid = Column(types.Integer, ForeignKey("virtual.rid"))
    measuringChannel = StdIdent()
    position = StdLong()

    def __init__(self, measuringChannel):
        self.measuringChannel = measuringChannel

class FixAxisParListValues(Base):

    __tablename__ = "fix_axis_par_list_value"

    faplv_rid = Column(types.Integer, ForeignKey("fix_axis_par_list.rid"))
    axisPts_Value = StdFloat()
    position = StdLong()

    def __init__(self, axisPts_Value):
        self.axisPts_Value = axisPts_Value


class VarAddressValues(Base):

    __tablename__ = "var_address_values"

    va_rid = Column(types.Integer, ForeignKey("var_address.rid"))
    address = StdULong()
    position = StdLong()

    def __init__(self, address):
        self.address = address

class AnnotationTextValues(Base):

    __tablename__ = "annotation_text_values"

    at_rid = Column(types.Integer, ForeignKey("annotation_text.rid"))
    text = StdString()
    position = StdLong()

    def __init__(self, text):
        self.text = text

class FunctionListValues(Base):

    __tablename__ = "function_list_values"

    flv_rid = Column(types.Integer, ForeignKey("function_list.rid"))
    name = StdString()
    position = StdLong()

    def __init__(self, name):
        self.name = name


class VarForbiddedCombPair(Base):

    __tablename__ = "var_forbidden_comb_pair"

    vfc_rid = Column(types.Integer, ForeignKey("var_forbidden_comb.rid"))
    criterionName = StdIdent()
    criterionValue = StdIdent()
    position = StdLong()


class MetaData(Base):

    schema_version = StdShort()
    created = Column(types.DateTime, default = datetime.datetime.now)

class AlignmentByte(Base):
    """
    """
    __tablename__ = "alignment_byte"

    alignmentBorder = StdUShort()

    __required_parameters__ = (
        Parameter("alignmentBorder", Uint, False),
    )

class HasAlignmentBytes(object):

    @declared_attr
    def alignment_byte_id(cls):
        return Column(types.Integer,
            ForeignKey("alignment_byte.rid"),
            nullable = True
        )

    @declared_attr
    def alignment_byte(cls):
        return relationship("AlignmentByte")

class AlignmentFloat32Ieee(Base):
    """
    """
    __tablename__ = "alignment_float32_ieee"

    alignmentBorder = StdUShort()

    __required_parameters__ = (
        Parameter("alignmentBorder", Uint, False),
    )

class HasAlignmentFloat32Ieees(object):

    @declared_attr
    def alignment_float32_ieee_id(cls):
        return Column(types.Integer,
            ForeignKey("alignment_float32_ieee.rid"),
            nullable = True
        )

    @declared_attr
    def alignment_float32_ieee(cls):
        return relationship("AlignmentFloat32Ieee")

class AlignmentFloat64Ieee(Base):
    """
    """
    __tablename__ = "alignment_float64_ieee"

    alignmentBorder = StdUShort()

    __required_parameters__ = (
        Parameter("alignmentBorder", Uint, False),
    )

class HasAlignmentFloat64Ieees(object):

    @declared_attr
    def alignment_float64_ieee_id(cls):
        return Column(types.Integer,
            ForeignKey("alignment_float64_ieee.rid"),
            nullable = True
        )

    @declared_attr
    def alignment_float64_ieee(cls):
        return relationship("AlignmentFloat64Ieee")

class AlignmentInt64(Base):
    """
    """
    __tablename__ = "alignment_int64"

    alignmentBorder = StdUShort()

    __required_parameters__ = (
        Parameter("alignmentBorder", Uint, False),
    )

class HasAlignmentInt64s(object):

    @declared_attr
    def alignment_int64_id(cls):
        return Column(types.Integer,
            ForeignKey("alignment_int64.rid"),
            nullable = True
        )

    @declared_attr
    def alignment_int64(cls):
        return relationship("AlignmentInt64")

class AlignmentLong(Base):
    """
    """
    __tablename__ = "alignment_long"

    alignmentBorder = StdUShort()

    __required_parameters__ = (
        Parameter("alignmentBorder", Uint, False),
    )

class HasAlignmentLongs(object):

    @declared_attr
    def alignment_long_id(cls):
        return Column(types.Integer,
            ForeignKey("alignment_long.rid"),
            nullable = True
        )

    @declared_attr
    def alignment_long(cls):
        return relationship("AlignmentLong")

class AlignmentWord(Base):
    """
    """
    __tablename__ = "alignment_word"

    alignmentBorder = StdUShort()

    __required_parameters__ = (
        Parameter("alignmentBorder", Uint, False),
    )

class HasAlignmentWords(object):

    @declared_attr
    def alignment_word_id(cls):
        return Column(types.Integer,
            ForeignKey("alignment_word.rid"),
            nullable = True
        )

    @declared_attr
    def alignment_word(cls):
        return relationship("AlignmentWord")

class AnnotationAssociation(Base):

    __tablename__ = "annotation_association"

    position = StdLong()

    discriminator = Column(types.String)
    __mapper_args__ = {"polymorphic_on": discriminator}


class Annotation(Base):
    """
    """
    _association_id = Column(types.Integer, ForeignKey("annotation_association.rid"))
    association = relationship("AnnotationAssociation", backref="annotation", uselist = True)
    parent = association_proxy("association", "parent")

    __required_parameters__ = ( )

    __optional_elements__ = (
        Element("AnnotationLabel", "ANNOTATION_LABEL", False),
        Element("AnnotationOrigin", "ANNOTATION_ORIGIN", False),
        Element("AnnotationText", "ANNOTATION_TEXT", False),
    )
    annotation_label = relationship("AnnotationLabel", back_populates = "annotation", uselist = False)
    annotation_origin = relationship("AnnotationOrigin", back_populates = "annotation", uselist = False)
    annotation_text = relationship("AnnotationText", back_populates = "annotation", uselist = False)


class AnnotationLabel(Base):
    """
    """
    __tablename__ = "annotation_label"

    label = StdString()

    __required_parameters__ = (
        Parameter("label", String, False),
    )

    __optional_elements__ = ( )
    _annotation_rid = Column(types.Integer, ForeignKey("annotation.rid"))
    annotation = relationship("Annotation", back_populates = "annotation_label", uselist = False)


class AnnotationOrigin(Base):
    """
    """
    __tablename__ = "annotation_origin"

    origin = StdString()

    __required_parameters__ = (
        Parameter("origin", String, False),
    )

    __optional_elements__ = ( )
    _annotation_rid = Column(types.Integer, ForeignKey("annotation.rid"))
    annotation = relationship("Annotation", back_populates = "annotation_origin", uselist = False)


class AnnotationText(Base):
    """
    """
    __tablename__ = "annotation_text"
    _text = relationship("AnnotationTextValues", backref = "parent", collection_class = ordering_list('position'))
    text = association_proxy("_text", "text")

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _annotation_rid = Column(types.Integer, ForeignKey("annotation.rid"))
    annotation = relationship("Annotation", back_populates = "annotation_text", uselist = False)

class HasAnnotations(object):

    @declared_attr
    def _annotation_association_id(cls):
        return Column(types.Integer, ForeignKey("annotation_association.rid"))

    @declared_attr
    def annotation_association(cls):
        name = cls.__name__
        discriminator = name.lower()

        assoc_cls = type(
            "%sAnnotationAssociation" % name, (AnnotationAssociation,),
            dict(
                __tablename__ = None,
                __mapper_args__ = {"polymorphic_identity": discriminator},
            ),
        )

        cls.annotation = association_proxy(
            "annotation_association",
            "annotation",
            creator = lambda annotation: assoc_cls(annotation = annotation),
        )
        return relationship(
            assoc_cls, backref = backref("parent", uselist = False, collection_class = ordering_list('position'))
        )

class BitMask(Base):
    """
    """
    __tablename__ = "bit_mask"

    mask = StdULong()

    __required_parameters__ = (
        Parameter("mask", Ulong, False),
    )

class HasBitMasks(object):

    @declared_attr
    def bit_mask_id(cls):
        return Column(types.Integer,
            ForeignKey("bit_mask.rid"),
            nullable = True
        )

    @declared_attr
    def bit_mask(cls):
        return relationship("BitMask")

class ByteOrder(Base):
    """
    """
    __tablename__ = "byte_order"

    byteOrder = StdString()

    __required_parameters__ = (
        Parameter("byteOrder", Byteorder, False),
    )

class HasByteOrders(object):

    @declared_attr
    def byte_order_id(cls):
        return Column(types.Integer,
            ForeignKey("byte_order.rid"),
            nullable = True
        )

    @declared_attr
    def byte_order(cls):
        return relationship("ByteOrder")

class CalibrationAccess(Base):
    """
    """
    __tablename__ = "calibration_access"

    type = StdString()

    __required_parameters__ = (
        Parameter("type", Enum, False),
    )

class HasCalibrationAccess(object):

    @declared_attr
    def calibration_access_id(cls):
        return Column(types.Integer,
            ForeignKey("calibration_access.rid"),
            nullable = True
        )

    @declared_attr
    def calibration_access(cls):
        return relationship("CalibrationAccess")

class DefaultValue(Base):
    """
    """
    __tablename__ = "default_value"

    display_string = StdString()

    __required_parameters__ = (
        Parameter("display_string", String, False),
    )

class HasDefaultValues(object):

    @declared_attr
    def default_value_id(cls):
        return Column(types.Integer,
            ForeignKey("default_value.rid"),
            nullable = True
        )

    @declared_attr
    def default_value(cls):
        return relationship("DefaultValue")

class Deposit(Base):
    """
    """
    __tablename__ = "deposit"

    mode = StdString()

    __required_parameters__ = (
        Parameter("mode", Enum, False),
    )

class HasDeposits(object):

    @declared_attr
    def deposit_id(cls):
        return Column(types.Integer,
            ForeignKey("deposit.rid"),
            nullable = True
        )

    @declared_attr
    def deposit(cls):
        return relationship("Deposit")

class Discrete(object):
    pass

class HasDiscretes(object):

    @declared_attr
    def discrete(cls):
        return Column(types.Boolean, default = False)


class DisplayIdentifier(Base):
    """
    """
    __tablename__ = "display_identifier"

    display_name = StdIdent()

    __required_parameters__ = (
        Parameter("display_name", Ident, False),
    )

class HasDisplayIdentifiers(object):

    @declared_attr
    def display_identifier_id(cls):
        return Column(types.Integer,
            ForeignKey("display_identifier.rid"),
            nullable = True
        )

    @declared_attr
    def display_identifier(cls):
        return relationship("DisplayIdentifier")

class EcuAddressExtension(Base):
    """
    """
    __tablename__ = "ecu_address_extension"

    extension = StdShort()

    __required_parameters__ = (
        Parameter("extension", Int, False),
    )

class HasEcuAddressExtensions(object):

    @declared_attr
    def ecu_address_extension_id(cls):
        return Column(types.Integer,
            ForeignKey("ecu_address_extension.rid"),
            nullable = True
        )

    @declared_attr
    def ecu_address_extension(cls):
        return relationship("EcuAddressExtension")

class ExtendedLimits(Base):
    """
    """
    __tablename__ = "extended_limits"

    lowerLimit = StdFloat()
    upperLimit = StdFloat()

    __required_parameters__ = (
        Parameter("lowerLimit", Float, False),
        Parameter("upperLimit", Float, False),
    )

class HasExtendedLimits(object):

    @declared_attr
    def extended_limits_id(cls):
        return Column(types.Integer,
            ForeignKey("extended_limits.rid"),
            nullable = True
        )

    @declared_attr
    def extended_limits(cls):
        return relationship("ExtendedLimits")

class Format(Base):
    """
    """
    __tablename__ = "format"

    formatString = StdString()

    __required_parameters__ = (
        Parameter("formatString", String, False),
    )

class HasFormats(object):

    @declared_attr
    def format_id(cls):
        return Column(types.Integer,
            ForeignKey("format.rid"),
            nullable = True
        )

    @declared_attr
    def format(cls):
        return relationship("Format")

class FunctionList(Base):
    """
    """
    __tablename__ = "function_list"

    _name = relationship("FunctionListValues", backref = "parent", collection_class = ordering_list('position'))
    name = association_proxy("_name", "name")

    __required_parameters__ = ( )

class HasFunctionLists(object):

    @declared_attr
    def function_list_id(cls):
        return Column(types.Integer,
            ForeignKey("function_list.rid"),
            nullable = True
        )

    @declared_attr
    def function_list(cls):
        return relationship("FunctionList")

class GuardRails(object):
    pass

class HasGuardRails(object):

    @declared_attr
    def guard_rails(cls):
        return Column(types.Boolean, default = False)


class IfDataAssociation(Base):

    __tablename__ = "if_data_association"

    position = StdLong()

    discriminator = Column(types.String)
    __mapper_args__ = {"polymorphic_on": discriminator}


class IfData(Base):
    """
    """
    _association_id = Column(types.Integer, ForeignKey("if_data_association.rid"))
    association = relationship("IfDataAssociation", backref="if_data", uselist = True)
    parent = association_proxy("association", "parent")

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

    __optional_elements__ = ( )

class HasIfDatas(object):

    @declared_attr
    def _if_data_association_id(cls):
        return Column(types.Integer, ForeignKey("if_data_association.rid"))

    @declared_attr
    def if_data_association(cls):
        name = cls.__name__
        discriminator = name.lower()

        assoc_cls = type(
            "%sIfDataAssociation" % name, (IfDataAssociation,),
            dict(
                __tablename__ = None,
                __mapper_args__ = {"polymorphic_identity": discriminator},
            ),
        )

        cls.if_data = association_proxy(
            "if_data_association",
            "if_data",
            creator = lambda if_data: assoc_cls(if_data = if_data),
        )
        return relationship(
            assoc_cls, backref = backref("parent", uselist = False, collection_class = ordering_list('position'))
        )

class MatrixDim(Base):
    """
    """
    __tablename__ = "matrix_dim"

    xDim = StdUShort()
    yDim = StdUShort()
    zDim = StdUShort()

    __required_parameters__ = (
        Parameter("xDim", Uint, False),
        Parameter("yDim", Uint, False),
        Parameter("zDim", Uint, False),
    )

class HasMatrixDims(object):

    @declared_attr
    def matrix_dim_id(cls):
        return Column(types.Integer,
            ForeignKey("matrix_dim.rid"),
            nullable = True
        )

    @declared_attr
    def matrix_dim(cls):
        return relationship("MatrixDim")

class MaxRefresh(Base):
    """
    """
    __tablename__ = "max_refresh"

    scalingUnit = StdUShort()
    rate = StdULong()

    __required_parameters__ = (
        Parameter("scalingUnit", Uint, False),
        Parameter("rate", Ulong, False),
    )

class HasMaxRefreshs(object):

    @declared_attr
    def max_refresh_id(cls):
        return Column(types.Integer,
            ForeignKey("max_refresh.rid"),
            nullable = True
        )

    @declared_attr
    def max_refresh(cls):
        return relationship("MaxRefresh")

class Monotony(Base):
    """
    """
    __tablename__ = "monotony"

    monotony = StdString()

    __required_parameters__ = (
        Parameter("monotony", Enum, False),
    )

class HasMonotonys(object):

    @declared_attr
    def monotony_id(cls):
        return Column(types.Integer,
            ForeignKey("monotony.rid"),
            nullable = True
        )

    @declared_attr
    def monotony(cls):
        return relationship("Monotony")

class PhysUnit(Base):
    """
    """
    __tablename__ = "phys_unit"

    unit = StdString()

    __required_parameters__ = (
        Parameter("unit", String, False),
    )

class HasPhysUnits(object):

    @declared_attr
    def phys_unit_id(cls):
        return Column(types.Integer,
            ForeignKey("phys_unit.rid"),
            nullable = True
        )

    @declared_attr
    def phys_unit(cls):
        return relationship("PhysUnit")

class ReadOnly(object):
    pass

class HasReadOnlys(object):

    @declared_attr
    def read_only(cls):
        return Column(types.Boolean, default = False)


class RefCharacteristic(Base):
    """
    """
    __tablename__ = "ref_characteristic"

    _identifier = relationship("RefCharacteristicIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = ( )

class HasRefCharacteristics(object):

    @declared_attr
    def ref_characteristic_id(cls):
        return Column(types.Integer,
            ForeignKey("ref_characteristic.rid"),
            nullable = True
        )

    @declared_attr
    def ref_characteristic(cls):
        return relationship("RefCharacteristic")

class RefMemorySegment(Base):
    """
    """
    __tablename__ = "ref_memory_segment"

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

class HasRefMemorySegments(object):

    @declared_attr
    def ref_memory_segment_id(cls):
        return Column(types.Integer,
            ForeignKey("ref_memory_segment.rid"),
            nullable = True
        )

    @declared_attr
    def ref_memory_segment(cls):
        return relationship("RefMemorySegment")

class RefUnit(Base):
    """
    """
    __tablename__ = "ref_unit"

    unit = StdIdent()

    __required_parameters__ = (
        Parameter("unit", Ident, False),
    )

class HasRefUnits(object):

    @declared_attr
    def ref_unit_id(cls):
        return Column(types.Integer,
            ForeignKey("ref_unit.rid"),
            nullable = True
        )

    @declared_attr
    def ref_unit(cls):
        return relationship("RefUnit")

class StepSize(Base):
    """
    """
    __tablename__ = "step_size"

    stepSize = StdFloat()

    __required_parameters__ = (
        Parameter("stepSize", Float, False),
    )

class HasStepSizes(object):

    @declared_attr
    def step_size_id(cls):
        return Column(types.Integer,
            ForeignKey("step_size.rid"),
            nullable = True
        )

    @declared_attr
    def step_size(cls):
        return relationship("StepSize")

class SymbolLink(Base):
    """
    """
    __tablename__ = "symbol_link"

    symbolName = StdString()
    offset = StdLong()

    __required_parameters__ = (
        Parameter("symbolName", String, False),
        Parameter("offset", Long, False),
    )

class HasSymbolLinks(object):

    @declared_attr
    def symbol_link_id(cls):
        return Column(types.Integer,
            ForeignKey("symbol_link.rid"),
            nullable = True
        )

    @declared_attr
    def symbol_link(cls):
        return relationship("SymbolLink")

class Version(Base):
    """
    """
    __tablename__ = "version"

    versionIdentifier = StdString()

    __required_parameters__ = (
        Parameter("versionIdentifier", String, False),
    )

class HasVersions(object):

    @declared_attr
    def version_id(cls):
        return Column(types.Integer,
            ForeignKey("version.rid"),
            nullable = True
        )

    @declared_attr
    def version(cls):
        return relationship("Version")


class Asap2Version(Base):
    """
    """
    __tablename__ = "asap2_version"

    versionNo = StdUShort()

    upgradeNo = StdUShort()

    __required_parameters__ = (
        Parameter("versionNo", Uint, False),
        Parameter("upgradeNo", Uint, False),
    )

    __optional_elements__ = ( )


class A2mlVersion(Base):
    """
    """
    __tablename__ = "a2ml_version"

    versionNo = StdUShort()

    upgradeNo = StdUShort()

    __required_parameters__ = (
        Parameter("versionNo", Uint, False),
        Parameter("upgradeNo", Uint, False),
    )

    __optional_elements__ = ( )


class Project(Base):
    """
    """
    __tablename__ = "project"

    name = StdIdent()

    longIdentifier = StdString()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
    )

    __optional_elements__ = (
        Element("Header", "HEADER", False),
        Element("Module", "MODULE", True),
    )
    header = relationship("Header", back_populates = "project", uselist = False)
    module = relationship("Module", back_populates = "project", uselist = True)


class Header(Base, HasVersions):
    """
    """
    __tablename__ = "header"

    comment = StdString()

    __required_parameters__ = (
        Parameter("comment", String, False),
    )

    __optional_elements__ = (
        Element("ProjectNo", "PROJECT_NO", False),
        Element("Version", "VERSION", False),
    )
    project_no = relationship("ProjectNo", back_populates = "header", uselist = False)
    _project_rid = Column(types.Integer, ForeignKey("project.rid"))
    project = relationship("Project", back_populates = "header", uselist = False)


class ProjectNo(Base):
    """
    """
    __tablename__ = "project_no"

    projectNumber = StdIdent()

    __required_parameters__ = (
        Parameter("projectNumber", Ident, False),
    )

    __optional_elements__ = ( )
    _header_rid = Column(types.Integer, ForeignKey("header.rid"))
    header = relationship("Header", back_populates = "project_no", uselist = False)


class Module(Base, HasIfDatas):
    """
    """
    __tablename__ = "module"

    name = StdIdent()

    longIdentifier = StdString()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
    )

    __optional_elements__ = (
        Element("A2ml", "A2ML", False),
        Element("AxisPts", "AXIS_PTS", True),
        Element("Characteristic", "CHARACTERISTIC", True),
        Element("CompuMethod", "COMPU_METHOD", True),
        Element("CompuTab", "COMPU_TAB", True),
        Element("CompuVtab", "COMPU_VTAB", True),
        Element("CompuVtabRange", "COMPU_VTAB_RANGE", True),
        Element("Frame", "FRAME", False),
        Element("Function", "FUNCTION", True),
        Element("Group", "GROUP", True),
        Element("IfData", "IF_DATA", True),
        Element("Measurement", "MEASUREMENT", True),
        Element("ModCommon", "MOD_COMMON", False),
        Element("ModPar", "MOD_PAR", False),
        Element("RecordLayout", "RECORD_LAYOUT", True),
        Element("Unit", "UNIT", True),
        Element("UserRights", "USER_RIGHTS", True),
        Element("VariantCoding", "VARIANT_CODING", False),
    )
    a2ml = relationship("A2ml", back_populates = "module", uselist = False)
    axis_pts = relationship("AxisPts", back_populates = "module", uselist = True)
    characteristic = relationship("Characteristic", back_populates = "module", uselist = True)
    compu_method = relationship("CompuMethod", back_populates = "module", uselist = True)
    compu_tab = relationship("CompuTab", back_populates = "module", uselist = True)
    compu_vtab = relationship("CompuVtab", back_populates = "module", uselist = True)
    compu_vtab_range = relationship("CompuVtabRange", back_populates = "module", uselist = True)
    frame = relationship("Frame", back_populates = "module", uselist = False)
    function = relationship("Function", back_populates = "module", uselist = True)
    group = relationship("Group", back_populates = "module", uselist = True)
    measurement = relationship("Measurement", back_populates = "module", uselist = True)
    mod_common = relationship("ModCommon", back_populates = "module", uselist = False)
    mod_par = relationship("ModPar", back_populates = "module", uselist = False)
    record_layout = relationship("RecordLayout", back_populates = "module", uselist = True)
    unit = relationship("Unit", back_populates = "module", uselist = True)
    user_rights = relationship("UserRights", back_populates = "module", uselist = True)
    variant_coding = relationship("VariantCoding", back_populates = "module", uselist = False)
    _project_rid = Column(types.Integer, ForeignKey("project.rid"))
    project = relationship("Project", back_populates = "module", uselist = True)


class A2ml(Base):
    """
    """
    __tablename__ = "a2ml"

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "a2ml", uselist = False)


class AxisPts(Base, HasAnnotations, HasByteOrders, HasCalibrationAccess, HasDeposits, HasDisplayIdentifiers, HasEcuAddressExtensions, HasExtendedLimits, HasFormats, HasFunctionLists, HasGuardRails, HasIfDatas, HasMonotonys, HasPhysUnits, HasReadOnlys, HasRefMemorySegments, HasStepSizes, HasSymbolLinks):
    """
    """
    __tablename__ = "axis_pts"

    name = StdIdent()

    longIdentifier = StdString()

    address = StdULong()

    inputQuantity = StdIdent()

    depositAttr = StdIdent()

    maxDiff = StdFloat()

    conversion = StdIdent()

    maxAxisPoints = StdUShort()

    lowerLimit = StdFloat()

    upperLimit = StdFloat()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("address", Ulong, False),
        Parameter("inputQuantity", Ident, False),
        Parameter("depositAttr", Ident, False),
        Parameter("maxDiff", Float, False),
        Parameter("conversion", Ident, False),
        Parameter("maxAxisPoints", Uint, False),
        Parameter("lowerLimit", Float, False),
        Parameter("upperLimit", Float, False),
    )

    __optional_elements__ = (
        Element("Annotation", "ANNOTATION", True),
        Element("ByteOrder", "BYTE_ORDER", False),
        Element("CalibrationAccess", "CALIBRATION_ACCESS", False),
        Element("Deposit", "DEPOSIT", False),
        Element("DisplayIdentifier", "DISPLAY_IDENTIFIER", False),
        Element("EcuAddressExtension", "ECU_ADDRESS_EXTENSION", False),
        Element("ExtendedLimits", "EXTENDED_LIMITS", False),
        Element("Format", "FORMAT", False),
        Element("FunctionList", "FUNCTION_LIST", False),
        Element("GuardRails", "GUARD_RAILS", False),
        Element("IfData", "IF_DATA", True),
        Element("Monotony", "MONOTONY", False),
        Element("PhysUnit", "PHYS_UNIT", False),
        Element("ReadOnly", "READ_ONLY", False),
        Element("RefMemorySegment", "REF_MEMORY_SEGMENT", False),
        Element("StepSize", "STEP_SIZE", False),
        Element("SymbolLink", "SYMBOL_LINK", False),
    )
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "axis_pts", uselist = True)


class Characteristic(Base, HasAnnotations, HasBitMasks, HasByteOrders, HasCalibrationAccess, HasDiscretes, HasDisplayIdentifiers, HasEcuAddressExtensions, HasExtendedLimits, HasFormats, HasFunctionLists, HasGuardRails, HasIfDatas, HasMatrixDims, HasMaxRefreshs, HasPhysUnits, HasReadOnlys, HasRefMemorySegments, HasStepSizes, HasSymbolLinks):
    """
    """
    __tablename__ = "characteristic"

    name = StdIdent()

    longIdentifier = StdString()

    type = StdString()

    address = StdULong()

    deposit = StdIdent()

    maxDiff = StdFloat()

    conversion = StdIdent()

    lowerLimit = StdFloat()

    upperLimit = StdFloat()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("type", Enum, False),
        Parameter("address", Ulong, False),
        Parameter("deposit", Ident, False),
        Parameter("maxDiff", Float, False),
        Parameter("conversion", Ident, False),
        Parameter("lowerLimit", Float, False),
        Parameter("upperLimit", Float, False),
    )

    __optional_elements__ = (
        Element("Annotation", "ANNOTATION", True),
        Element("AxisDescr", "AXIS_DESCR", True),
        Element("BitMask", "BIT_MASK", False),
        Element("ByteOrder", "BYTE_ORDER", False),
        Element("CalibrationAccess", "CALIBRATION_ACCESS", False),
        Element("ComparisonQuantity", "COMPARISON_QUANTITY", False),
        Element("DependentCharacteristic", "DEPENDENT_CHARACTERISTIC", False),
        Element("Discrete", "DISCRETE", False),
        Element("DisplayIdentifier", "DISPLAY_IDENTIFIER", False),
        Element("EcuAddressExtension", "ECU_ADDRESS_EXTENSION", False),
        Element("ExtendedLimits", "EXTENDED_LIMITS", False),
        Element("Format", "FORMAT", False),
        Element("FunctionList", "FUNCTION_LIST", False),
        Element("GuardRails", "GUARD_RAILS", False),
        Element("IfData", "IF_DATA", True),
        Element("MapList", "MAP_LIST", False),
        Element("MatrixDim", "MATRIX_DIM", False),
        Element("MaxRefresh", "MAX_REFRESH", False),
        Element("Number", "NUMBER", False),
        Element("PhysUnit", "PHYS_UNIT", False),
        Element("ReadOnly", "READ_ONLY", False),
        Element("RefMemorySegment", "REF_MEMORY_SEGMENT", False),
        Element("StepSize", "STEP_SIZE", False),
        Element("SymbolLink", "SYMBOL_LINK", False),
        Element("VirtualCharacteristic", "VIRTUAL_CHARACTERISTIC", False),
    )
    axis_descr = relationship("AxisDescr", back_populates = "characteristic", uselist = True)
    comparison_quantity = relationship("ComparisonQuantity", back_populates = "characteristic", uselist = False)
    dependent_characteristic = relationship("DependentCharacteristic", back_populates = "characteristic", uselist = False)
    map_list = relationship("MapList", back_populates = "characteristic", uselist = False)
    number = relationship("Number", back_populates = "characteristic", uselist = False)
    virtual_characteristic = relationship("VirtualCharacteristic", back_populates = "characteristic", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "characteristic", uselist = True)


class AxisDescr(Base, mixins.AxisDescrMixIn, HasAnnotations, HasByteOrders, HasDeposits, HasExtendedLimits, HasFormats, HasMonotonys, HasPhysUnits, HasReadOnlys, HasStepSizes):
    """
    """
    __tablename__ = "axis_descr"

    attribute = StdString()

    inputQuantity = StdIdent()

    conversion = StdIdent()

    maxAxisPoints = StdUShort()

    lowerLimit = StdFloat()

    upperLimit = StdFloat()

    __required_parameters__ = (
        Parameter("attribute", Enum, False),
        Parameter("inputQuantity", Ident, False),
        Parameter("conversion", Ident, False),
        Parameter("maxAxisPoints", Uint, False),
        Parameter("lowerLimit", Float, False),
        Parameter("upperLimit", Float, False),
    )

    __optional_elements__ = (
        Element("Annotation", "ANNOTATION", True),
        Element("AxisPtsRef", "AXIS_PTS_REF", False),
        Element("ByteOrder", "BYTE_ORDER", False),
        Element("CurveAxisRef", "CURVE_AXIS_REF", False),
        Element("Deposit", "DEPOSIT", False),
        Element("ExtendedLimits", "EXTENDED_LIMITS", False),
        Element("FixAxisPar", "FIX_AXIS_PAR", False),
        Element("FixAxisParDist", "FIX_AXIS_PAR_DIST", False),
        Element("FixAxisParList", "FIX_AXIS_PAR_LIST", False),
        Element("Format", "FORMAT", False),
        Element("MaxGrad", "MAX_GRAD", False),
        Element("Monotony", "MONOTONY", False),
        Element("PhysUnit", "PHYS_UNIT", False),
        Element("ReadOnly", "READ_ONLY", False),
        Element("StepSize", "STEP_SIZE", False),
    )
    axis_pts_ref = relationship("AxisPtsRef", back_populates = "axis_descr", uselist = False)
    curve_axis_ref = relationship("CurveAxisRef", back_populates = "axis_descr", uselist = False)
    fix_axis_par = relationship("FixAxisPar", back_populates = "axis_descr", uselist = False)
    fix_axis_par_dist = relationship("FixAxisParDist", back_populates = "axis_descr", uselist = False)
    fix_axis_par_list = relationship("FixAxisParList", back_populates = "axis_descr", uselist = False)
    max_grad = relationship("MaxGrad", back_populates = "axis_descr", uselist = False)
    _characteristic_rid = Column(types.Integer, ForeignKey("characteristic.rid"))
    characteristic = relationship("Characteristic", back_populates = "axis_descr", uselist = True)


class AxisPtsRef(Base):
    """
    """
    __tablename__ = "axis_pts_ref"

    axisPoints = StdIdent()

    __required_parameters__ = (
        Parameter("axisPoints", Ident, False),
    )

    __optional_elements__ = ( )
    _axis_descr_rid = Column(types.Integer, ForeignKey("axis_descr.rid"))
    axis_descr = relationship("AxisDescr", back_populates = "axis_pts_ref", uselist = False)


class CurveAxisRef(Base):
    """
    """
    __tablename__ = "curve_axis_ref"

    curveAxis = StdIdent()

    __required_parameters__ = (
        Parameter("curveAxis", Ident, False),
    )

    __optional_elements__ = ( )
    _axis_descr_rid = Column(types.Integer, ForeignKey("axis_descr.rid"))
    axis_descr = relationship("AxisDescr", back_populates = "curve_axis_ref", uselist = False)


class FixAxisPar(Base):
    """
    """
    __tablename__ = "fix_axis_par"

    offset = StdShort()

    shift = StdShort()

    numberapo = StdUShort()

    __required_parameters__ = (
        Parameter("offset", Int, False),
        Parameter("shift", Int, False),
        Parameter("numberapo", Uint, False),
    )

    __optional_elements__ = ( )
    _axis_descr_rid = Column(types.Integer, ForeignKey("axis_descr.rid"))
    axis_descr = relationship("AxisDescr", back_populates = "fix_axis_par", uselist = False)


class FixAxisParDist(Base):
    """
    """
    __tablename__ = "fix_axis_par_dist"

    offset = StdShort()

    distance = StdShort()

    numberapo = StdUShort()

    __required_parameters__ = (
        Parameter("offset", Int, False),
        Parameter("distance", Int, False),
        Parameter("numberapo", Uint, False),
    )

    __optional_elements__ = ( )
    _axis_descr_rid = Column(types.Integer, ForeignKey("axis_descr.rid"))
    axis_descr = relationship("AxisDescr", back_populates = "fix_axis_par_dist", uselist = False)


class FixAxisParList(Base):
    """
    """
    __tablename__ = "fix_axis_par_list"
    _axisPts_Value = relationship("FixAxisParListValues", backref = "parent", collection_class = ordering_list('position'))
    axisPts_Value = association_proxy("_axisPts_Value", "axisPts_Value")

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _axis_descr_rid = Column(types.Integer, ForeignKey("axis_descr.rid"))
    axis_descr = relationship("AxisDescr", back_populates = "fix_axis_par_list", uselist = False)


class MaxGrad(Base):
    """
    """
    __tablename__ = "max_grad"

    maxGradient = StdFloat()

    __required_parameters__ = (
        Parameter("maxGradient", Float, False),
    )

    __optional_elements__ = ( )
    _axis_descr_rid = Column(types.Integer, ForeignKey("axis_descr.rid"))
    axis_descr = relationship("AxisDescr", back_populates = "max_grad", uselist = False)


class ComparisonQuantity(Base):
    """
    """
    __tablename__ = "comparison_quantity"

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

    __optional_elements__ = ( )
    _characteristic_rid = Column(types.Integer, ForeignKey("characteristic.rid"))
    characteristic = relationship("Characteristic", back_populates = "comparison_quantity", uselist = False)


class DependentCharacteristic(Base):
    """
    """
    __tablename__ = "dependent_characteristic"

    formula = StdString()

    _characteristic_id = relationship("DependentCharacteristicIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    characteristic_id = association_proxy("_characteristic_id", "characteristic")

    __required_parameters__ = (
        Parameter("formula", String, False),
        Parameter("characteristic", Ident, True),
    )

    __optional_elements__ = ( )
    _characteristic_rid = Column(types.Integer, ForeignKey("characteristic.rid"))
    characteristic = relationship("Characteristic", back_populates = "dependent_characteristic", uselist = False)


class MapList(Base):
    """
    """
    __tablename__ = "map_list"

    _name = relationship("MapListIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    name = association_proxy("_name", "name")

    __required_parameters__ = (
        Parameter("name", Ident, True),
    )

    __optional_elements__ = ( )
    _characteristic_rid = Column(types.Integer, ForeignKey("characteristic.rid"))
    characteristic = relationship("Characteristic", back_populates = "map_list", uselist = False)


class Number(Base):
    """
    """
    __tablename__ = "number"

    number = StdUShort()

    __required_parameters__ = (
        Parameter("number", Uint, False),
    )

    __optional_elements__ = ( )
    _characteristic_rid = Column(types.Integer, ForeignKey("characteristic.rid"))
    characteristic = relationship("Characteristic", back_populates = "number", uselist = False)


class VirtualCharacteristic(Base):
    """
    """
    __tablename__ = "virtual_characteristic"

    formula = StdString()

    _characteristic_id = relationship("VirtualCharacteristicIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    characteristic_id = association_proxy("_characteristic_id", "characteristic")

    __required_parameters__ = (
        Parameter("formula", String, False),
        Parameter("characteristic", Ident, True),
    )

    __optional_elements__ = ( )
    _characteristic_rid = Column(types.Integer, ForeignKey("characteristic.rid"))
    characteristic = relationship("Characteristic", back_populates = "virtual_characteristic", uselist = False)


class CompuMethod(Base, HasRefUnits):
    """
    """
    __tablename__ = "compu_method"

    name = StdIdent()

    longIdentifier = StdString()

    conversionType = StdString()

    format = StdString()

    unit = StdString()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("conversionType", Enum, False),
        Parameter("format", String, False),
        Parameter("unit", String, False),
    )

    __optional_elements__ = (
        Element("Coeffs", "COEFFS", False),
        Element("CoeffsLinear", "COEFFS_LINEAR", False),
        Element("CompuTabRef", "COMPU_TAB_REF", False),
        Element("Formula", "FORMULA", False),
        Element("RefUnit", "REF_UNIT", False),
        Element("StatusStringRef", "STATUS_STRING_REF", False),
    )
    coeffs = relationship("Coeffs", back_populates = "compu_method", uselist = False)
    coeffs_linear = relationship("CoeffsLinear", back_populates = "compu_method", uselist = False)
    compu_tab_ref = relationship("CompuTabRef", back_populates = "compu_method", uselist = False)
    formula = relationship("Formula", back_populates = "compu_method", uselist = False)
    status_string_ref = relationship("StatusStringRef", back_populates = "compu_method", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "compu_method", uselist = True)


class Coeffs(Base):
    """
    """
    __tablename__ = "coeffs"

    a = StdFloat()

    b = StdFloat()

    c = StdFloat()

    d = StdFloat()

    e = StdFloat()

    f = StdFloat()

    __required_parameters__ = (
        Parameter("a", Float, False),
        Parameter("b", Float, False),
        Parameter("c", Float, False),
        Parameter("d", Float, False),
        Parameter("e", Float, False),
        Parameter("f", Float, False),
    )

    __optional_elements__ = ( )
    _compu_method_rid = Column(types.Integer, ForeignKey("compu_method.rid"))
    compu_method = relationship("CompuMethod", back_populates = "coeffs", uselist = False)


class CoeffsLinear(Base):
    """
    """
    __tablename__ = "coeffs_linear"

    a = StdFloat()

    b = StdFloat()

    __required_parameters__ = (
        Parameter("a", Float, False),
        Parameter("b", Float, False),
    )

    __optional_elements__ = ( )
    _compu_method_rid = Column(types.Integer, ForeignKey("compu_method.rid"))
    compu_method = relationship("CompuMethod", back_populates = "coeffs_linear", uselist = False)


class CompuTabRef(Base):
    """
    """
    __tablename__ = "compu_tab_ref"

    conversionTable = StdIdent()

    __required_parameters__ = (
        Parameter("conversionTable", Ident, False),
    )

    __optional_elements__ = ( )
    _compu_method_rid = Column(types.Integer, ForeignKey("compu_method.rid"))
    compu_method = relationship("CompuMethod", back_populates = "compu_tab_ref", uselist = False)


class Formula(Base):
    """
    """
    __tablename__ = "formula"

    f_x = StdString()

    __required_parameters__ = (
        Parameter("f_x", String, False),
    )

    __optional_elements__ = (
        Element("FormulaInv", "FORMULA_INV", False),
    )
    formula_inv = relationship("FormulaInv", back_populates = "formula", uselist = False)
    _compu_method_rid = Column(types.Integer, ForeignKey("compu_method.rid"))
    compu_method = relationship("CompuMethod", back_populates = "formula", uselist = False)


class FormulaInv(Base):
    """
    """
    __tablename__ = "formula_inv"

    g_x = StdString()

    __required_parameters__ = (
        Parameter("g_x", String, False),
    )

    __optional_elements__ = ( )
    _formula_rid = Column(types.Integer, ForeignKey("formula.rid"))
    formula = relationship("Formula", back_populates = "formula_inv", uselist = False)


class StatusStringRef(Base):
    """
    """
    __tablename__ = "status_string_ref"

    conversionTable = StdIdent()

    __required_parameters__ = (
        Parameter("conversionTable", Ident, False),
    )

    __optional_elements__ = ( )
    _compu_method_rid = Column(types.Integer, ForeignKey("compu_method.rid"))
    compu_method = relationship("CompuMethod", back_populates = "status_string_ref", uselist = False)


class CompuTab(Base, HasDefaultValues):
    """
    """
    __tablename__ = "compu_tab"

    name = StdIdent()

    longIdentifier = StdString()

    conversionType = StdString()

    numberValuePairs = StdUShort()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("conversionType", Enum, False),
        Parameter("numberValuePairs", Uint, False),
    )
    pairs = relationship("CompuTabPair", backref = "parent", collection_class = ordering_list('position'))

    __optional_elements__ = (
        Element("DefaultValue", "DEFAULT_VALUE", False),
        Element("DefaultValueNumeric", "DEFAULT_VALUE_NUMERIC", False),
    )
    default_value_numeric = relationship("DefaultValueNumeric", back_populates = "compu_tab", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "compu_tab", uselist = True)


class DefaultValueNumeric(Base):
    """
    """
    __tablename__ = "default_value_numeric"

    display_value = StdFloat()

    __required_parameters__ = (
        Parameter("display_value", Float, False),
    )

    __optional_elements__ = ( )
    _compu_tab_rid = Column(types.Integer, ForeignKey("compu_tab.rid"))
    compu_tab = relationship("CompuTab", back_populates = "default_value_numeric", uselist = False)


class CompuVtab(Base, HasDefaultValues):
    """
    """
    __tablename__ = "compu_vtab"

    name = StdIdent()

    longIdentifier = StdString()

    conversionType = StdString()

    numberValuePairs = StdUShort()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("conversionType", Enum, False),
        Parameter("numberValuePairs", Uint, False),
    )
    pairs = relationship("CompuVtabPair", backref = "parent", collection_class = ordering_list('position'))

    __optional_elements__ = (
        Element("DefaultValue", "DEFAULT_VALUE", False),
    )
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "compu_vtab", uselist = True)


class CompuVtabRange(Base, HasDefaultValues):
    """
    """
    __tablename__ = "compu_vtab_range"

    name = StdIdent()

    longIdentifier = StdString()

    numberValueTriples = StdUShort()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("numberValueTriples", Uint, False),
    )
    triples = relationship("CompuVtabRangeTriple", backref = "parent", collection_class = ordering_list('position'))

    __optional_elements__ = (
        Element("DefaultValue", "DEFAULT_VALUE", False),
    )
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "compu_vtab_range", uselist = True)


class Frame(Base, HasIfDatas):
    """
    """
    __tablename__ = "frame"

    name = StdIdent()

    longIdentifier = StdString()

    scalingUnit = StdUShort()

    rate = StdULong()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("scalingUnit", Uint, False),
        Parameter("rate", Ulong, False),
    )

    __optional_elements__ = (
        Element("FrameMeasurement", "FRAME_MEASUREMENT", False),
        Element("IfData", "IF_DATA", True),
    )
    frame_measurement = relationship("FrameMeasurement", back_populates = "frame", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "frame", uselist = False)


class FrameMeasurement(Base):
    """
    """
    __tablename__ = "frame_measurement"

    _identifier = relationship("FrameMeasurementIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _frame_rid = Column(types.Integer, ForeignKey("frame.rid"))
    frame = relationship("Frame", back_populates = "frame_measurement", uselist = False)


class Function(Base, HasAnnotations, HasIfDatas, HasRefCharacteristics):
    """
    """
    __tablename__ = "function"

    name = StdIdent()

    longIdentifier = StdString()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
    )

    __optional_elements__ = (
        Element("Annotation", "ANNOTATION", True),
        Element("DefCharacteristic", "DEF_CHARACTERISTIC", False),
        Element("FunctionVersion", "FUNCTION_VERSION", False),
        Element("IfData", "IF_DATA", True),
        Element("InMeasurement", "IN_MEASUREMENT", False),
        Element("LocMeasurement", "LOC_MEASUREMENT", False),
        Element("OutMeasurement", "OUT_MEASUREMENT", False),
        Element("RefCharacteristic", "REF_CHARACTERISTIC", False),
        Element("SubFunction", "SUB_FUNCTION", False),
    )
    def_characteristic = relationship("DefCharacteristic", back_populates = "function", uselist = False)
    function_version = relationship("FunctionVersion", back_populates = "function", uselist = False)
    in_measurement = relationship("InMeasurement", back_populates = "function", uselist = False)
    loc_measurement = relationship("LocMeasurement", back_populates = "function", uselist = False)
    out_measurement = relationship("OutMeasurement", back_populates = "function", uselist = False)
    sub_function = relationship("SubFunction", back_populates = "function", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "function", uselist = True)


class DefCharacteristic(Base):
    """
    """
    __tablename__ = "def_characteristic"

    _identifier = relationship("DefCharacteristicIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _function_rid = Column(types.Integer, ForeignKey("function.rid"))
    function = relationship("Function", back_populates = "def_characteristic", uselist = False)


class FunctionVersion(Base):
    """
    """
    __tablename__ = "function_version"

    versionIdentifier = StdString()

    __required_parameters__ = (
        Parameter("versionIdentifier", String, False),
    )

    __optional_elements__ = ( )
    _function_rid = Column(types.Integer, ForeignKey("function.rid"))
    function = relationship("Function", back_populates = "function_version", uselist = False)


class InMeasurement(Base):
    """
    """
    __tablename__ = "in_measurement"

    _identifier = relationship("InMeasurementIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _function_rid = Column(types.Integer, ForeignKey("function.rid"))
    function = relationship("Function", back_populates = "in_measurement", uselist = False)


class LocMeasurement(Base):
    """
    """
    __tablename__ = "loc_measurement"

    _identifier = relationship("LocMeasurementIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _function_rid = Column(types.Integer, ForeignKey("function.rid"))
    function = relationship("Function", back_populates = "loc_measurement", uselist = False)


class OutMeasurement(Base):
    """
    """
    __tablename__ = "out_measurement"

    _identifier = relationship("OutMeasurementIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _function_rid = Column(types.Integer, ForeignKey("function.rid"))
    function = relationship("Function", back_populates = "out_measurement", uselist = False)


class SubFunction(Base):
    """
    """
    __tablename__ = "sub_function"

    _identifier = relationship("SubFunctionIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _function_rid = Column(types.Integer, ForeignKey("function.rid"))
    function = relationship("Function", back_populates = "sub_function", uselist = False)


class Group(Base, HasAnnotations, HasFunctionLists, HasIfDatas, HasRefCharacteristics):
    """
    """
    __tablename__ = "group"

    groupName = StdIdent()

    groupLongIdentifier = StdString()

    __required_parameters__ = (
        Parameter("groupName", Ident, False),
        Parameter("groupLongIdentifier", String, False),
    )

    __optional_elements__ = (
        Element("Annotation", "ANNOTATION", True),
        Element("FunctionList", "FUNCTION_LIST", False),
        Element("IfData", "IF_DATA", True),
        Element("RefCharacteristic", "REF_CHARACTERISTIC", False),
        Element("RefMeasurement", "REF_MEASUREMENT", False),
        Element("Root", "ROOT", False),
        Element("SubGroup", "SUB_GROUP", False),
    )
    ref_measurement = relationship("RefMeasurement", back_populates = "group", uselist = False)
    root = relationship("Root", back_populates = "group", uselist = False)
    sub_group = relationship("SubGroup", back_populates = "group", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "group", uselist = True)


class RefMeasurement(Base):
    """
    """
    __tablename__ = "ref_measurement"

    _identifier = relationship("RefMeasurementIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _group_rid = Column(types.Integer, ForeignKey("group.rid"))
    group = relationship("Group", back_populates = "ref_measurement", uselist = False)


class Root(Base):
    """
    """
    __tablename__ = "root"

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _group_rid = Column(types.Integer, ForeignKey("group.rid"))
    group = relationship("Group", back_populates = "root", uselist = False)


class SubGroup(Base):
    """
    """
    __tablename__ = "sub_group"

    _identifier = relationship("SubGroupIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _group_rid = Column(types.Integer, ForeignKey("group.rid"))
    group = relationship("Group", back_populates = "sub_group", uselist = False)


class Measurement(Base, HasAnnotations, HasBitMasks, HasByteOrders, HasDiscretes, HasDisplayIdentifiers, HasEcuAddressExtensions, HasFormats, HasFunctionLists, HasIfDatas, HasMatrixDims, HasMaxRefreshs, HasPhysUnits, HasRefMemorySegments, HasSymbolLinks):
    """
    """
    __tablename__ = "measurement"

    name = StdIdent()

    longIdentifier = StdString()

    datatype = StdIdent()

    conversion = StdIdent()

    resolution = StdUShort()

    accuracy = StdFloat()

    lowerLimit = StdFloat()

    upperLimit = StdFloat()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("datatype", Datatype, False),
        Parameter("conversion", Ident, False),
        Parameter("resolution", Uint, False),
        Parameter("accuracy", Float, False),
        Parameter("lowerLimit", Float, False),
        Parameter("upperLimit", Float, False),
    )

    __optional_elements__ = (
        Element("Annotation", "ANNOTATION", True),
        Element("ArraySize", "ARRAY_SIZE", False),
        Element("BitMask", "BIT_MASK", False),
        Element("BitOperation", "BIT_OPERATION", False),
        Element("ByteOrder", "BYTE_ORDER", False),
        Element("Discrete", "DISCRETE", False),
        Element("DisplayIdentifier", "DISPLAY_IDENTIFIER", False),
        Element("EcuAddress", "ECU_ADDRESS", False),
        Element("EcuAddressExtension", "ECU_ADDRESS_EXTENSION", False),
        Element("ErrorMask", "ERROR_MASK", False),
        Element("Format", "FORMAT", False),
        Element("FunctionList", "FUNCTION_LIST", False),
        Element("IfData", "IF_DATA", True),
        Element("Layout", "LAYOUT", False),
        Element("MatrixDim", "MATRIX_DIM", False),
        Element("MaxRefresh", "MAX_REFRESH", False),
        Element("PhysUnit", "PHYS_UNIT", False),
        Element("ReadWrite", "READ_WRITE", False),
        Element("RefMemorySegment", "REF_MEMORY_SEGMENT", False),
        Element("SymbolLink", "SYMBOL_LINK", False),
        Element("Virtual", "VIRTUAL", False),
    )
    array_size = relationship("ArraySize", back_populates = "measurement", uselist = False)
    bit_operation = relationship("BitOperation", back_populates = "measurement", uselist = False)
    ecu_address = relationship("EcuAddress", back_populates = "measurement", uselist = False)
    error_mask = relationship("ErrorMask", back_populates = "measurement", uselist = False)
    layout = relationship("Layout", back_populates = "measurement", uselist = False)
    read_write = relationship("ReadWrite", back_populates = "measurement", uselist = False)
    virtual = relationship("Virtual", back_populates = "measurement", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "measurement", uselist = True)


class ArraySize(Base):
    """
    """
    __tablename__ = "array_size"

    number = StdUShort()

    __required_parameters__ = (
        Parameter("number", Uint, False),
    )

    __optional_elements__ = ( )
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "array_size", uselist = False)


class BitOperation(Base):
    """
    """
    __tablename__ = "bit_operation"

    __required_parameters__ = ( )

    __optional_elements__ = (
        Element("LeftShift", "LEFT_SHIFT", False),
        Element("RightShift", "RIGHT_SHIFT", False),
        Element("SignExtend", "SIGN_EXTEND", False),
    )
    left_shift = relationship("LeftShift", back_populates = "bit_operation", uselist = False)
    right_shift = relationship("RightShift", back_populates = "bit_operation", uselist = False)
    sign_extend = relationship("SignExtend", back_populates = "bit_operation", uselist = False)
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "bit_operation", uselist = False)


class LeftShift(Base):
    """
    """
    __tablename__ = "left_shift"

    bitcount = StdULong()

    __required_parameters__ = (
        Parameter("bitcount", Ulong, False),
    )

    __optional_elements__ = ( )
    _bit_operation_rid = Column(types.Integer, ForeignKey("bit_operation.rid"))
    bit_operation = relationship("BitOperation", back_populates = "left_shift", uselist = False)


class RightShift(Base):
    """
    """
    __tablename__ = "right_shift"

    bitcount = StdULong()

    __required_parameters__ = (
        Parameter("bitcount", Ulong, False),
    )

    __optional_elements__ = ( )
    _bit_operation_rid = Column(types.Integer, ForeignKey("bit_operation.rid"))
    bit_operation = relationship("BitOperation", back_populates = "right_shift", uselist = False)


class SignExtend(Base):
    """
    """
    __tablename__ = "sign_extend"

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _bit_operation_rid = Column(types.Integer, ForeignKey("bit_operation.rid"))
    bit_operation = relationship("BitOperation", back_populates = "sign_extend", uselist = False)


class EcuAddress(Base):
    """
    """
    __tablename__ = "ecu_address"

    address = StdULong()

    __required_parameters__ = (
        Parameter("address", Ulong, False),
    )

    __optional_elements__ = ( )
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "ecu_address", uselist = False)


class ErrorMask(Base):
    """
    """
    __tablename__ = "error_mask"

    mask = StdULong()

    __required_parameters__ = (
        Parameter("mask", Ulong, False),
    )

    __optional_elements__ = ( )
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "error_mask", uselist = False)


class Layout(Base):
    """
    """
    __tablename__ = "layout"

    indexMode = StdString()

    __required_parameters__ = (
        Parameter("indexMode", Enum, False),
    )

    __optional_elements__ = ( )
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "layout", uselist = False)


class ReadWrite(Base):
    """
    """
    __tablename__ = "read_write"

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "read_write", uselist = False)


class Virtual(Base):
    """
    """
    __tablename__ = "virtual"
    _measuringChannel = relationship("VirtualMeasuringChannels", backref = "parent", collection_class = ordering_list('position'))
    measuringChannel = association_proxy("_measuringChannel", "measuringChannel")

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _measurement_rid = Column(types.Integer, ForeignKey("measurement.rid"))
    measurement = relationship("Measurement", back_populates = "virtual", uselist = False)


class ModCommon(Base, HasAlignmentBytes, HasAlignmentFloat32Ieees, HasAlignmentFloat64Ieees, HasAlignmentInt64s, HasAlignmentLongs, HasAlignmentWords, HasByteOrders, HasDeposits):
    """
    """
    __tablename__ = "mod_common"

    comment = StdString()

    __required_parameters__ = (
        Parameter("comment", String, False),
    )

    __optional_elements__ = (
        Element("AlignmentByte", "ALIGNMENT_BYTE", False),
        Element("AlignmentFloat32Ieee", "ALIGNMENT_FLOAT32_IEEE", False),
        Element("AlignmentFloat64Ieee", "ALIGNMENT_FLOAT64_IEEE", False),
        Element("AlignmentInt64", "ALIGNMENT_INT64", False),
        Element("AlignmentLong", "ALIGNMENT_LONG", False),
        Element("AlignmentWord", "ALIGNMENT_WORD", False),
        Element("ByteOrder", "BYTE_ORDER", False),
        Element("DataSize", "DATA_SIZE", False),
        Element("Deposit", "DEPOSIT", False),
        Element("SRecLayout", "S_REC_LAYOUT", False),
    )
    data_size = relationship("DataSize", back_populates = "mod_common", uselist = False)
    s_rec_layout = relationship("SRecLayout", back_populates = "mod_common", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "mod_common", uselist = False)


class DataSize(Base):
    """
    """
    __tablename__ = "data_size"

    size = StdUShort()

    __required_parameters__ = (
        Parameter("size", Uint, False),
    )

    __optional_elements__ = ( )
    _mod_common_rid = Column(types.Integer, ForeignKey("mod_common.rid"))
    mod_common = relationship("ModCommon", back_populates = "data_size", uselist = False)


class SRecLayout(Base):
    """
    """
    __tablename__ = "s_rec_layout"

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

    __optional_elements__ = ( )
    _mod_common_rid = Column(types.Integer, ForeignKey("mod_common.rid"))
    mod_common = relationship("ModCommon", back_populates = "s_rec_layout", uselist = False)


class ModPar(Base, HasVersions):
    """
    """
    __tablename__ = "mod_par"

    comment = StdString()

    __required_parameters__ = (
        Parameter("comment", String, False),
    )

    __optional_elements__ = (
        Element("AddrEpk", "ADDR_EPK", True),
        Element("CalibrationMethod", "CALIBRATION_METHOD", True),
        Element("CpuType", "CPU_TYPE", False),
        Element("Customer", "CUSTOMER", False),
        Element("CustomerNo", "CUSTOMER_NO", False),
        Element("Ecu", "ECU", False),
        Element("EcuCalibrationOffset", "ECU_CALIBRATION_OFFSET", False),
        Element("Epk", "EPK", False),
        Element("MemoryLayout", "MEMORY_LAYOUT", True),
        Element("MemorySegment", "MEMORY_SEGMENT", True),
        Element("NoOfInterfaces", "NO_OF_INTERFACES", False),
        Element("PhoneNo", "PHONE_NO", False),
        Element("Supplier", "SUPPLIER", False),
        Element("SystemConstant", "SYSTEM_CONSTANT", True),
        Element("User", "USER", False),
        Element("Version", "VERSION", False),
    )
    addr_epk = relationship("AddrEpk", back_populates = "mod_par", uselist = True)
    calibration_method = relationship("CalibrationMethod", back_populates = "mod_par", uselist = True)
    cpu_type = relationship("CpuType", back_populates = "mod_par", uselist = False)
    customer = relationship("Customer", back_populates = "mod_par", uselist = False)
    customer_no = relationship("CustomerNo", back_populates = "mod_par", uselist = False)
    ecu = relationship("Ecu", back_populates = "mod_par", uselist = False)
    ecu_calibration_offset = relationship("EcuCalibrationOffset", back_populates = "mod_par", uselist = False)
    epk = relationship("Epk", back_populates = "mod_par", uselist = False)
    memory_layout = relationship("MemoryLayout", back_populates = "mod_par", uselist = True)
    memory_segment = relationship("MemorySegment", back_populates = "mod_par", uselist = True)
    no_of_interfaces = relationship("NoOfInterfaces", back_populates = "mod_par", uselist = False)
    phone_no = relationship("PhoneNo", back_populates = "mod_par", uselist = False)
    supplier = relationship("Supplier", back_populates = "mod_par", uselist = False)
    system_constant = relationship("SystemConstant", back_populates = "mod_par", uselist = True)
    user = relationship("User", back_populates = "mod_par", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "mod_par", uselist = False)


class AddrEpk(Base):
    """
    """
    __tablename__ = "addr_epk"

    address = StdULong()

    __required_parameters__ = (
        Parameter("address", Ulong, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "addr_epk", uselist = True)


class CalibrationMethod(Base):
    """
    """
    __tablename__ = "calibration_method"

    method = StdString()

    version = StdULong()

    __required_parameters__ = (
        Parameter("method", String, False),
        Parameter("version", Ulong, False),
    )

    __optional_elements__ = (
        Element("CalibrationHandle", "CALIBRATION_HANDLE", True),
    )
    calibration_handle = relationship("CalibrationHandle", back_populates = "calibration_method", uselist = True)
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "calibration_method", uselist = True)


class CalibrationHandle(Base):
    """
    """
    __tablename__ = "calibration_handle"
    _handle = relationship("CalHandles", backref = "parent")
    handle = association_proxy("_handle", "handle")

    __required_parameters__ = ( )

    __optional_elements__ = (
        Element("CalibrationHandleText", "CALIBRATION_HANDLE_TEXT", False),
    )
    calibration_handle_text = relationship("CalibrationHandleText", back_populates = "calibration_handle", uselist = False)
    _calibration_method_rid = Column(types.Integer, ForeignKey("calibration_method.rid"))
    calibration_method = relationship("CalibrationMethod", back_populates = "calibration_handle", uselist = True)


class CalibrationHandleText(Base):
    """
    """
    __tablename__ = "calibration_handle_text"

    text = StdString()

    __required_parameters__ = (
        Parameter("text", String, False),
    )

    __optional_elements__ = ( )
    _calibration_handle_rid = Column(types.Integer, ForeignKey("calibration_handle.rid"))
    calibration_handle = relationship("CalibrationHandle", back_populates = "calibration_handle_text", uselist = False)


class CpuType(Base):
    """
    """
    __tablename__ = "cpu_type"

    cPU = StdString()

    __required_parameters__ = (
        Parameter("cPU", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "cpu_type", uselist = False)


class Customer(Base):
    """
    """
    __tablename__ = "customer"

    customer = StdString()

    __required_parameters__ = (
        Parameter("customer", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "customer", uselist = False)


class CustomerNo(Base):
    """
    """
    __tablename__ = "customer_no"

    number = StdString()

    __required_parameters__ = (
        Parameter("number", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "customer_no", uselist = False)


class Ecu(Base):
    """
    """
    __tablename__ = "ecu"

    controlUnit = StdString()

    __required_parameters__ = (
        Parameter("controlUnit", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "ecu", uselist = False)


class EcuCalibrationOffset(Base):
    """
    """
    __tablename__ = "ecu_calibration_offset"

    offset = StdLong()

    __required_parameters__ = (
        Parameter("offset", Long, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "ecu_calibration_offset", uselist = False)


class Epk(Base):
    """
    """
    __tablename__ = "epk"

    identifier = StdString()

    __required_parameters__ = (
        Parameter("identifier", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "epk", uselist = False)


class MemoryLayout(Base, HasIfDatas):
    """
    """
    __tablename__ = "memory_layout"

    prgType = StdString()

    address = StdULong()

    size = StdULong()

    offset_0 = StdLong()

    offset_1 = StdLong()

    offset_2 = StdLong()

    offset_3 = StdLong()

    offset_4 = StdLong()

    __required_parameters__ = (
        Parameter("prgType", Enum, False),
        Parameter("address", Ulong, False),
        Parameter("size", Ulong, False),
        Parameter("offset_0", Long, False),
        Parameter("offset_1", Long, False),
        Parameter("offset_2", Long, False),
        Parameter("offset_3", Long, False),
        Parameter("offset_4", Long, False),
    )

    __optional_elements__ = (
        Element("IfData", "IF_DATA", True),
    )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "memory_layout", uselist = True)


class MemorySegment(Base, HasIfDatas):
    """
    """
    __tablename__ = "memory_segment"

    name = StdIdent()

    longIdentifier = StdString()

    prgType = StdString()

    memoryType = StdString()

    attribute = StdString()

    address = StdULong()

    size = StdULong()

    offset_0 = StdLong()

    offset_1 = StdLong()

    offset_2 = StdLong()

    offset_3 = StdLong()

    offset_4 = StdLong()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("prgType", Enum, False),
        Parameter("memoryType", Enum, False),
        Parameter("attribute", Enum, False),
        Parameter("address", Ulong, False),
        Parameter("size", Ulong, False),
        Parameter("offset_0", Long, False),
        Parameter("offset_1", Long, False),
        Parameter("offset_2", Long, False),
        Parameter("offset_3", Long, False),
        Parameter("offset_4", Long, False),
    )

    __optional_elements__ = (
        Element("IfData", "IF_DATA", True),
    )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "memory_segment", uselist = True)


class NoOfInterfaces(Base):
    """
    """
    __tablename__ = "no_of_interfaces"

    num = StdUShort()

    __required_parameters__ = (
        Parameter("num", Uint, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "no_of_interfaces", uselist = False)


class PhoneNo(Base):
    """
    """
    __tablename__ = "phone_no"

    telnum = StdString()

    __required_parameters__ = (
        Parameter("telnum", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "phone_no", uselist = False)


class Supplier(Base):
    """
    """
    __tablename__ = "supplier"

    manufacturer = StdString()

    __required_parameters__ = (
        Parameter("manufacturer", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "supplier", uselist = False)


class SystemConstant(Base):
    """
    """
    __tablename__ = "system_constant"

    name = StdString()

    value = StdString()

    __required_parameters__ = (
        Parameter("name", String, False),
        Parameter("value", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "system_constant", uselist = True)


class User(Base):
    """
    """
    __tablename__ = "user"

    userName = StdString()

    __required_parameters__ = (
        Parameter("userName", String, False),
    )

    __optional_elements__ = ( )
    _mod_par_rid = Column(types.Integer, ForeignKey("mod_par.rid"))
    mod_par = relationship("ModPar", back_populates = "user", uselist = False)


class RecordLayout(Base, HasAlignmentBytes, HasAlignmentFloat32Ieees, HasAlignmentFloat64Ieees, HasAlignmentInt64s, HasAlignmentLongs, HasAlignmentWords):
    """
    """
    __tablename__ = "record_layout"

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

    __optional_elements__ = (
        Element("AlignmentByte", "ALIGNMENT_BYTE", False),
        Element("AlignmentFloat32Ieee", "ALIGNMENT_FLOAT32_IEEE", False),
        Element("AlignmentFloat64Ieee", "ALIGNMENT_FLOAT64_IEEE", False),
        Element("AlignmentInt64", "ALIGNMENT_INT64", False),
        Element("AlignmentLong", "ALIGNMENT_LONG", False),
        Element("AlignmentWord", "ALIGNMENT_WORD", False),
        Element("AxisPtsX", "AXIS_PTS_X", False),
        Element("AxisPtsY", "AXIS_PTS_Y", False),
        Element("AxisPtsZ", "AXIS_PTS_Z", False),
        Element("AxisPts4", "AXIS_PTS_4", False),
        Element("AxisPts5", "AXIS_PTS_5", False),
        Element("AxisRescaleX", "AXIS_RESCALE_X", False),
        Element("AxisRescaleY", "AXIS_RESCALE_Y", False),
        Element("AxisRescaleZ", "AXIS_RESCALE_Z", False),
        Element("AxisRescale4", "AXIS_RESCALE_4", False),
        Element("AxisRescale5", "AXIS_RESCALE_5", False),
        Element("DistOpX", "DIST_OP_X", False),
        Element("DistOpY", "DIST_OP_Y", False),
        Element("DistOpZ", "DIST_OP_Z", False),
        Element("DistOp4", "DIST_OP_4", False),
        Element("DistOp5", "DIST_OP_5", False),
        Element("FixNoAxisPtsX", "FIX_NO_AXIS_PTS_X", False),
        Element("FixNoAxisPtsY", "FIX_NO_AXIS_PTS_Y", False),
        Element("FixNoAxisPtsZ", "FIX_NO_AXIS_PTS_Z", False),
        Element("FixNoAxisPts4", "FIX_NO_AXIS_PTS_4", False),
        Element("FixNoAxisPts5", "FIX_NO_AXIS_PTS_5", False),
        Element("FncValues", "FNC_VALUES", False),
        Element("Identification", "IDENTIFICATION", False),
        Element("NoAxisPtsX", "NO_AXIS_PTS_X", False),
        Element("NoAxisPtsY", "NO_AXIS_PTS_Y", False),
        Element("NoAxisPtsZ", "NO_AXIS_PTS_Z", False),
        Element("NoAxisPts4", "NO_AXIS_PTS_4", False),
        Element("NoAxisPts5", "NO_AXIS_PTS_5", False),
        Element("StaticRecordLayout", "STATIC_RECORD_LAYOUT", False),
        Element("NoRescaleX", "NO_RESCALE_X", False),
        Element("NoRescaleY", "NO_RESCALE_Y", False),
        Element("NoRescaleZ", "NO_RESCALE_Z", False),
        Element("NoRescale4", "NO_RESCALE_4", False),
        Element("NoRescale5", "NO_RESCALE_5", False),
        Element("OffsetX", "OFFSET_X", False),
        Element("OffsetY", "OFFSET_Y", False),
        Element("OffsetZ", "OFFSET_Z", False),
        Element("Offset4", "OFFSET_4", False),
        Element("Offset5", "OFFSET_5", False),
        Element("Reserved", "RESERVED", True),
        Element("RipAddrW", "RIP_ADDR_W", False),
        Element("RipAddrX", "RIP_ADDR_X", False),
        Element("RipAddrY", "RIP_ADDR_Y", False),
        Element("RipAddrZ", "RIP_ADDR_Z", False),
        Element("RipAddr4", "RIP_ADDR_4", False),
        Element("RipAddr5", "RIP_ADDR_5", False),
        Element("ShiftOpX", "SHIFT_OP_X", False),
        Element("ShiftOpY", "SHIFT_OP_Y", False),
        Element("ShiftOpZ", "SHIFT_OP_Z", False),
        Element("ShiftOp4", "SHIFT_OP_4", False),
        Element("ShiftOp5", "SHIFT_OP_5", False),
        Element("SrcAddrX", "SRC_ADDR_X", False),
        Element("SrcAddrY", "SRC_ADDR_Y", False),
        Element("SrcAddrZ", "SRC_ADDR_Z", False),
        Element("SrcAddr4", "SRC_ADDR_4", False),
        Element("SrcAddr5", "SRC_ADDR_5", False),
    )
    axis_pts_x = relationship("AxisPtsX", back_populates = "record_layout", uselist = False)
    axis_pts_y = relationship("AxisPtsY", back_populates = "record_layout", uselist = False)
    axis_pts_z = relationship("AxisPtsZ", back_populates = "record_layout", uselist = False)
    axis_pts_4 = relationship("AxisPts4", back_populates = "record_layout", uselist = False)
    axis_pts_5 = relationship("AxisPts5", back_populates = "record_layout", uselist = False)
    axis_rescale_x = relationship("AxisRescaleX", back_populates = "record_layout", uselist = False)
    axis_rescale_y = relationship("AxisRescaleY", back_populates = "record_layout", uselist = False)
    axis_rescale_z = relationship("AxisRescaleZ", back_populates = "record_layout", uselist = False)
    axis_rescale_4 = relationship("AxisRescale4", back_populates = "record_layout", uselist = False)
    axis_rescale_5 = relationship("AxisRescale5", back_populates = "record_layout", uselist = False)
    dist_op_x = relationship("DistOpX", back_populates = "record_layout", uselist = False)
    dist_op_y = relationship("DistOpY", back_populates = "record_layout", uselist = False)
    dist_op_z = relationship("DistOpZ", back_populates = "record_layout", uselist = False)
    dist_op_4 = relationship("DistOp4", back_populates = "record_layout", uselist = False)
    dist_op_5 = relationship("DistOp5", back_populates = "record_layout", uselist = False)
    fix_no_axis_pts_x = relationship("FixNoAxisPtsX", back_populates = "record_layout", uselist = False)
    fix_no_axis_pts_y = relationship("FixNoAxisPtsY", back_populates = "record_layout", uselist = False)
    fix_no_axis_pts_z = relationship("FixNoAxisPtsZ", back_populates = "record_layout", uselist = False)
    fix_no_axis_pts_4 = relationship("FixNoAxisPts4", back_populates = "record_layout", uselist = False)
    fix_no_axis_pts_5 = relationship("FixNoAxisPts5", back_populates = "record_layout", uselist = False)
    fnc_values = relationship("FncValues", back_populates = "record_layout", uselist = False)
    identification = relationship("Identification", back_populates = "record_layout", uselist = False)
    no_axis_pts_x = relationship("NoAxisPtsX", back_populates = "record_layout", uselist = False)
    no_axis_pts_y = relationship("NoAxisPtsY", back_populates = "record_layout", uselist = False)
    no_axis_pts_z = relationship("NoAxisPtsZ", back_populates = "record_layout", uselist = False)
    no_axis_pts_4 = relationship("NoAxisPts4", back_populates = "record_layout", uselist = False)
    no_axis_pts_5 = relationship("NoAxisPts5", back_populates = "record_layout", uselist = False)
    static_record_layout = relationship("StaticRecordLayout", back_populates = "record_layout", uselist = False)
    no_rescale_x = relationship("NoRescaleX", back_populates = "record_layout", uselist = False)
    no_rescale_y = relationship("NoRescaleY", back_populates = "record_layout", uselist = False)
    no_rescale_z = relationship("NoRescaleZ", back_populates = "record_layout", uselist = False)
    no_rescale_4 = relationship("NoRescale4", back_populates = "record_layout", uselist = False)
    no_rescale_5 = relationship("NoRescale5", back_populates = "record_layout", uselist = False)
    offset_x = relationship("OffsetX", back_populates = "record_layout", uselist = False)
    offset_y = relationship("OffsetY", back_populates = "record_layout", uselist = False)
    offset_z = relationship("OffsetZ", back_populates = "record_layout", uselist = False)
    offset_4 = relationship("Offset4", back_populates = "record_layout", uselist = False)
    offset_5 = relationship("Offset5", back_populates = "record_layout", uselist = False)
    reserved = relationship("Reserved", back_populates = "record_layout", uselist = True)
    rip_addr_w = relationship("RipAddrW", back_populates = "record_layout", uselist = False)
    rip_addr_x = relationship("RipAddrX", back_populates = "record_layout", uselist = False)
    rip_addr_y = relationship("RipAddrY", back_populates = "record_layout", uselist = False)
    rip_addr_z = relationship("RipAddrZ", back_populates = "record_layout", uselist = False)
    rip_addr_4 = relationship("RipAddr4", back_populates = "record_layout", uselist = False)
    rip_addr_5 = relationship("RipAddr5", back_populates = "record_layout", uselist = False)
    shift_op_x = relationship("ShiftOpX", back_populates = "record_layout", uselist = False)
    shift_op_y = relationship("ShiftOpY", back_populates = "record_layout", uselist = False)
    shift_op_z = relationship("ShiftOpZ", back_populates = "record_layout", uselist = False)
    shift_op_4 = relationship("ShiftOp4", back_populates = "record_layout", uselist = False)
    shift_op_5 = relationship("ShiftOp5", back_populates = "record_layout", uselist = False)
    src_addr_x = relationship("SrcAddrX", back_populates = "record_layout", uselist = False)
    src_addr_y = relationship("SrcAddrY", back_populates = "record_layout", uselist = False)
    src_addr_z = relationship("SrcAddrZ", back_populates = "record_layout", uselist = False)
    src_addr_4 = relationship("SrcAddr4", back_populates = "record_layout", uselist = False)
    src_addr_5 = relationship("SrcAddr5", back_populates = "record_layout", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "record_layout", uselist = True)


class AxisPtsX(Base):
    """
    """
    __tablename__ = "axis_pts_x"

    position = StdUShort()

    datatype = StdIdent()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_pts_x", uselist = False)


class AxisPtsY(Base):
    """
    """
    __tablename__ = "axis_pts_y"

    position = StdUShort()

    datatype = StdIdent()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_pts_y", uselist = False)


class AxisPtsZ(Base):
    """
    """
    __tablename__ = "axis_pts_z"

    position = StdUShort()

    datatype = StdIdent()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_pts_z", uselist = False)


class AxisPts4(Base):
    """
    """
    __tablename__ = "axis_pts_4"

    position = StdUShort()

    datatype = StdIdent()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_pts_4", uselist = False)


class AxisPts5(Base):
    """
    """
    __tablename__ = "axis_pts_5"

    position = StdUShort()

    datatype = StdIdent()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_pts_5", uselist = False)


class AxisRescaleX(Base):
    """
    """
    __tablename__ = "axis_rescale_x"

    position = StdUShort()

    datatype = StdIdent()

    maxNumberOfRescalePairs = StdUShort()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("maxNumberOfRescalePairs", Uint, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_rescale_x", uselist = False)


class AxisRescaleY(Base):
    """
    """
    __tablename__ = "axis_rescale_y"

    position = StdUShort()

    datatype = StdIdent()

    maxNumberOfRescalePairs = StdUShort()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("maxNumberOfRescalePairs", Uint, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_rescale_y", uselist = False)


class AxisRescaleZ(Base):
    """
    """
    __tablename__ = "axis_rescale_z"

    position = StdUShort()

    datatype = StdIdent()

    maxNumberOfRescalePairs = StdUShort()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("maxNumberOfRescalePairs", Uint, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_rescale_z", uselist = False)


class AxisRescale4(Base):
    """
    """
    __tablename__ = "axis_rescale_4"

    position = StdUShort()

    datatype = StdIdent()

    maxNumberOfRescalePairs = StdUShort()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("maxNumberOfRescalePairs", Uint, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_rescale_4", uselist = False)


class AxisRescale5(Base):
    """
    """
    __tablename__ = "axis_rescale_5"

    position = StdUShort()

    datatype = StdIdent()

    maxNumberOfRescalePairs = StdUShort()

    indexIncr = StdIdent()

    addressing = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("maxNumberOfRescalePairs", Uint, False),
        Parameter("indexIncr", Indexorder, False),
        Parameter("addressing", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "axis_rescale_5", uselist = False)


class DistOpX(Base):
    """
    """
    __tablename__ = "dist_op_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "dist_op_x", uselist = False)


class DistOpY(Base):
    """
    """
    __tablename__ = "dist_op_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "dist_op_y", uselist = False)


class DistOpZ(Base):
    """
    """
    __tablename__ = "dist_op_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "dist_op_z", uselist = False)


class DistOp4(Base):
    """
    """
    __tablename__ = "dist_op_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "dist_op_4", uselist = False)


class DistOp5(Base):
    """
    """
    __tablename__ = "dist_op_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "dist_op_5", uselist = False)


class FixNoAxisPtsX(Base):
    """
    """
    __tablename__ = "fix_no_axis_pts_x"

    numberOfAxisPoints = StdUShort()

    __required_parameters__ = (
        Parameter("numberOfAxisPoints", Uint, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "fix_no_axis_pts_x", uselist = False)


class FixNoAxisPtsY(Base):
    """
    """
    __tablename__ = "fix_no_axis_pts_y"

    numberOfAxisPoints = StdUShort()

    __required_parameters__ = (
        Parameter("numberOfAxisPoints", Uint, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "fix_no_axis_pts_y", uselist = False)


class FixNoAxisPtsZ(Base):
    """
    """
    __tablename__ = "fix_no_axis_pts_z"

    numberOfAxisPoints = StdUShort()

    __required_parameters__ = (
        Parameter("numberOfAxisPoints", Uint, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "fix_no_axis_pts_z", uselist = False)


class FixNoAxisPts4(Base):
    """
    """
    __tablename__ = "fix_no_axis_pts_4"

    numberOfAxisPoints = StdUShort()

    __required_parameters__ = (
        Parameter("numberOfAxisPoints", Uint, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "fix_no_axis_pts_4", uselist = False)


class FixNoAxisPts5(Base):
    """
    """
    __tablename__ = "fix_no_axis_pts_5"

    numberOfAxisPoints = StdUShort()

    __required_parameters__ = (
        Parameter("numberOfAxisPoints", Uint, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "fix_no_axis_pts_5", uselist = False)


class FncValues(Base):
    """
    """
    __tablename__ = "fnc_values"

    position = StdUShort()

    datatype = StdIdent()

    indexMode = StdString()

    addresstype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
        Parameter("indexMode", Enum, False),
        Parameter("addresstype", Addrtype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "fnc_values", uselist = False)


class Identification(Base):
    """
    """
    __tablename__ = "identification"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "identification", uselist = False)


class NoAxisPtsX(Base):
    """
    """
    __tablename__ = "no_axis_pts_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_axis_pts_x", uselist = False)


class NoAxisPtsY(Base):
    """
    """
    __tablename__ = "no_axis_pts_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_axis_pts_y", uselist = False)


class NoAxisPtsZ(Base):
    """
    """
    __tablename__ = "no_axis_pts_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_axis_pts_z", uselist = False)


class NoAxisPts4(Base):
    """
    """
    __tablename__ = "no_axis_pts_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_axis_pts_4", uselist = False)


class NoAxisPts5(Base):
    """
    """
    __tablename__ = "no_axis_pts_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_axis_pts_5", uselist = False)


class StaticRecordLayout(Base):
    """
    """
    __tablename__ = "static_record_layout"

    __required_parameters__ = ( )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "static_record_layout", uselist = False)


class NoRescaleX(Base):
    """
    """
    __tablename__ = "no_rescale_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_rescale_x", uselist = False)


class NoRescaleY(Base):
    """
    """
    __tablename__ = "no_rescale_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_rescale_y", uselist = False)


class NoRescaleZ(Base):
    """
    """
    __tablename__ = "no_rescale_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_rescale_z", uselist = False)


class NoRescale4(Base):
    """
    """
    __tablename__ = "no_rescale_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_rescale_4", uselist = False)


class NoRescale5(Base):
    """
    """
    __tablename__ = "no_rescale_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "no_rescale_5", uselist = False)


class OffsetX(Base):
    """
    """
    __tablename__ = "offset_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "offset_x", uselist = False)


class OffsetY(Base):
    """
    """
    __tablename__ = "offset_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "offset_y", uselist = False)


class OffsetZ(Base):
    """
    """
    __tablename__ = "offset_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "offset_z", uselist = False)


class Offset4(Base):
    """
    """
    __tablename__ = "offset_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "offset_4", uselist = False)


class Offset5(Base):
    """
    """
    __tablename__ = "offset_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "offset_5", uselist = False)


class Reserved(Base):
    """
    """
    __tablename__ = "reserved"

    position = StdUShort()

    dataSize = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("dataSize", Datasize, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "reserved", uselist = True)


class RipAddrW(Base):
    """
    """
    __tablename__ = "rip_addr_w"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "rip_addr_w", uselist = False)


class RipAddrX(Base):
    """
    """
    __tablename__ = "rip_addr_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "rip_addr_x", uselist = False)


class RipAddrY(Base):
    """
    """
    __tablename__ = "rip_addr_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "rip_addr_y", uselist = False)


class RipAddrZ(Base):
    """
    """
    __tablename__ = "rip_addr_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "rip_addr_z", uselist = False)


class RipAddr4(Base):
    """
    """
    __tablename__ = "rip_addr_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "rip_addr_4", uselist = False)


class RipAddr5(Base):
    """
    """
    __tablename__ = "rip_addr_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "rip_addr_5", uselist = False)


class ShiftOpX(Base):
    """
    """
    __tablename__ = "shift_op_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "shift_op_x", uselist = False)


class ShiftOpY(Base):
    """
    """
    __tablename__ = "shift_op_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "shift_op_y", uselist = False)


class ShiftOpZ(Base):
    """
    """
    __tablename__ = "shift_op_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "shift_op_z", uselist = False)


class ShiftOp4(Base):
    """
    """
    __tablename__ = "shift_op_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "shift_op_4", uselist = False)


class ShiftOp5(Base):
    """
    """
    __tablename__ = "shift_op_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "shift_op_5", uselist = False)


class SrcAddrX(Base):
    """
    """
    __tablename__ = "src_addr_x"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "src_addr_x", uselist = False)


class SrcAddrY(Base):
    """
    """
    __tablename__ = "src_addr_y"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "src_addr_y", uselist = False)


class SrcAddrZ(Base):
    """
    """
    __tablename__ = "src_addr_z"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "src_addr_z", uselist = False)


class SrcAddr4(Base):
    """
    """
    __tablename__ = "src_addr_4"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "src_addr_4", uselist = False)


class SrcAddr5(Base):
    """
    """
    __tablename__ = "src_addr_5"

    position = StdUShort()

    datatype = StdIdent()

    __required_parameters__ = (
        Parameter("position", Uint, False),
        Parameter("datatype", Datatype, False),
    )

    __optional_elements__ = ( )
    _record_layout_rid = Column(types.Integer, ForeignKey("record_layout.rid"))
    record_layout = relationship("RecordLayout", back_populates = "src_addr_5", uselist = False)


class Unit(Base, HasRefUnits):
    """
    """
    __tablename__ = "unit"

    name = StdIdent()

    longIdentifier = StdString()

    display = StdString()

    type = StdString()

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("display", String, False),
        Parameter("type", Enum, False),
    )

    __optional_elements__ = (
        Element("SiExponents", "SI_EXPONENTS", False),
        Element("RefUnit", "REF_UNIT", False),
        Element("UnitConversion", "UNIT_CONVERSION", False),
    )
    si_exponents = relationship("SiExponents", back_populates = "unit", uselist = False)
    unit_conversion = relationship("UnitConversion", back_populates = "unit", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "unit", uselist = True)


class SiExponents(Base):
    """
    """
    __tablename__ = "si_exponents"

    length = StdShort()

    mass = StdShort()

    time = StdShort()

    electricCurrent = StdShort()

    temperature = StdShort()

    amountOfSubstance = StdShort()

    luminousIntensity = StdShort()

    __required_parameters__ = (
        Parameter("length", Int, False),
        Parameter("mass", Int, False),
        Parameter("time", Int, False),
        Parameter("electricCurrent", Int, False),
        Parameter("temperature", Int, False),
        Parameter("amountOfSubstance", Int, False),
        Parameter("luminousIntensity", Int, False),
    )

    __optional_elements__ = ( )
    _unit_rid = Column(types.Integer, ForeignKey("unit.rid"))
    unit = relationship("Unit", back_populates = "si_exponents", uselist = False)


class UnitConversion(Base):
    """
    """
    __tablename__ = "unit_conversion"

    gradient = StdFloat()

    offset = StdFloat()

    __required_parameters__ = (
        Parameter("gradient", Float, False),
        Parameter("offset", Float, False),
    )

    __optional_elements__ = ( )
    _unit_rid = Column(types.Integer, ForeignKey("unit.rid"))
    unit = relationship("Unit", back_populates = "unit_conversion", uselist = False)


class UserRights(Base, HasReadOnlys):
    """
    """
    __tablename__ = "user_rights"

    userLevelId = StdIdent()

    __required_parameters__ = (
        Parameter("userLevelId", Ident, False),
    )

    __optional_elements__ = (
        Element("ReadOnly", "READ_ONLY", False),
        Element("RefGroup", "REF_GROUP", True),
    )
    ref_group = relationship("RefGroup", back_populates = "user_rights", uselist = True)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "user_rights", uselist = True)


class RefGroup(Base):
    """
    """
    __tablename__ = "ref_group"

    _identifier = relationship("RefGroupIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    identifier = association_proxy("_identifier", "identifier")

    __required_parameters__ = (
        Parameter("identifier", Ident, True),
    )

    __optional_elements__ = ( )
    _user_rights_rid = Column(types.Integer, ForeignKey("user_rights.rid"))
    user_rights = relationship("UserRights", back_populates = "ref_group", uselist = True)


class VariantCoding(Base):
    """
    """
    __tablename__ = "variant_coding"

    __required_parameters__ = ( )

    __optional_elements__ = (
        Element("VarCharacteristic", "VAR_CHARACTERISTIC", True),
        Element("VarCriterion", "VAR_CRITERION", True),
        Element("VarForbiddenComb", "VAR_FORBIDDEN_COMB", True),
        Element("VarNaming", "VAR_NAMING", False),
        Element("VarSeparator", "VAR_SEPARATOR", False),
    )
    var_characteristic = relationship("VarCharacteristic", back_populates = "variant_coding", uselist = True)
    var_criterion = relationship("VarCriterion", back_populates = "variant_coding", uselist = True)
    var_forbidden_comb = relationship("VarForbiddenComb", back_populates = "variant_coding", uselist = True)
    var_naming = relationship("VarNaming", back_populates = "variant_coding", uselist = False)
    var_separator = relationship("VarSeparator", back_populates = "variant_coding", uselist = False)
    _module_rid = Column(types.Integer, ForeignKey("module.rid"))
    module = relationship("Module", back_populates = "variant_coding", uselist = False)


class VarCharacteristic(Base):
    """
    """
    __tablename__ = "var_characteristic"

    name = StdIdent()

    _criterionName = relationship("VarCharacteristicIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    criterionName = association_proxy("_criterionName", "criterionName")

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("criterionName", Ident, True),
    )

    __optional_elements__ = (
        Element("VarAddress", "VAR_ADDRESS", False),
    )
    var_address = relationship("VarAddress", back_populates = "var_characteristic", uselist = False)
    _variant_coding_rid = Column(types.Integer, ForeignKey("variant_coding.rid"))
    variant_coding = relationship("VariantCoding", back_populates = "var_characteristic", uselist = True)


class VarAddress(Base):
    """
    """
    __tablename__ = "var_address"

    _address = relationship("VarAddressValues", backref = "parent", collection_class = ordering_list('position'))
    address = association_proxy("_address", "address")

    __required_parameters__ = (
        Parameter("address", Ulong, True),
    )

    __optional_elements__ = ( )
    _var_characteristic_rid = Column(types.Integer, ForeignKey("var_characteristic.rid"))
    var_characteristic = relationship("VarCharacteristic", back_populates = "var_address", uselist = False)


class VarCriterion(Base):
    """
    """
    __tablename__ = "var_criterion"

    name = StdIdent()

    longIdentifier = StdString()

    _value = relationship("VarCriterionIdentifiers", backref = "parent", collection_class = ordering_list('position'))
    value = association_proxy("_value", "value")

    __required_parameters__ = (
        Parameter("name", Ident, False),
        Parameter("longIdentifier", String, False),
        Parameter("value", Ident, True),
    )

    __optional_elements__ = (
        Element("VarMeasurement", "VAR_MEASUREMENT", False),
        Element("VarSelectionCharacteristic", "VAR_SELECTION_CHARACTERISTIC", False),
    )
    var_measurement = relationship("VarMeasurement", back_populates = "var_criterion", uselist = False)
    var_selection_characteristic = relationship("VarSelectionCharacteristic", back_populates = "var_criterion", uselist = False)
    _variant_coding_rid = Column(types.Integer, ForeignKey("variant_coding.rid"))
    variant_coding = relationship("VariantCoding", back_populates = "var_criterion", uselist = True)


class VarMeasurement(Base):
    """
    """
    __tablename__ = "var_measurement"

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

    __optional_elements__ = ( )
    _var_criterion_rid = Column(types.Integer, ForeignKey("var_criterion.rid"))
    var_criterion = relationship("VarCriterion", back_populates = "var_measurement", uselist = False)


class VarSelectionCharacteristic(Base):
    """
    """
    __tablename__ = "var_selection_characteristic"

    name = StdIdent()

    __required_parameters__ = (
        Parameter("name", Ident, False),
    )

    __optional_elements__ = ( )
    _var_criterion_rid = Column(types.Integer, ForeignKey("var_criterion.rid"))
    var_criterion = relationship("VarCriterion", back_populates = "var_selection_characteristic", uselist = False)


class VarForbiddenComb(Base):
    """
    """
    __tablename__ = "var_forbidden_comb"

    __required_parameters__ = ( )
    pairs = relationship("VarForbiddedCombPair", backref = "parent", collection_class = ordering_list('position'))

    __optional_elements__ = ( )
    _variant_coding_rid = Column(types.Integer, ForeignKey("variant_coding.rid"))
    variant_coding = relationship("VariantCoding", back_populates = "var_forbidden_comb", uselist = True)


class VarNaming(Base):
    """
    """
    __tablename__ = "var_naming"

    tag = StdString()

    __required_parameters__ = (
        Parameter("tag", Enum, False),
    )

    __optional_elements__ = ( )
    _variant_coding_rid = Column(types.Integer, ForeignKey("variant_coding.rid"))
    variant_coding = relationship("VariantCoding", back_populates = "var_naming", uselist = False)


class VarSeparator(Base):
    """
    """
    __tablename__ = "var_separator"

    separator = StdString()

    __required_parameters__ = (
        Parameter("separator", String, False),
    )

    __optional_elements__ = ( )
    _variant_coding_rid = Column(types.Integer, ForeignKey("variant_coding.rid"))
    variant_coding = relationship("VariantCoding", back_populates = "var_separator", uselist = False)

class A2LDatabase(object):

    def __init__(self, filename, debug = False, logLevel = 'INFO'):
        if filename == ':memory:':
            self.dbname = ""
        else:
            if not filename.lower().endswith(DB_EXTENSION):
               self.dbname = "{}.{}".format(filename, DB_EXTENSION)
            else:
               self.dbname = filename
        self._engine = create_engine("sqlite:///{}".format(self.dbname), echo = debug,
            connect_args={'detect_types': sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES},
        native_datetime = True)

        self._session = orm.Session(self._engine, autoflush = False, autocommit = False)
        self._metadata = Base.metadata
        #loadInitialData(Node)
        Base.metadata.create_all(self.engine)
        meta = MetaData(schema_version = CURRENT_SCHEMA_VERSION)
        self.session.add(meta)
        self.session.flush()
        self.session.commit()
        self._closed = False

    def __del__(self):
        pass
        #if not self._closed:
        #    self.close()

    def close(self):
        """

        """
        self.session.close()
        self.engine.dispose()
        self._closed = True

    @property
    def engine(self):
        return self._engine

    @property
    def metadata(self):
        return self._metadata

    @property
    def session(self):
        return self._session

    def begin_transaction(self):
        """
        """

    def commit_transaction(self):
        """
        """

    def rollback_transaction(self):
        """
        """

KEYWORD_MAP = {
    "A2ML" : A2ml,
    "A2ML_VERSION" : A2mlVersion,
    "ADDR_EPK" : AddrEpk,
    "ALIGNMENT_BYTE" : AlignmentByte,
    "ALIGNMENT_FLOAT32_IEEE" : AlignmentFloat32Ieee,
    "ALIGNMENT_FLOAT64_IEEE" : AlignmentFloat64Ieee,
    "ALIGNMENT_INT64" : AlignmentInt64,
    "ALIGNMENT_LONG" : AlignmentLong,
    "ALIGNMENT_WORD" : AlignmentWord,
    "ANNOTATION" : Annotation,
    "ANNOTATION_LABEL" : AnnotationLabel,
    "ANNOTATION_ORIGIN" : AnnotationOrigin,
    "ANNOTATION_TEXT" : AnnotationText,
    "ARRAY_SIZE" : ArraySize,
    "ASAP2_VERSION" : Asap2Version,
    "AXIS_DESCR" : AxisDescr,
    "AXIS_PTS" : AxisPts,
    "AXIS_PTS_REF" : AxisPtsRef,
    "AXIS_PTS_X" : AxisPtsX,
    "AXIS_PTS_Y" : AxisPtsY,
    "AXIS_PTS_Z" : AxisPtsZ,
    "AXIS_PTS_4" : AxisPts4,
    "AXIS_PTS_5" : AxisPts5,
    "AXIS_RESCALE_X" : AxisRescaleX,
    "AXIS_RESCALE_Y" : AxisRescaleY,
    "AXIS_RESCALE_Z" : AxisRescaleZ,
    "AXIS_RESCALE_4" : AxisRescale4,
    "AXIS_RESCALE_5" : AxisRescale5,
    "BIT_MASK" : BitMask,
    "BIT_OPERATION" : BitOperation,
    "BYTE_ORDER" : ByteOrder,
    "CALIBRATION_ACCESS" : CalibrationAccess,
    "CALIBRATION_HANDLE" : CalibrationHandle,
    "CALIBRATION_HANDLE_TEXT" : CalibrationHandleText,
    "CALIBRATION_METHOD" : CalibrationMethod,
    "CHARACTERISTIC" : Characteristic,
    "COEFFS" : Coeffs,
    "COEFFS_LINEAR" : CoeffsLinear,
    "COMPARISON_QUANTITY" : ComparisonQuantity,
    "COMPU_METHOD" : CompuMethod,
    "COMPU_TAB" : CompuTab,
    "COMPU_TAB_REF" : CompuTabRef,
    "COMPU_VTAB" : CompuVtab,
    "COMPU_VTAB_RANGE" : CompuVtabRange,
    "CPU_TYPE" : CpuType,
    "CURVE_AXIS_REF" : CurveAxisRef,
    "CUSTOMER" : Customer,
    "CUSTOMER_NO" : CustomerNo,
    "DATA_SIZE" : DataSize,
    "DEF_CHARACTERISTIC" : DefCharacteristic,
    "DEFAULT_VALUE" : DefaultValue,
    "DEFAULT_VALUE_NUMERIC" : DefaultValueNumeric,
    "DEPENDENT_CHARACTERISTIC" : DependentCharacteristic,
    "DEPOSIT" : Deposit,
    "DISCRETE" : Discrete,
    "DISPLAY_IDENTIFIER" : DisplayIdentifier,
    "DIST_OP_X" : DistOpX,
    "DIST_OP_Y" : DistOpY,
    "DIST_OP_Z" : DistOpZ,
    "DIST_OP_4" : DistOp4,
    "DIST_OP_5" : DistOp5,
    "ECU" : Ecu,
    "ECU_ADDRESS" : EcuAddress,
    "ECU_ADDRESS_EXTENSION" : EcuAddressExtension,
    "ECU_CALIBRATION_OFFSET" : EcuCalibrationOffset,
    "EPK" : Epk,
    "ERROR_MASK" : ErrorMask,
    "EXTENDED_LIMITS" : ExtendedLimits,
    "FIX_AXIS_PAR" : FixAxisPar,
    "FIX_AXIS_PAR_DIST" : FixAxisParDist,
    "FIX_AXIS_PAR_LIST" : FixAxisParList,
    "FIX_NO_AXIS_PTS_X" : FixNoAxisPtsX,
    "FIX_NO_AXIS_PTS_Y" : FixNoAxisPtsY,
    "FIX_NO_AXIS_PTS_Z" : FixNoAxisPtsZ,
    "FIX_NO_AXIS_PTS_4" : FixNoAxisPts4,
    "FIX_NO_AXIS_PTS_5" : FixNoAxisPts5,
    "FNC_VALUES" : FncValues,
    "FORMAT" : Format,
    "FORMULA" : Formula,
    "FORMULA_INV" : FormulaInv,
    "FRAME" : Frame,
    "FRAME_MEASUREMENT" : FrameMeasurement,
    "FUNCTION" : Function,
    "FUNCTION_LIST" : FunctionList,
    "FUNCTION_VERSION" : FunctionVersion,
    "GROUP" : Group,
    "GUARD_RAILS" : GuardRails,
    "HEADER" : Header,
    "IDENTIFICATION" : Identification,
    "IF_DATA" : IfData,
    "IN_MEASUREMENT" : InMeasurement,
    "LAYOUT" : Layout,
    "LEFT_SHIFT" : LeftShift,
    "LOC_MEASUREMENT" : LocMeasurement,
    "MAP_LIST" : MapList,
    "MATRIX_DIM" : MatrixDim,
    "MAX_GRAD" : MaxGrad,
    "MAX_REFRESH" : MaxRefresh,
    "MEASUREMENT" : Measurement,
    "MEMORY_LAYOUT" : MemoryLayout,
    "MEMORY_SEGMENT" : MemorySegment,
    "MOD_COMMON" : ModCommon,
    "MOD_PAR" : ModPar,
    "MODULE" : Module,
    "MONOTONY" : Monotony,
    "NO_AXIS_PTS_X" : NoAxisPtsX,
    "NO_AXIS_PTS_Y" : NoAxisPtsY,
    "NO_AXIS_PTS_Z" : NoAxisPtsZ,
    "NO_AXIS_PTS_4" : NoAxisPts4,
    "NO_AXIS_PTS_5" : NoAxisPts5,
    "NO_OF_INTERFACES" : NoOfInterfaces,
    "NO_RESCALE_X" : NoRescaleX,
    "NO_RESCALE_Y" : NoRescaleY,
    "NO_RESCALE_Z" : NoRescaleZ,
    "NO_RESCALE_4" : NoRescale4,
    "NO_RESCALE_5" : NoRescale5,
    "NUMBER" : Number,
    "OFFSET_X" : OffsetX,
    "OFFSET_Y" : OffsetY,
    "OFFSET_Z" : OffsetZ,
    "OFFSET_4" : Offset4,
    "OFFSET_5" : Offset5,
    "OUT_MEASUREMENT" : OutMeasurement,
    "PHONE_NO" : PhoneNo,
    "PHYS_UNIT" : PhysUnit,
    "PROJECT" : Project,
    "PROJECT_NO" : ProjectNo,
    "READ_ONLY" : ReadOnly,
    "READ_WRITE" : ReadWrite,
    "RECORD_LAYOUT" : RecordLayout,
    "REF_CHARACTERISTIC" : RefCharacteristic,
    "REF_GROUP" : RefGroup,
    "REF_MEASUREMENT" : RefMeasurement,
    "REF_MEMORY_SEGMENT" : RefMemorySegment,
    "REF_UNIT" : RefUnit,
    "RESERVED" : Reserved,
    "RIGHT_SHIFT" : RightShift,
    "RIP_ADDR_W" : RipAddrW,
    "RIP_ADDR_X" : RipAddrX,
    "RIP_ADDR_Y" : RipAddrY,
    "RIP_ADDR_Z" : RipAddrZ,
    "RIP_ADDR_4" : RipAddr4,
    "RIP_ADDR_5" : RipAddr5,
    "ROOT" : Root,
    "SHIFT_OP_X" : ShiftOpX,
    "SHIFT_OP_Y" : ShiftOpY,
    "SHIFT_OP_Z" : ShiftOpZ,
    "SHIFT_OP_4" : ShiftOp4,
    "SHIFT_OP_5" : ShiftOp5,
    "SIGN_EXTEND" : SignExtend,
    "SI_EXPONENTS" : SiExponents,
    "SRC_ADDR_X" : SrcAddrX,
    "SRC_ADDR_Y" : SrcAddrY,
    "SRC_ADDR_Z" : SrcAddrZ,
    "SRC_ADDR_4" : SrcAddr4,
    "SRC_ADDR_5" : SrcAddr5,
    "STATIC_RECORD_LAYOUT" : StaticRecordLayout,
    "STATUS_STRING_REF" : StatusStringRef,
    "STEP_SIZE" : StepSize,
    "SUB_FUNCTION" : SubFunction,
    "SUB_GROUP" : SubGroup,
    "SUPPLIER" : Supplier,
    "SYMBOL_LINK" : SymbolLink,
    "SYSTEM_CONSTANT" : SystemConstant,
    "S_REC_LAYOUT" : SRecLayout,
    "UNIT" : Unit,
    "UNIT_CONVERSION" : UnitConversion,
    "USER" : User,
    "USER_RIGHTS" : UserRights,
    "VAR_ADDRESS" : VarAddress,
    "VAR_CHARACTERISTIC" : VarCharacteristic,
    "VAR_CRITERION" : VarCriterion,
    "VAR_FORBIDDEN_COMB" : VarForbiddenComb,
    "VAR_MEASUREMENT" : VarMeasurement,
    "VAR_NAMING" : VarNaming,
    "VAR_SELECTION_CHARACTERISTIC" : VarSelectionCharacteristic,
    "VAR_SEPARATOR" : VarSeparator,
    "VARIANT_CODING" : VariantCoding,
    "VERSION" : Version,
    "VIRTUAL" : Virtual,
    "VIRTUAL_CHARACTERISTIC" : VirtualCharacteristic,
}

def instanceFactory(className, **kws):
    """Create an instance of a given class.
    """
    klass = KEYWORD_MAP.get(className)
    inst = klass()
    inst.attrs = []
    for k, v in kws.items():
        k = "{}{}".format(k[0].lower(), k[1 : ])
        setattr(inst, k, v.value)
        inst.attrs.append(k)
    inst.children = []
    return inst