/**
 * *******************************************************************************
 *  Copyright (c) 2017 Timing-Architects Embedded Systems GmbH and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 *     Generated using Eclipse EMF
 * 
 * *******************************************************************************
 */
package org.eclipse.app4mc.amalthea.generator.configuration;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;

/**
 * <!-- begin-user-doc -->
 * The <b>Package</b> for the model.
 * It contains accessors for the meta objects to represent
 * <ul>
 *   <li>each class,</li>
 *   <li>each feature of each class,</li>
 *   <li>each operation of each class,</li>
 *   <li>each enum,</li>
 *   <li>and each data type</li>
 * </ul>
 * <!-- end-user-doc -->
 * <!-- begin-model-doc -->
 * *
 * *******************************************************************************
 *  Copyright (c) 2017 Timing-Architects Embedded Systems GmbH and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Timing-Architects Embedded Systems GmbH - initial API and implementation
 * 
 * *******************************************************************************
 * <!-- end-model-doc -->
 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCFactory
 * @model kind="package"
 *        annotation="http://www.eclipse.org/emf/2002/GenModel modelName='RTMGC' prefix='RTMGC' copyrightText='*******************************************************************************\r\n Copyright (c) 2017 Timing-Architects Embedded Systems GmbH and others.\r\n All rights reserved. This program and the accompanying materials\r\n are made available under the terms of the Eclipse Public License v1.0\r\n which accompanies this distribution, and is available at\r\n http://www.eclipse.org/legal/epl-v10.html\r\n\r\n    Generated using Eclipse EMF\r\n\r\n*******************************************************************************' basePackage='org.eclipse.app4mc.amalthea.generator'"
 * @generated
 */
public interface RTMGCPackage extends EPackage {
	/**
	 * The package name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNAME = "configuration";

	/**
	 * The package namespace URI.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_URI = "org.eclipse.app4mc.amalthea.generator.configuration";

	/**
	 * The package namespace name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_PREFIX = "configuration";

	/**
	 * The singleton instance of the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	RTMGCPackage eINSTANCE = org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl.init();

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCImpl <em>RTMGC</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRTMGC()
	 * @generated
	 */
	int RTMGC = 0;

	/**
	 * The feature id for the '<em><b>Generation</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RTMGC__GENERATION = 0;

	/**
	 * The number of structural features of the '<em>RTMGC</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RTMGC_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>RTMGC</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RTMGC_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl <em>Generation</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getGeneration()
	 * @generated
	 */
	int GENERATION = 1;

	/**
	 * The feature id for the '<em><b>Count</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__COUNT = 0;

	/**
	 * The feature id for the '<em><b>Base Model</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__BASE_MODEL = 1;

	/**
	 * The feature id for the '<em><b>Hw Models</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__HW_MODELS = 2;

	/**
	 * The feature id for the '<em><b>Os Models</b></em>' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__OS_MODELS = 3;

	/**
	 * The feature id for the '<em><b>Sw Model</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__SW_MODEL = 4;

	/**
	 * The feature id for the '<em><b>Output Folder</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__OUTPUT_FOLDER = 5;

	/**
	 * The feature id for the '<em><b>Activations</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__ACTIVATIONS = 6;

	/**
	 * The feature id for the '<em><b>Labels</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__LABELS = 7;

	/**
	 * The feature id for the '<em><b>Runnables</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__RUNNABLES = 8;

	/**
	 * The feature id for the '<em><b>Semaphores</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__SEMAPHORES = 9;

	/**
	 * The feature id for the '<em><b>Tasks</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION__TASKS = 10;

	/**
	 * The number of structural features of the '<em>Generation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION_FEATURE_COUNT = 11;

	/**
	 * The number of operations of the '<em>Generation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int GENERATION_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationPropertiesImpl <em>Activation Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationPropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getActivationProperties()
	 * @generated
	 */
	int ACTIVATION_PROPERTIES = 2;

	/**
	 * The feature id for the '<em><b>Periodic Activation</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_PROPERTIES__PERIODIC_ACTIVATION = 0;

	/**
	 * The feature id for the '<em><b>Periodic Triangle Shift</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_PROPERTIES__PERIODIC_TRIANGLE_SHIFT = 1;

	/**
	 * The feature id for the '<em><b>Sporadic Activation</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_PROPERTIES__SPORADIC_ACTIVATION = 2;

	/**
	 * The number of structural features of the '<em>Activation Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_PROPERTIES_FEATURE_COUNT = 3;

	/**
	 * The number of operations of the '<em>Activation Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationImpl <em>Activation</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getActivation()
	 * @generated
	 */
	int ACTIVATION = 3;

	/**
	 * The feature id for the '<em><b>Appearance Probability</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION__APPEARANCE_PROBABILITY = 0;

	/**
	 * The number of structural features of the '<em>Activation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Activation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int ACTIVATION_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicActivationImpl <em>Periodic Activation</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicActivationImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPeriodicActivation()
	 * @generated
	 */
	int PERIODIC_ACTIVATION = 4;

	/**
	 * The feature id for the '<em><b>Appearance Probability</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_ACTIVATION__APPEARANCE_PROBABILITY = ACTIVATION__APPEARANCE_PROBABILITY;

	/**
	 * The feature id for the '<em><b>Recurrence</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_ACTIVATION__RECURRENCE = ACTIVATION_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Offset</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_ACTIVATION__OFFSET = ACTIVATION_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Periodic Activation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_ACTIVATION_FEATURE_COUNT = ACTIVATION_FEATURE_COUNT + 2;

	/**
	 * The number of operations of the '<em>Periodic Activation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_ACTIVATION_OPERATION_COUNT = ACTIVATION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicTriangleShiftImpl <em>Periodic Triangle Shift</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicTriangleShiftImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPeriodicTriangleShift()
	 * @generated
	 */
	int PERIODIC_TRIANGLE_SHIFT = 5;

	/**
	 * The feature id for the '<em><b>Appearance Probability</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_TRIANGLE_SHIFT__APPEARANCE_PROBABILITY = PERIODIC_ACTIVATION__APPEARANCE_PROBABILITY;

	/**
	 * The feature id for the '<em><b>Recurrence</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_TRIANGLE_SHIFT__RECURRENCE = PERIODIC_ACTIVATION__RECURRENCE;

	/**
	 * The feature id for the '<em><b>Offset</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_TRIANGLE_SHIFT__OFFSET = PERIODIC_ACTIVATION__OFFSET;

	/**
	 * The feature id for the '<em><b>Clock</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_TRIANGLE_SHIFT__CLOCK = PERIODIC_ACTIVATION_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Periodic Triangle Shift</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_TRIANGLE_SHIFT_FEATURE_COUNT = PERIODIC_ACTIVATION_FEATURE_COUNT + 1;

	/**
	 * The number of operations of the '<em>Periodic Triangle Shift</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERIODIC_TRIANGLE_SHIFT_OPERATION_COUNT = PERIODIC_ACTIVATION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TriangleClockImpl <em>Triangle Clock</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.TriangleClockImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getTriangleClock()
	 * @generated
	 */
	int TRIANGLE_CLOCK = 6;

	/**
	 * The feature id for the '<em><b>Min start</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TRIANGLE_CLOCK__MIN_START = 0;

	/**
	 * The feature id for the '<em><b>Max end</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TRIANGLE_CLOCK__MAX_END = 1;

	/**
	 * The feature id for the '<em><b>Shift</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TRIANGLE_CLOCK__SHIFT = 2;

	/**
	 * The feature id for the '<em><b>Period</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TRIANGLE_CLOCK__PERIOD = 3;

	/**
	 * The number of structural features of the '<em>Triangle Clock</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TRIANGLE_CLOCK_FEATURE_COUNT = 4;

	/**
	 * The number of operations of the '<em>Triangle Clock</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TRIANGLE_CLOCK_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.SporadicActivationImpl <em>Sporadic Activation</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.SporadicActivationImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSporadicActivation()
	 * @generated
	 */
	int SPORADIC_ACTIVATION = 7;

	/**
	 * The feature id for the '<em><b>Appearance Probability</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SPORADIC_ACTIVATION__APPEARANCE_PROBABILITY = ACTIVATION__APPEARANCE_PROBABILITY;

	/**
	 * The feature id for the '<em><b>Min Value</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SPORADIC_ACTIVATION__MIN_VALUE = ACTIVATION_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Max Value Distance</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SPORADIC_ACTIVATION__MAX_VALUE_DISTANCE = ACTIVATION_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Avg Value Distance</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SPORADIC_ACTIVATION__AVG_VALUE_DISTANCE = ACTIVATION_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Sporadic Activation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SPORADIC_ACTIVATION_FEATURE_COUNT = ACTIVATION_FEATURE_COUNT + 3;

	/**
	 * The number of operations of the '<em>Sporadic Activation</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SPORADIC_ACTIVATION_OPERATION_COUNT = ACTIVATION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.DistributionImpl <em>Distribution</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.DistributionImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getDistribution()
	 * @generated
	 */
	int DISTRIBUTION = 15;

	/**
	 * The feature id for the '<em><b>Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DISTRIBUTION__TYPE = 0;

	/**
	 * The number of structural features of the '<em>Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DISTRIBUTION_FEATURE_COUNT = 1;

	/**
	 * The number of operations of the '<em>Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DISTRIBUTION_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerDistributionImpl <em>Integer Distribution</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerDistributionImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getIntegerDistribution()
	 * @generated
	 */
	int INTEGER_DISTRIBUTION = 16;

	/**
	 * The feature id for the '<em><b>Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_DISTRIBUTION__TYPE = DISTRIBUTION__TYPE;

	/**
	 * The feature id for the '<em><b>Min</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_DISTRIBUTION__MIN = DISTRIBUTION_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Avg</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_DISTRIBUTION__AVG = DISTRIBUTION_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Max</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_DISTRIBUTION__MAX = DISTRIBUTION_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Integer Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_DISTRIBUTION_FEATURE_COUNT = DISTRIBUTION_FEATURE_COUNT + 3;

	/**
	 * The number of operations of the '<em>Integer Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_DISTRIBUTION_OPERATION_COUNT = DISTRIBUTION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerTimeDistributionImpl <em>Integer Time Distribution</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerTimeDistributionImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getIntegerTimeDistribution()
	 * @generated
	 */
	int INTEGER_TIME_DISTRIBUTION = 17;

	/**
	 * The feature id for the '<em><b>Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION__TYPE = INTEGER_DISTRIBUTION__TYPE;

	/**
	 * The feature id for the '<em><b>Min</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION__MIN = INTEGER_DISTRIBUTION__MIN;

	/**
	 * The feature id for the '<em><b>Avg</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION__AVG = INTEGER_DISTRIBUTION__AVG;

	/**
	 * The feature id for the '<em><b>Max</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION__MAX = INTEGER_DISTRIBUTION__MAX;

	/**
	 * The feature id for the '<em><b>Unit</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION__UNIT = INTEGER_DISTRIBUTION_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Integer Time Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION_FEATURE_COUNT = INTEGER_DISTRIBUTION_FEATURE_COUNT + 1;

	/**
	 * The number of operations of the '<em>Integer Time Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int INTEGER_TIME_DISTRIBUTION_OPERATION_COUNT = INTEGER_DISTRIBUTION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.RecurrenceImpl <em>Recurrence</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RecurrenceImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRecurrence()
	 * @generated
	 */
	int RECURRENCE = 8;

	/**
	 * The feature id for the '<em><b>Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE__TYPE = INTEGER_TIME_DISTRIBUTION__TYPE;

	/**
	 * The feature id for the '<em><b>Min</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE__MIN = INTEGER_TIME_DISTRIBUTION__MIN;

	/**
	 * The feature id for the '<em><b>Avg</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE__AVG = INTEGER_TIME_DISTRIBUTION__AVG;

	/**
	 * The feature id for the '<em><b>Max</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE__MAX = INTEGER_TIME_DISTRIBUTION__MAX;

	/**
	 * The feature id for the '<em><b>Unit</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE__UNIT = INTEGER_TIME_DISTRIBUTION__UNIT;

	/**
	 * The feature id for the '<em><b>Recurrence Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE__RECURRENCE_TYPE = INTEGER_TIME_DISTRIBUTION_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Recurrence</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE_FEATURE_COUNT = INTEGER_TIME_DISTRIBUTION_FEATURE_COUNT + 1;

	/**
	 * The number of operations of the '<em>Recurrence</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RECURRENCE_OPERATION_COUNT = INTEGER_TIME_DISTRIBUTION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.LabelPropertiesImpl <em>Label Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.LabelPropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getLabelProperties()
	 * @generated
	 */
	int LABEL_PROPERTIES = 9;

	/**
	 * The feature id for the '<em><b>Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int LABEL_PROPERTIES__COUNT = 0;

	/**
	 * The feature id for the '<em><b>Bit Size</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int LABEL_PROPERTIES__BIT_SIZE = 1;

	/**
	 * The feature id for the '<em><b>Per SWC</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int LABEL_PROPERTIES__PER_SWC = 2;

	/**
	 * The number of structural features of the '<em>Label Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int LABEL_PROPERTIES_FEATURE_COUNT = 3;

	/**
	 * The number of operations of the '<em>Label Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int LABEL_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.RunnablePropertiesImpl <em>Runnable Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RunnablePropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRunnableProperties()
	 * @generated
	 */
	int RUNNABLE_PROPERTIES = 10;

	/**
	 * The feature id for the '<em><b>Runtime Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES__RUNTIME_TYPE = 0;

	/**
	 * The feature id for the '<em><b>Instructions Per Runnables</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES__INSTRUCTIONS_PER_RUNNABLES = 1;

	/**
	 * The feature id for the '<em><b>Runnables Per Call Sequence</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES__RUNNABLES_PER_CALL_SEQUENCE = 2;

	/**
	 * The feature id for the '<em><b>Runnables Per SWC</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES__RUNNABLES_PER_SWC = 3;

	/**
	 * The feature id for the '<em><b>Min Statistics Distance</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES__MIN_STATISTICS_DISTANCE = 4;

	/**
	 * The feature id for the '<em><b>Max Statistics Distance</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES__MAX_STATISTICS_DISTANCE = 5;

	/**
	 * The number of structural features of the '<em>Runnable Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES_FEATURE_COUNT = 6;

	/**
	 * The number of operations of the '<em>Runnable Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int RUNNABLE_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphorePropertiesImpl <em>Semaphore Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphorePropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreProperties()
	 * @generated
	 */
	int SEMAPHORE_PROPERTIES = 11;

	/**
	 * The feature id for the '<em><b>Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES__COUNT = 0;

	/**
	 * The feature id for the '<em><b>Priority Ceiling Protocol</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES__PRIORITY_CEILING_PROTOCOL = 1;

	/**
	 * The feature id for the '<em><b>Semaphore Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES__SEMAPHORE_TYPE = 2;

	/**
	 * The feature id for the '<em><b>Wait Mode</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES__WAIT_MODE = 3;

	/**
	 * The feature id for the '<em><b>Semaphore Access</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES__SEMAPHORE_ACCESS = 4;

	/**
	 * The number of structural features of the '<em>Semaphore Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES_FEATURE_COUNT = 5;

	/**
	 * The number of operations of the '<em>Semaphore Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphoreAccessPropertiesImpl <em>Semaphore Access Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphoreAccessPropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreAccessProperties()
	 * @generated
	 */
	int SEMAPHORE_ACCESS_PROPERTIES = 12;

	/**
	 * The feature id for the '<em><b>Per Unit Read Access Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_ACCESS_PROPERTIES__PER_UNIT_READ_ACCESS_COUNT = 0;

	/**
	 * The feature id for the '<em><b>Per Unit Write Access Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_ACCESS_PROPERTIES__PER_UNIT_WRITE_ACCESS_COUNT = 1;

	/**
	 * The feature id for the '<em><b>Request Order</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_ACCESS_PROPERTIES__REQUEST_ORDER = 2;

	/**
	 * The feature id for the '<em><b>Access Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_ACCESS_PROPERTIES__ACCESS_TYPE = 3;

	/**
	 * The number of structural features of the '<em>Semaphore Access Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_ACCESS_PROPERTIES_FEATURE_COUNT = 4;

	/**
	 * The number of operations of the '<em>Semaphore Access Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int SEMAPHORE_ACCESS_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl <em>Task Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getTaskProperties()
	 * @generated
	 */
	int TASK_PROPERTIES = 13;

	/**
	 * The feature id for the '<em><b>Count</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__COUNT = 0;

	/**
	 * The feature id for the '<em><b>Load</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__LOAD = 1;

	/**
	 * The feature id for the '<em><b>Per Task Group</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__PER_TASK_GROUP = 2;

	/**
	 * The feature id for the '<em><b>Mta</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__MTA = 3;

	/**
	 * The feature id for the '<em><b>Deadline Factor</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__DEADLINE_FACTOR = 4;

	/**
	 * The feature id for the '<em><b>Call Sequences Between Schedule Points</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS = 5;

	/**
	 * The feature id for the '<em><b>Call Graphs</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__CALL_GRAPHS = 6;

	/**
	 * The feature id for the '<em><b>Mapping Determination</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__MAPPING_DETERMINATION = 7;

	/**
	 * The feature id for the '<em><b>Priority Determination</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES__PRIORITY_DETERMINATION = 8;

	/**
	 * The number of structural features of the '<em>Task Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES_FEATURE_COUNT = 9;

	/**
	 * The number of operations of the '<em>Task Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int TASK_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.CallGraphPropertiesImpl <em>Call Graph Properties</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.CallGraphPropertiesImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getCallGraphProperties()
	 * @generated
	 */
	int CALL_GRAPH_PROPERTIES = 14;

	/**
	 * The feature id for the '<em><b>Signal Domain Coverage</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int CALL_GRAPH_PROPERTIES__SIGNAL_DOMAIN_COVERAGE = 0;

	/**
	 * The feature id for the '<em><b>Call Sequence Usage</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int CALL_GRAPH_PROPERTIES__CALL_SEQUENCE_USAGE = 1;

	/**
	 * The number of structural features of the '<em>Call Graph Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int CALL_GRAPH_PROPERTIES_FEATURE_COUNT = 2;

	/**
	 * The number of operations of the '<em>Call Graph Properties</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int CALL_GRAPH_PROPERTIES_OPERATION_COUNT = 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.PercentageDistributionImpl <em>Percentage Distribution</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.PercentageDistributionImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPercentageDistribution()
	 * @generated
	 */
	int PERCENTAGE_DISTRIBUTION = 18;

	/**
	 * The feature id for the '<em><b>Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERCENTAGE_DISTRIBUTION__TYPE = DISTRIBUTION__TYPE;

	/**
	 * The feature id for the '<em><b>Min Percentage</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERCENTAGE_DISTRIBUTION__MIN_PERCENTAGE = DISTRIBUTION_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Avg Percentage</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERCENTAGE_DISTRIBUTION__AVG_PERCENTAGE = DISTRIBUTION_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Max Percentage</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERCENTAGE_DISTRIBUTION__MAX_PERCENTAGE = DISTRIBUTION_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Percentage Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERCENTAGE_DISTRIBUTION_FEATURE_COUNT = DISTRIBUTION_FEATURE_COUNT + 3;

	/**
	 * The number of operations of the '<em>Percentage Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PERCENTAGE_DISTRIBUTION_OPERATION_COUNT = DISTRIBUTION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.DoubleDistributionImpl <em>Double Distribution</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.DoubleDistributionImpl
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getDoubleDistribution()
	 * @generated
	 */
	int DOUBLE_DISTRIBUTION = 19;

	/**
	 * The feature id for the '<em><b>Type</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DOUBLE_DISTRIBUTION__TYPE = DISTRIBUTION__TYPE;

	/**
	 * The feature id for the '<em><b>Min</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DOUBLE_DISTRIBUTION__MIN = DISTRIBUTION_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Avg</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DOUBLE_DISTRIBUTION__AVG = DISTRIBUTION_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Max</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DOUBLE_DISTRIBUTION__MAX = DISTRIBUTION_FEATURE_COUNT + 2;

	/**
	 * The number of structural features of the '<em>Double Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DOUBLE_DISTRIBUTION_FEATURE_COUNT = DISTRIBUTION_FEATURE_COUNT + 3;

	/**
	 * The number of operations of the '<em>Double Distribution</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int DOUBLE_DISTRIBUTION_OPERATION_COUNT = DISTRIBUTION_OPERATION_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType <em>Recurrence Type</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRecurrenceType()
	 * @generated
	 */
	int RECURRENCE_TYPE = 20;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType <em>Runtime Type</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRuntimeType()
	 * @generated
	 */
	int RUNTIME_TYPE = 21;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder <em>Semaphore Request Order</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreRequestOrder()
	 * @generated
	 */
	int SEMAPHORE_REQUEST_ORDER = 22;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType <em>Semaphore Access Type</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreAccessType()
	 * @generated
	 */
	int SEMAPHORE_ACCESS_TYPE = 23;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType <em>Semaphore Type</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreType()
	 * @generated
	 */
	int SEMAPHORE_TYPE = 24;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.WaitModes <em>Wait Modes</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.WaitModes
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getWaitModes()
	 * @generated
	 */
	int WAIT_MODES = 25;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.DistributionType <em>Distribution Type</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.DistributionType
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getDistributionType()
	 * @generated
	 */
	int DISTRIBUTION_TYPE = 26;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms <em>Process Mapping Algorithms</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getProcessMappingAlgorithms()
	 * @generated
	 */
	int PROCESS_MAPPING_ALGORITHMS = 27;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm <em>Priority Determination Algorithm</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPriorityDeterminationAlgorithm()
	 * @generated
	 */
	int PRIORITY_DETERMINATION_ALGORITHM = 28;

	/**
	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit <em>Time Unit</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getTimeUnit()
	 * @generated
	 */
	int TIME_UNIT = 29;


	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.RTMGC <em>RTMGC</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>RTMGC</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGC
	 * @generated
	 */
	EClass getRTMGC();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.RTMGC#getGeneration <em>Generation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Generation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGC#getGeneration()
	 * @see #getRTMGC()
	 * @generated
	 */
	EReference getRTMGC_Generation();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation <em>Generation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Generation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation
	 * @generated
	 */
	EClass getGeneration();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Count</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getCount()
	 * @see #getGeneration()
	 * @generated
	 */
	EAttribute getGeneration_Count();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getBaseModel <em>Base Model</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Base Model</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getBaseModel()
	 * @see #getGeneration()
	 * @generated
	 */
	EAttribute getGeneration_BaseModel();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getHwModels <em>Hw Models</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Hw Models</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getHwModels()
	 * @see #getGeneration()
	 * @generated
	 */
	EAttribute getGeneration_HwModels();

	/**
	 * Returns the meta object for the attribute list '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getOsModels <em>Os Models</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute list '<em>Os Models</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getOsModels()
	 * @see #getGeneration()
	 * @generated
	 */
	EAttribute getGeneration_OsModels();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getSwModel <em>Sw Model</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Sw Model</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getSwModel()
	 * @see #getGeneration()
	 * @generated
	 */
	EAttribute getGeneration_SwModel();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getOutputFolder <em>Output Folder</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Output Folder</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getOutputFolder()
	 * @see #getGeneration()
	 * @generated
	 */
	EAttribute getGeneration_OutputFolder();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getActivations <em>Activations</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Activations</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getActivations()
	 * @see #getGeneration()
	 * @generated
	 */
	EReference getGeneration_Activations();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getLabels <em>Labels</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Labels</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getLabels()
	 * @see #getGeneration()
	 * @generated
	 */
	EReference getGeneration_Labels();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getRunnables <em>Runnables</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Runnables</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getRunnables()
	 * @see #getGeneration()
	 * @generated
	 */
	EReference getGeneration_Runnables();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getSemaphores <em>Semaphores</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Semaphores</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getSemaphores()
	 * @see #getGeneration()
	 * @generated
	 */
	EReference getGeneration_Semaphores();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.Generation#getTasks <em>Tasks</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Tasks</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Generation#getTasks()
	 * @see #getGeneration()
	 * @generated
	 */
	EReference getGeneration_Tasks();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties <em>Activation Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Activation Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties
	 * @generated
	 */
	EClass getActivationProperties();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties#getPeriodicActivation <em>Periodic Activation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Periodic Activation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties#getPeriodicActivation()
	 * @see #getActivationProperties()
	 * @generated
	 */
	EReference getActivationProperties_PeriodicActivation();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties#getPeriodicTriangleShift <em>Periodic Triangle Shift</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Periodic Triangle Shift</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties#getPeriodicTriangleShift()
	 * @see #getActivationProperties()
	 * @generated
	 */
	EReference getActivationProperties_PeriodicTriangleShift();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties#getSporadicActivation <em>Sporadic Activation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Sporadic Activation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties#getSporadicActivation()
	 * @see #getActivationProperties()
	 * @generated
	 */
	EReference getActivationProperties_SporadicActivation();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.Activation <em>Activation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Activation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Activation
	 * @generated
	 */
	EClass getActivation();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Activation#getAppearanceProbability <em>Appearance Probability</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Appearance Probability</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Activation#getAppearanceProbability()
	 * @see #getActivation()
	 * @generated
	 */
	EAttribute getActivation_AppearanceProbability();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation <em>Periodic Activation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Periodic Activation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation
	 * @generated
	 */
	EClass getPeriodicActivation();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation#getRecurrence <em>Recurrence</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Recurrence</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation#getRecurrence()
	 * @see #getPeriodicActivation()
	 * @generated
	 */
	EReference getPeriodicActivation_Recurrence();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation#getOffset <em>Offset</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Offset</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation#getOffset()
	 * @see #getPeriodicActivation()
	 * @generated
	 */
	EReference getPeriodicActivation_Offset();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.PeriodicTriangleShift <em>Periodic Triangle Shift</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Periodic Triangle Shift</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PeriodicTriangleShift
	 * @generated
	 */
	EClass getPeriodicTriangleShift();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.PeriodicTriangleShift#getClock <em>Clock</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Clock</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PeriodicTriangleShift#getClock()
	 * @see #getPeriodicTriangleShift()
	 * @generated
	 */
	EReference getPeriodicTriangleShift_Clock();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock <em>Triangle Clock</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Triangle Clock</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock
	 * @generated
	 */
	EClass getTriangleClock();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getMin_start <em>Min start</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Min start</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getMin_start()
	 * @see #getTriangleClock()
	 * @generated
	 */
	EReference getTriangleClock_Min_start();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getMax_end <em>Max end</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Max end</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getMax_end()
	 * @see #getTriangleClock()
	 * @generated
	 */
	EReference getTriangleClock_Max_end();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getShift <em>Shift</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Shift</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getShift()
	 * @see #getTriangleClock()
	 * @generated
	 */
	EReference getTriangleClock_Shift();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getPeriod <em>Period</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Period</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock#getPeriod()
	 * @see #getTriangleClock()
	 * @generated
	 */
	EReference getTriangleClock_Period();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation <em>Sporadic Activation</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Sporadic Activation</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation
	 * @generated
	 */
	EClass getSporadicActivation();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation#getMinValue <em>Min Value</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Min Value</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation#getMinValue()
	 * @see #getSporadicActivation()
	 * @generated
	 */
	EReference getSporadicActivation_MinValue();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation#getMaxValueDistance <em>Max Value Distance</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Max Value Distance</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation#getMaxValueDistance()
	 * @see #getSporadicActivation()
	 * @generated
	 */
	EReference getSporadicActivation_MaxValueDistance();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation#getAvgValueDistance <em>Avg Value Distance</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Avg Value Distance</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation#getAvgValueDistance()
	 * @see #getSporadicActivation()
	 * @generated
	 */
	EReference getSporadicActivation_AvgValueDistance();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.Recurrence <em>Recurrence</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Recurrence</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Recurrence
	 * @generated
	 */
	EClass getRecurrence();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Recurrence#getRecurrenceType <em>Recurrence Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Recurrence Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Recurrence#getRecurrenceType()
	 * @see #getRecurrence()
	 * @generated
	 */
	EAttribute getRecurrence_RecurrenceType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties <em>Label Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Label Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties
	 * @generated
	 */
	EClass getLabelProperties();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Count</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties#getCount()
	 * @see #getLabelProperties()
	 * @generated
	 */
	EReference getLabelProperties_Count();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties#getBitSize <em>Bit Size</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Bit Size</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties#getBitSize()
	 * @see #getLabelProperties()
	 * @generated
	 */
	EReference getLabelProperties_BitSize();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties#getPerSWC <em>Per SWC</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Per SWC</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties#getPerSWC()
	 * @see #getLabelProperties()
	 * @generated
	 */
	EReference getLabelProperties_PerSWC();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties <em>Runnable Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Runnable Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties
	 * @generated
	 */
	EClass getRunnableProperties();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getRuntimeType <em>Runtime Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Runtime Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getRuntimeType()
	 * @see #getRunnableProperties()
	 * @generated
	 */
	EAttribute getRunnableProperties_RuntimeType();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getInstructionsPerRunnables <em>Instructions Per Runnables</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Instructions Per Runnables</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getInstructionsPerRunnables()
	 * @see #getRunnableProperties()
	 * @generated
	 */
	EReference getRunnableProperties_InstructionsPerRunnables();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getRunnablesPerCallSequence <em>Runnables Per Call Sequence</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Runnables Per Call Sequence</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getRunnablesPerCallSequence()
	 * @see #getRunnableProperties()
	 * @generated
	 */
	EReference getRunnableProperties_RunnablesPerCallSequence();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getRunnablesPerSWC <em>Runnables Per SWC</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Runnables Per SWC</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getRunnablesPerSWC()
	 * @see #getRunnableProperties()
	 * @generated
	 */
	EReference getRunnableProperties_RunnablesPerSWC();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getMinStatisticsDistance <em>Min Statistics Distance</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Min Statistics Distance</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getMinStatisticsDistance()
	 * @see #getRunnableProperties()
	 * @generated
	 */
	EReference getRunnableProperties_MinStatisticsDistance();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getMaxStatisticsDistance <em>Max Statistics Distance</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Max Statistics Distance</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties#getMaxStatisticsDistance()
	 * @see #getRunnableProperties()
	 * @generated
	 */
	EReference getRunnableProperties_MaxStatisticsDistance();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties <em>Semaphore Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Semaphore Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties
	 * @generated
	 */
	EClass getSemaphoreProperties();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Count</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getCount()
	 * @see #getSemaphoreProperties()
	 * @generated
	 */
	EReference getSemaphoreProperties_Count();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#isPriorityCeilingProtocol <em>Priority Ceiling Protocol</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Priority Ceiling Protocol</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#isPriorityCeilingProtocol()
	 * @see #getSemaphoreProperties()
	 * @generated
	 */
	EAttribute getSemaphoreProperties_PriorityCeilingProtocol();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getSemaphoreType <em>Semaphore Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Semaphore Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getSemaphoreType()
	 * @see #getSemaphoreProperties()
	 * @generated
	 */
	EAttribute getSemaphoreProperties_SemaphoreType();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getWaitMode <em>Wait Mode</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Wait Mode</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getWaitMode()
	 * @see #getSemaphoreProperties()
	 * @generated
	 */
	EAttribute getSemaphoreProperties_WaitMode();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getSemaphoreAccess <em>Semaphore Access</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Semaphore Access</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties#getSemaphoreAccess()
	 * @see #getSemaphoreProperties()
	 * @generated
	 */
	EReference getSemaphoreProperties_SemaphoreAccess();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties <em>Semaphore Access Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Semaphore Access Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties
	 * @generated
	 */
	EClass getSemaphoreAccessProperties();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitReadAccessCount <em>Per Unit Read Access Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Per Unit Read Access Count</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitReadAccessCount()
	 * @see #getSemaphoreAccessProperties()
	 * @generated
	 */
	EReference getSemaphoreAccessProperties_PerUnitReadAccessCount();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitWriteAccessCount <em>Per Unit Write Access Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Per Unit Write Access Count</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getPerUnitWriteAccessCount()
	 * @see #getSemaphoreAccessProperties()
	 * @generated
	 */
	EReference getSemaphoreAccessProperties_PerUnitWriteAccessCount();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getRequestOrder <em>Request Order</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Request Order</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getRequestOrder()
	 * @see #getSemaphoreAccessProperties()
	 * @generated
	 */
	EAttribute getSemaphoreAccessProperties_RequestOrder();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getAccessType <em>Access Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Access Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties#getAccessType()
	 * @see #getSemaphoreAccessProperties()
	 * @generated
	 */
	EAttribute getSemaphoreAccessProperties_AccessType();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties <em>Task Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Task Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties
	 * @generated
	 */
	EClass getTaskProperties();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getCount <em>Count</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Count</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getCount()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_Count();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getLoad <em>Load</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Load</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getLoad()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_Load();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getPerTaskGroup <em>Per Task Group</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Per Task Group</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getPerTaskGroup()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_PerTaskGroup();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getMta <em>Mta</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Mta</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getMta()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_Mta();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getDeadlineFactor <em>Deadline Factor</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Deadline Factor</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getDeadlineFactor()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_DeadlineFactor();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getCallSequencesBetweenSchedulePoints <em>Call Sequences Between Schedule Points</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Call Sequences Between Schedule Points</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getCallSequencesBetweenSchedulePoints()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_CallSequencesBetweenSchedulePoints();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getCallGraphs <em>Call Graphs</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Call Graphs</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getCallGraphs()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EReference getTaskProperties_CallGraphs();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getMappingDetermination <em>Mapping Determination</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Mapping Determination</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getMappingDetermination()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EAttribute getTaskProperties_MappingDetermination();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getPriorityDetermination <em>Priority Determination</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Priority Determination</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties#getPriorityDetermination()
	 * @see #getTaskProperties()
	 * @generated
	 */
	EAttribute getTaskProperties_PriorityDetermination();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties <em>Call Graph Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Call Graph Properties</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties
	 * @generated
	 */
	EClass getCallGraphProperties();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties#getSignalDomainCoverage <em>Signal Domain Coverage</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Signal Domain Coverage</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties#getSignalDomainCoverage()
	 * @see #getCallGraphProperties()
	 * @generated
	 */
	EReference getCallGraphProperties_SignalDomainCoverage();

	/**
	 * Returns the meta object for the containment reference '{@link org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties#getCallSequenceUsage <em>Call Sequence Usage</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the containment reference '<em>Call Sequence Usage</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties#getCallSequenceUsage()
	 * @see #getCallGraphProperties()
	 * @generated
	 */
	EReference getCallGraphProperties_CallSequenceUsage();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.Distribution <em>Distribution</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Distribution</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Distribution
	 * @generated
	 */
	EClass getDistribution();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.Distribution#getType <em>Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.Distribution#getType()
	 * @see #getDistribution()
	 * @generated
	 */
	EAttribute getDistribution_Type();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution <em>Integer Distribution</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Integer Distribution</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution
	 * @generated
	 */
	EClass getIntegerDistribution();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution#getMin <em>Min</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Min</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution#getMin()
	 * @see #getIntegerDistribution()
	 * @generated
	 */
	EAttribute getIntegerDistribution_Min();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution#getAvg <em>Avg</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Avg</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution#getAvg()
	 * @see #getIntegerDistribution()
	 * @generated
	 */
	EAttribute getIntegerDistribution_Avg();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution#getMax <em>Max</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Max</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution#getMax()
	 * @see #getIntegerDistribution()
	 * @generated
	 */
	EAttribute getIntegerDistribution_Max();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.IntegerTimeDistribution <em>Integer Time Distribution</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Integer Time Distribution</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.IntegerTimeDistribution
	 * @generated
	 */
	EClass getIntegerTimeDistribution();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.IntegerTimeDistribution#getUnit <em>Unit</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Unit</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.IntegerTimeDistribution#getUnit()
	 * @see #getIntegerTimeDistribution()
	 * @generated
	 */
	EAttribute getIntegerTimeDistribution_Unit();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution <em>Percentage Distribution</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Percentage Distribution</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution
	 * @generated
	 */
	EClass getPercentageDistribution();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution#getMinPercentage <em>Min Percentage</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Min Percentage</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution#getMinPercentage()
	 * @see #getPercentageDistribution()
	 * @generated
	 */
	EAttribute getPercentageDistribution_MinPercentage();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution#getAvgPercentage <em>Avg Percentage</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Avg Percentage</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution#getAvgPercentage()
	 * @see #getPercentageDistribution()
	 * @generated
	 */
	EAttribute getPercentageDistribution_AvgPercentage();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution#getMaxPercentage <em>Max Percentage</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Max Percentage</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution#getMaxPercentage()
	 * @see #getPercentageDistribution()
	 * @generated
	 */
	EAttribute getPercentageDistribution_MaxPercentage();

	/**
	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution <em>Double Distribution</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Double Distribution</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution
	 * @generated
	 */
	EClass getDoubleDistribution();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution#getMin <em>Min</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Min</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution#getMin()
	 * @see #getDoubleDistribution()
	 * @generated
	 */
	EAttribute getDoubleDistribution_Min();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution#getAvg <em>Avg</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Avg</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution#getAvg()
	 * @see #getDoubleDistribution()
	 * @generated
	 */
	EAttribute getDoubleDistribution_Avg();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution#getMax <em>Max</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Max</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution#getMax()
	 * @see #getDoubleDistribution()
	 * @generated
	 */
	EAttribute getDoubleDistribution_Max();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType <em>Recurrence Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Recurrence Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType
	 * @generated
	 */
	EEnum getRecurrenceType();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType <em>Runtime Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Runtime Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType
	 * @generated
	 */
	EEnum getRuntimeType();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder <em>Semaphore Request Order</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Semaphore Request Order</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder
	 * @generated
	 */
	EEnum getSemaphoreRequestOrder();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType <em>Semaphore Access Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Semaphore Access Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType
	 * @generated
	 */
	EEnum getSemaphoreAccessType();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType <em>Semaphore Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Semaphore Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType
	 * @generated
	 */
	EEnum getSemaphoreType();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.WaitModes <em>Wait Modes</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Wait Modes</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.WaitModes
	 * @generated
	 */
	EEnum getWaitModes();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.DistributionType <em>Distribution Type</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Distribution Type</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.DistributionType
	 * @generated
	 */
	EEnum getDistributionType();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms <em>Process Mapping Algorithms</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Process Mapping Algorithms</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms
	 * @generated
	 */
	EEnum getProcessMappingAlgorithms();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm <em>Priority Determination Algorithm</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Priority Determination Algorithm</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm
	 * @generated
	 */
	EEnum getPriorityDeterminationAlgorithm();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit <em>Time Unit</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>Time Unit</em>'.
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit
	 * @generated
	 */
	EEnum getTimeUnit();

	/**
	 * Returns the factory that creates the instances of the model.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the factory that creates the instances of the model.
	 * @generated
	 */
	RTMGCFactory getRTMGCFactory();

	/**
	 * <!-- begin-user-doc -->
	 * Defines literals for the meta objects that represent
	 * <ul>
	 *   <li>each class,</li>
	 *   <li>each feature of each class,</li>
	 *   <li>each operation of each class,</li>
	 *   <li>each enum,</li>
	 *   <li>and each data type</li>
	 * </ul>
	 * <!-- end-user-doc -->
	 * @generated
	 */
	interface Literals {
		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCImpl <em>RTMGC</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRTMGC()
		 * @generated
		 */
		EClass RTMGC = eINSTANCE.getRTMGC();

		/**
		 * The meta object literal for the '<em><b>Generation</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RTMGC__GENERATION = eINSTANCE.getRTMGC_Generation();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl <em>Generation</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getGeneration()
		 * @generated
		 */
		EClass GENERATION = eINSTANCE.getGeneration();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute GENERATION__COUNT = eINSTANCE.getGeneration_Count();

		/**
		 * The meta object literal for the '<em><b>Base Model</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute GENERATION__BASE_MODEL = eINSTANCE.getGeneration_BaseModel();

		/**
		 * The meta object literal for the '<em><b>Hw Models</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute GENERATION__HW_MODELS = eINSTANCE.getGeneration_HwModels();

		/**
		 * The meta object literal for the '<em><b>Os Models</b></em>' attribute list feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute GENERATION__OS_MODELS = eINSTANCE.getGeneration_OsModels();

		/**
		 * The meta object literal for the '<em><b>Sw Model</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute GENERATION__SW_MODEL = eINSTANCE.getGeneration_SwModel();

		/**
		 * The meta object literal for the '<em><b>Output Folder</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute GENERATION__OUTPUT_FOLDER = eINSTANCE.getGeneration_OutputFolder();

		/**
		 * The meta object literal for the '<em><b>Activations</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference GENERATION__ACTIVATIONS = eINSTANCE.getGeneration_Activations();

		/**
		 * The meta object literal for the '<em><b>Labels</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference GENERATION__LABELS = eINSTANCE.getGeneration_Labels();

		/**
		 * The meta object literal for the '<em><b>Runnables</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference GENERATION__RUNNABLES = eINSTANCE.getGeneration_Runnables();

		/**
		 * The meta object literal for the '<em><b>Semaphores</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference GENERATION__SEMAPHORES = eINSTANCE.getGeneration_Semaphores();

		/**
		 * The meta object literal for the '<em><b>Tasks</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference GENERATION__TASKS = eINSTANCE.getGeneration_Tasks();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationPropertiesImpl <em>Activation Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationPropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getActivationProperties()
		 * @generated
		 */
		EClass ACTIVATION_PROPERTIES = eINSTANCE.getActivationProperties();

		/**
		 * The meta object literal for the '<em><b>Periodic Activation</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ACTIVATION_PROPERTIES__PERIODIC_ACTIVATION = eINSTANCE.getActivationProperties_PeriodicActivation();

		/**
		 * The meta object literal for the '<em><b>Periodic Triangle Shift</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ACTIVATION_PROPERTIES__PERIODIC_TRIANGLE_SHIFT = eINSTANCE.getActivationProperties_PeriodicTriangleShift();

		/**
		 * The meta object literal for the '<em><b>Sporadic Activation</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference ACTIVATION_PROPERTIES__SPORADIC_ACTIVATION = eINSTANCE.getActivationProperties_SporadicActivation();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationImpl <em>Activation</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.ActivationImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getActivation()
		 * @generated
		 */
		EClass ACTIVATION = eINSTANCE.getActivation();

		/**
		 * The meta object literal for the '<em><b>Appearance Probability</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute ACTIVATION__APPEARANCE_PROBABILITY = eINSTANCE.getActivation_AppearanceProbability();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicActivationImpl <em>Periodic Activation</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicActivationImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPeriodicActivation()
		 * @generated
		 */
		EClass PERIODIC_ACTIVATION = eINSTANCE.getPeriodicActivation();

		/**
		 * The meta object literal for the '<em><b>Recurrence</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PERIODIC_ACTIVATION__RECURRENCE = eINSTANCE.getPeriodicActivation_Recurrence();

		/**
		 * The meta object literal for the '<em><b>Offset</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PERIODIC_ACTIVATION__OFFSET = eINSTANCE.getPeriodicActivation_Offset();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicTriangleShiftImpl <em>Periodic Triangle Shift</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.PeriodicTriangleShiftImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPeriodicTriangleShift()
		 * @generated
		 */
		EClass PERIODIC_TRIANGLE_SHIFT = eINSTANCE.getPeriodicTriangleShift();

		/**
		 * The meta object literal for the '<em><b>Clock</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PERIODIC_TRIANGLE_SHIFT__CLOCK = eINSTANCE.getPeriodicTriangleShift_Clock();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TriangleClockImpl <em>Triangle Clock</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.TriangleClockImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getTriangleClock()
		 * @generated
		 */
		EClass TRIANGLE_CLOCK = eINSTANCE.getTriangleClock();

		/**
		 * The meta object literal for the '<em><b>Min start</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TRIANGLE_CLOCK__MIN_START = eINSTANCE.getTriangleClock_Min_start();

		/**
		 * The meta object literal for the '<em><b>Max end</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TRIANGLE_CLOCK__MAX_END = eINSTANCE.getTriangleClock_Max_end();

		/**
		 * The meta object literal for the '<em><b>Shift</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TRIANGLE_CLOCK__SHIFT = eINSTANCE.getTriangleClock_Shift();

		/**
		 * The meta object literal for the '<em><b>Period</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TRIANGLE_CLOCK__PERIOD = eINSTANCE.getTriangleClock_Period();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.SporadicActivationImpl <em>Sporadic Activation</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.SporadicActivationImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSporadicActivation()
		 * @generated
		 */
		EClass SPORADIC_ACTIVATION = eINSTANCE.getSporadicActivation();

		/**
		 * The meta object literal for the '<em><b>Min Value</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SPORADIC_ACTIVATION__MIN_VALUE = eINSTANCE.getSporadicActivation_MinValue();

		/**
		 * The meta object literal for the '<em><b>Max Value Distance</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SPORADIC_ACTIVATION__MAX_VALUE_DISTANCE = eINSTANCE.getSporadicActivation_MaxValueDistance();

		/**
		 * The meta object literal for the '<em><b>Avg Value Distance</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SPORADIC_ACTIVATION__AVG_VALUE_DISTANCE = eINSTANCE.getSporadicActivation_AvgValueDistance();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.RecurrenceImpl <em>Recurrence</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RecurrenceImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRecurrence()
		 * @generated
		 */
		EClass RECURRENCE = eINSTANCE.getRecurrence();

		/**
		 * The meta object literal for the '<em><b>Recurrence Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute RECURRENCE__RECURRENCE_TYPE = eINSTANCE.getRecurrence_RecurrenceType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.LabelPropertiesImpl <em>Label Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.LabelPropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getLabelProperties()
		 * @generated
		 */
		EClass LABEL_PROPERTIES = eINSTANCE.getLabelProperties();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference LABEL_PROPERTIES__COUNT = eINSTANCE.getLabelProperties_Count();

		/**
		 * The meta object literal for the '<em><b>Bit Size</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference LABEL_PROPERTIES__BIT_SIZE = eINSTANCE.getLabelProperties_BitSize();

		/**
		 * The meta object literal for the '<em><b>Per SWC</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference LABEL_PROPERTIES__PER_SWC = eINSTANCE.getLabelProperties_PerSWC();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.RunnablePropertiesImpl <em>Runnable Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RunnablePropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRunnableProperties()
		 * @generated
		 */
		EClass RUNNABLE_PROPERTIES = eINSTANCE.getRunnableProperties();

		/**
		 * The meta object literal for the '<em><b>Runtime Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute RUNNABLE_PROPERTIES__RUNTIME_TYPE = eINSTANCE.getRunnableProperties_RuntimeType();

		/**
		 * The meta object literal for the '<em><b>Instructions Per Runnables</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNABLE_PROPERTIES__INSTRUCTIONS_PER_RUNNABLES = eINSTANCE.getRunnableProperties_InstructionsPerRunnables();

		/**
		 * The meta object literal for the '<em><b>Runnables Per Call Sequence</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNABLE_PROPERTIES__RUNNABLES_PER_CALL_SEQUENCE = eINSTANCE.getRunnableProperties_RunnablesPerCallSequence();

		/**
		 * The meta object literal for the '<em><b>Runnables Per SWC</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNABLE_PROPERTIES__RUNNABLES_PER_SWC = eINSTANCE.getRunnableProperties_RunnablesPerSWC();

		/**
		 * The meta object literal for the '<em><b>Min Statistics Distance</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNABLE_PROPERTIES__MIN_STATISTICS_DISTANCE = eINSTANCE.getRunnableProperties_MinStatisticsDistance();

		/**
		 * The meta object literal for the '<em><b>Max Statistics Distance</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference RUNNABLE_PROPERTIES__MAX_STATISTICS_DISTANCE = eINSTANCE.getRunnableProperties_MaxStatisticsDistance();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphorePropertiesImpl <em>Semaphore Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphorePropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreProperties()
		 * @generated
		 */
		EClass SEMAPHORE_PROPERTIES = eINSTANCE.getSemaphoreProperties();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SEMAPHORE_PROPERTIES__COUNT = eINSTANCE.getSemaphoreProperties_Count();

		/**
		 * The meta object literal for the '<em><b>Priority Ceiling Protocol</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute SEMAPHORE_PROPERTIES__PRIORITY_CEILING_PROTOCOL = eINSTANCE.getSemaphoreProperties_PriorityCeilingProtocol();

		/**
		 * The meta object literal for the '<em><b>Semaphore Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute SEMAPHORE_PROPERTIES__SEMAPHORE_TYPE = eINSTANCE.getSemaphoreProperties_SemaphoreType();

		/**
		 * The meta object literal for the '<em><b>Wait Mode</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute SEMAPHORE_PROPERTIES__WAIT_MODE = eINSTANCE.getSemaphoreProperties_WaitMode();

		/**
		 * The meta object literal for the '<em><b>Semaphore Access</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SEMAPHORE_PROPERTIES__SEMAPHORE_ACCESS = eINSTANCE.getSemaphoreProperties_SemaphoreAccess();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphoreAccessPropertiesImpl <em>Semaphore Access Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.SemaphoreAccessPropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreAccessProperties()
		 * @generated
		 */
		EClass SEMAPHORE_ACCESS_PROPERTIES = eINSTANCE.getSemaphoreAccessProperties();

		/**
		 * The meta object literal for the '<em><b>Per Unit Read Access Count</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SEMAPHORE_ACCESS_PROPERTIES__PER_UNIT_READ_ACCESS_COUNT = eINSTANCE.getSemaphoreAccessProperties_PerUnitReadAccessCount();

		/**
		 * The meta object literal for the '<em><b>Per Unit Write Access Count</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference SEMAPHORE_ACCESS_PROPERTIES__PER_UNIT_WRITE_ACCESS_COUNT = eINSTANCE.getSemaphoreAccessProperties_PerUnitWriteAccessCount();

		/**
		 * The meta object literal for the '<em><b>Request Order</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute SEMAPHORE_ACCESS_PROPERTIES__REQUEST_ORDER = eINSTANCE.getSemaphoreAccessProperties_RequestOrder();

		/**
		 * The meta object literal for the '<em><b>Access Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute SEMAPHORE_ACCESS_PROPERTIES__ACCESS_TYPE = eINSTANCE.getSemaphoreAccessProperties_AccessType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl <em>Task Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.TaskPropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getTaskProperties()
		 * @generated
		 */
		EClass TASK_PROPERTIES = eINSTANCE.getTaskProperties();

		/**
		 * The meta object literal for the '<em><b>Count</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__COUNT = eINSTANCE.getTaskProperties_Count();

		/**
		 * The meta object literal for the '<em><b>Load</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__LOAD = eINSTANCE.getTaskProperties_Load();

		/**
		 * The meta object literal for the '<em><b>Per Task Group</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__PER_TASK_GROUP = eINSTANCE.getTaskProperties_PerTaskGroup();

		/**
		 * The meta object literal for the '<em><b>Mta</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__MTA = eINSTANCE.getTaskProperties_Mta();

		/**
		 * The meta object literal for the '<em><b>Deadline Factor</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__DEADLINE_FACTOR = eINSTANCE.getTaskProperties_DeadlineFactor();

		/**
		 * The meta object literal for the '<em><b>Call Sequences Between Schedule Points</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS = eINSTANCE.getTaskProperties_CallSequencesBetweenSchedulePoints();

		/**
		 * The meta object literal for the '<em><b>Call Graphs</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference TASK_PROPERTIES__CALL_GRAPHS = eINSTANCE.getTaskProperties_CallGraphs();

		/**
		 * The meta object literal for the '<em><b>Mapping Determination</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute TASK_PROPERTIES__MAPPING_DETERMINATION = eINSTANCE.getTaskProperties_MappingDetermination();

		/**
		 * The meta object literal for the '<em><b>Priority Determination</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute TASK_PROPERTIES__PRIORITY_DETERMINATION = eINSTANCE.getTaskProperties_PriorityDetermination();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.CallGraphPropertiesImpl <em>Call Graph Properties</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.CallGraphPropertiesImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getCallGraphProperties()
		 * @generated
		 */
		EClass CALL_GRAPH_PROPERTIES = eINSTANCE.getCallGraphProperties();

		/**
		 * The meta object literal for the '<em><b>Signal Domain Coverage</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference CALL_GRAPH_PROPERTIES__SIGNAL_DOMAIN_COVERAGE = eINSTANCE.getCallGraphProperties_SignalDomainCoverage();

		/**
		 * The meta object literal for the '<em><b>Call Sequence Usage</b></em>' containment reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference CALL_GRAPH_PROPERTIES__CALL_SEQUENCE_USAGE = eINSTANCE.getCallGraphProperties_CallSequenceUsage();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.DistributionImpl <em>Distribution</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.DistributionImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getDistribution()
		 * @generated
		 */
		EClass DISTRIBUTION = eINSTANCE.getDistribution();

		/**
		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DISTRIBUTION__TYPE = eINSTANCE.getDistribution_Type();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerDistributionImpl <em>Integer Distribution</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerDistributionImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getIntegerDistribution()
		 * @generated
		 */
		EClass INTEGER_DISTRIBUTION = eINSTANCE.getIntegerDistribution();

		/**
		 * The meta object literal for the '<em><b>Min</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_DISTRIBUTION__MIN = eINSTANCE.getIntegerDistribution_Min();

		/**
		 * The meta object literal for the '<em><b>Avg</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_DISTRIBUTION__AVG = eINSTANCE.getIntegerDistribution_Avg();

		/**
		 * The meta object literal for the '<em><b>Max</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_DISTRIBUTION__MAX = eINSTANCE.getIntegerDistribution_Max();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerTimeDistributionImpl <em>Integer Time Distribution</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.IntegerTimeDistributionImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getIntegerTimeDistribution()
		 * @generated
		 */
		EClass INTEGER_TIME_DISTRIBUTION = eINSTANCE.getIntegerTimeDistribution();

		/**
		 * The meta object literal for the '<em><b>Unit</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute INTEGER_TIME_DISTRIBUTION__UNIT = eINSTANCE.getIntegerTimeDistribution_Unit();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.PercentageDistributionImpl <em>Percentage Distribution</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.PercentageDistributionImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPercentageDistribution()
		 * @generated
		 */
		EClass PERCENTAGE_DISTRIBUTION = eINSTANCE.getPercentageDistribution();

		/**
		 * The meta object literal for the '<em><b>Min Percentage</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PERCENTAGE_DISTRIBUTION__MIN_PERCENTAGE = eINSTANCE.getPercentageDistribution_MinPercentage();

		/**
		 * The meta object literal for the '<em><b>Avg Percentage</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PERCENTAGE_DISTRIBUTION__AVG_PERCENTAGE = eINSTANCE.getPercentageDistribution_AvgPercentage();

		/**
		 * The meta object literal for the '<em><b>Max Percentage</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PERCENTAGE_DISTRIBUTION__MAX_PERCENTAGE = eINSTANCE.getPercentageDistribution_MaxPercentage();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.DoubleDistributionImpl <em>Double Distribution</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.DoubleDistributionImpl
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getDoubleDistribution()
		 * @generated
		 */
		EClass DOUBLE_DISTRIBUTION = eINSTANCE.getDoubleDistribution();

		/**
		 * The meta object literal for the '<em><b>Min</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DOUBLE_DISTRIBUTION__MIN = eINSTANCE.getDoubleDistribution_Min();

		/**
		 * The meta object literal for the '<em><b>Avg</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DOUBLE_DISTRIBUTION__AVG = eINSTANCE.getDoubleDistribution_Avg();

		/**
		 * The meta object literal for the '<em><b>Max</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute DOUBLE_DISTRIBUTION__MAX = eINSTANCE.getDoubleDistribution_Max();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType <em>Recurrence Type</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRecurrenceType()
		 * @generated
		 */
		EEnum RECURRENCE_TYPE = eINSTANCE.getRecurrenceType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType <em>Runtime Type</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getRuntimeType()
		 * @generated
		 */
		EEnum RUNTIME_TYPE = eINSTANCE.getRuntimeType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder <em>Semaphore Request Order</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreRequestOrder()
		 * @generated
		 */
		EEnum SEMAPHORE_REQUEST_ORDER = eINSTANCE.getSemaphoreRequestOrder();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType <em>Semaphore Access Type</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreAccessType()
		 * @generated
		 */
		EEnum SEMAPHORE_ACCESS_TYPE = eINSTANCE.getSemaphoreAccessType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType <em>Semaphore Type</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getSemaphoreType()
		 * @generated
		 */
		EEnum SEMAPHORE_TYPE = eINSTANCE.getSemaphoreType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.WaitModes <em>Wait Modes</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.WaitModes
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getWaitModes()
		 * @generated
		 */
		EEnum WAIT_MODES = eINSTANCE.getWaitModes();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.DistributionType <em>Distribution Type</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.DistributionType
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getDistributionType()
		 * @generated
		 */
		EEnum DISTRIBUTION_TYPE = eINSTANCE.getDistributionType();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms <em>Process Mapping Algorithms</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getProcessMappingAlgorithms()
		 * @generated
		 */
		EEnum PROCESS_MAPPING_ALGORITHMS = eINSTANCE.getProcessMappingAlgorithms();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm <em>Priority Determination Algorithm</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getPriorityDeterminationAlgorithm()
		 * @generated
		 */
		EEnum PRIORITY_DETERMINATION_ALGORITHM = eINSTANCE.getPriorityDeterminationAlgorithm();

		/**
		 * The meta object literal for the '{@link org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit <em>Time Unit</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit
		 * @see org.eclipse.app4mc.amalthea.generator.configuration.impl.RTMGCPackageImpl#getTimeUnit()
		 * @generated
		 */
		EEnum TIME_UNIT = eINSTANCE.getTimeUnit();

	}

} //RTMGCPackage
