/**
 * *******************************************************************************
 *  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.impl;

import org.eclipse.app4mc.amalthea.generator.configuration.Activation;
import org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.CallGraphProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.Distribution;
import org.eclipse.app4mc.amalthea.generator.configuration.DistributionType;
import org.eclipse.app4mc.amalthea.generator.configuration.DoubleDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.Generation;
import org.eclipse.app4mc.amalthea.generator.configuration.IntegerDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.IntegerTimeDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.PercentageDistribution;
import org.eclipse.app4mc.amalthea.generator.configuration.PeriodicActivation;
import org.eclipse.app4mc.amalthea.generator.configuration.PeriodicTriangleShift;
import org.eclipse.app4mc.amalthea.generator.configuration.PriorityDeterminationAlgorithm;
import org.eclipse.app4mc.amalthea.generator.configuration.ProcessMappingAlgorithms;
import org.eclipse.app4mc.amalthea.generator.configuration.RTMGCFactory;
import org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage;
import org.eclipse.app4mc.amalthea.generator.configuration.Recurrence;
import org.eclipse.app4mc.amalthea.generator.configuration.RecurrenceType;
import org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.RuntimeType;
import org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreAccessType;
import org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreRequestOrder;
import org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreType;
import org.eclipse.app4mc.amalthea.generator.configuration.SporadicActivation;
import org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.TimeUnit;
import org.eclipse.app4mc.amalthea.generator.configuration.TriangleClock;
import org.eclipse.app4mc.amalthea.generator.configuration.WaitModes;

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;
import org.eclipse.emf.ecore.EcorePackage;

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.emf.ecore.xml.type.XMLTypePackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class RTMGCPackageImpl extends EPackageImpl implements RTMGCPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass rtmgcEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass generationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass activationPropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass activationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass periodicActivationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass periodicTriangleShiftEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass triangleClockEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass sporadicActivationEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass recurrenceEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass labelPropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass runnablePropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass semaphorePropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass semaphoreAccessPropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass taskPropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass callGraphPropertiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass distributionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass integerDistributionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass integerTimeDistributionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass percentageDistributionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass doubleDistributionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum recurrenceTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum runtimeTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum semaphoreRequestOrderEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum semaphoreAccessTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum semaphoreTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum waitModesEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum distributionTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum processMappingAlgorithmsEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum priorityDeterminationAlgorithmEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum timeUnitEEnum = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private RTMGCPackageImpl() {
		super(eNS_URI, RTMGCFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link RTMGCPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static RTMGCPackage init() {
		if (isInited) return (RTMGCPackage)EPackage.Registry.INSTANCE.getEPackage(RTMGCPackage.eNS_URI);

		// Obtain or create and register package
		RTMGCPackageImpl theRTMGCPackage = (RTMGCPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof RTMGCPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new RTMGCPackageImpl());

		isInited = true;

		// Initialize simple dependencies
		XMLTypePackage.eINSTANCE.eClass();
		EcorePackage.eINSTANCE.eClass();

		// Create package meta-data objects
		theRTMGCPackage.createPackageContents();

		// Initialize created meta-data
		theRTMGCPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theRTMGCPackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(RTMGCPackage.eNS_URI, theRTMGCPackage);
		return theRTMGCPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getRTMGC() {
		return rtmgcEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRTMGC_Generation() {
		return (EReference)rtmgcEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getGeneration() {
		return generationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getGeneration_Count() {
		return (EAttribute)generationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getGeneration_BaseModel() {
		return (EAttribute)generationEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getGeneration_HwModels() {
		return (EAttribute)generationEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getGeneration_OsModels() {
		return (EAttribute)generationEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getGeneration_SwModel() {
		return (EAttribute)generationEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getGeneration_OutputFolder() {
		return (EAttribute)generationEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getGeneration_Activations() {
		return (EReference)generationEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getGeneration_Labels() {
		return (EReference)generationEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getGeneration_Runnables() {
		return (EReference)generationEClass.getEStructuralFeatures().get(8);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getGeneration_Semaphores() {
		return (EReference)generationEClass.getEStructuralFeatures().get(9);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getGeneration_Tasks() {
		return (EReference)generationEClass.getEStructuralFeatures().get(10);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getActivationProperties() {
		return activationPropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getActivationProperties_PeriodicActivation() {
		return (EReference)activationPropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getActivationProperties_PeriodicTriangleShift() {
		return (EReference)activationPropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getActivationProperties_SporadicActivation() {
		return (EReference)activationPropertiesEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getActivation() {
		return activationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getActivation_AppearanceProbability() {
		return (EAttribute)activationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPeriodicActivation() {
		return periodicActivationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPeriodicActivation_Recurrence() {
		return (EReference)periodicActivationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPeriodicActivation_Offset() {
		return (EReference)periodicActivationEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPeriodicTriangleShift() {
		return periodicTriangleShiftEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPeriodicTriangleShift_Clock() {
		return (EReference)periodicTriangleShiftEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getTriangleClock() {
		return triangleClockEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTriangleClock_Min_start() {
		return (EReference)triangleClockEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTriangleClock_Max_end() {
		return (EReference)triangleClockEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTriangleClock_Shift() {
		return (EReference)triangleClockEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTriangleClock_Period() {
		return (EReference)triangleClockEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getSporadicActivation() {
		return sporadicActivationEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSporadicActivation_MinValue() {
		return (EReference)sporadicActivationEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSporadicActivation_MaxValueDistance() {
		return (EReference)sporadicActivationEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSporadicActivation_AvgValueDistance() {
		return (EReference)sporadicActivationEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getRecurrence() {
		return recurrenceEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getRecurrence_RecurrenceType() {
		return (EAttribute)recurrenceEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getLabelProperties() {
		return labelPropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getLabelProperties_Count() {
		return (EReference)labelPropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getLabelProperties_BitSize() {
		return (EReference)labelPropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getLabelProperties_PerSWC() {
		return (EReference)labelPropertiesEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getRunnableProperties() {
		return runnablePropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getRunnableProperties_RuntimeType() {
		return (EAttribute)runnablePropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunnableProperties_InstructionsPerRunnables() {
		return (EReference)runnablePropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunnableProperties_RunnablesPerCallSequence() {
		return (EReference)runnablePropertiesEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunnableProperties_RunnablesPerSWC() {
		return (EReference)runnablePropertiesEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunnableProperties_MinStatisticsDistance() {
		return (EReference)runnablePropertiesEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunnableProperties_MaxStatisticsDistance() {
		return (EReference)runnablePropertiesEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getSemaphoreProperties() {
		return semaphorePropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSemaphoreProperties_Count() {
		return (EReference)semaphorePropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getSemaphoreProperties_PriorityCeilingProtocol() {
		return (EAttribute)semaphorePropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getSemaphoreProperties_SemaphoreType() {
		return (EAttribute)semaphorePropertiesEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getSemaphoreProperties_WaitMode() {
		return (EAttribute)semaphorePropertiesEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSemaphoreProperties_SemaphoreAccess() {
		return (EReference)semaphorePropertiesEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getSemaphoreAccessProperties() {
		return semaphoreAccessPropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSemaphoreAccessProperties_PerUnitReadAccessCount() {
		return (EReference)semaphoreAccessPropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getSemaphoreAccessProperties_PerUnitWriteAccessCount() {
		return (EReference)semaphoreAccessPropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getSemaphoreAccessProperties_RequestOrder() {
		return (EAttribute)semaphoreAccessPropertiesEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getSemaphoreAccessProperties_AccessType() {
		return (EAttribute)semaphoreAccessPropertiesEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getTaskProperties() {
		return taskPropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_Count() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_Load() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_PerTaskGroup() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_Mta() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_DeadlineFactor() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_CallSequencesBetweenSchedulePoints() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getTaskProperties_CallGraphs() {
		return (EReference)taskPropertiesEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTaskProperties_MappingDetermination() {
		return (EAttribute)taskPropertiesEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getTaskProperties_PriorityDetermination() {
		return (EAttribute)taskPropertiesEClass.getEStructuralFeatures().get(8);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getCallGraphProperties() {
		return callGraphPropertiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getCallGraphProperties_SignalDomainCoverage() {
		return (EReference)callGraphPropertiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getCallGraphProperties_CallSequenceUsage() {
		return (EReference)callGraphPropertiesEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDistribution() {
		return distributionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDistribution_Type() {
		return (EAttribute)distributionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIntegerDistribution() {
		return integerDistributionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerDistribution_Min() {
		return (EAttribute)integerDistributionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerDistribution_Avg() {
		return (EAttribute)integerDistributionEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerDistribution_Max() {
		return (EAttribute)integerDistributionEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIntegerTimeDistribution() {
		return integerTimeDistributionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerTimeDistribution_Unit() {
		return (EAttribute)integerTimeDistributionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPercentageDistribution() {
		return percentageDistributionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPercentageDistribution_MinPercentage() {
		return (EAttribute)percentageDistributionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPercentageDistribution_AvgPercentage() {
		return (EAttribute)percentageDistributionEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPercentageDistribution_MaxPercentage() {
		return (EAttribute)percentageDistributionEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDoubleDistribution() {
		return doubleDistributionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDoubleDistribution_Min() {
		return (EAttribute)doubleDistributionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDoubleDistribution_Avg() {
		return (EAttribute)doubleDistributionEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDoubleDistribution_Max() {
		return (EAttribute)doubleDistributionEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getRecurrenceType() {
		return recurrenceTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getRuntimeType() {
		return runtimeTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getSemaphoreRequestOrder() {
		return semaphoreRequestOrderEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getSemaphoreAccessType() {
		return semaphoreAccessTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getSemaphoreType() {
		return semaphoreTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getWaitModes() {
		return waitModesEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getDistributionType() {
		return distributionTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getProcessMappingAlgorithms() {
		return processMappingAlgorithmsEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getPriorityDeterminationAlgorithm() {
		return priorityDeterminationAlgorithmEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getTimeUnit() {
		return timeUnitEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RTMGCFactory getRTMGCFactory() {
		return (RTMGCFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		rtmgcEClass = createEClass(RTMGC);
		createEReference(rtmgcEClass, RTMGC__GENERATION);

		generationEClass = createEClass(GENERATION);
		createEAttribute(generationEClass, GENERATION__COUNT);
		createEAttribute(generationEClass, GENERATION__BASE_MODEL);
		createEAttribute(generationEClass, GENERATION__HW_MODELS);
		createEAttribute(generationEClass, GENERATION__OS_MODELS);
		createEAttribute(generationEClass, GENERATION__SW_MODEL);
		createEAttribute(generationEClass, GENERATION__OUTPUT_FOLDER);
		createEReference(generationEClass, GENERATION__ACTIVATIONS);
		createEReference(generationEClass, GENERATION__LABELS);
		createEReference(generationEClass, GENERATION__RUNNABLES);
		createEReference(generationEClass, GENERATION__SEMAPHORES);
		createEReference(generationEClass, GENERATION__TASKS);

		activationPropertiesEClass = createEClass(ACTIVATION_PROPERTIES);
		createEReference(activationPropertiesEClass, ACTIVATION_PROPERTIES__PERIODIC_ACTIVATION);
		createEReference(activationPropertiesEClass, ACTIVATION_PROPERTIES__PERIODIC_TRIANGLE_SHIFT);
		createEReference(activationPropertiesEClass, ACTIVATION_PROPERTIES__SPORADIC_ACTIVATION);

		activationEClass = createEClass(ACTIVATION);
		createEAttribute(activationEClass, ACTIVATION__APPEARANCE_PROBABILITY);

		periodicActivationEClass = createEClass(PERIODIC_ACTIVATION);
		createEReference(periodicActivationEClass, PERIODIC_ACTIVATION__RECURRENCE);
		createEReference(periodicActivationEClass, PERIODIC_ACTIVATION__OFFSET);

		periodicTriangleShiftEClass = createEClass(PERIODIC_TRIANGLE_SHIFT);
		createEReference(periodicTriangleShiftEClass, PERIODIC_TRIANGLE_SHIFT__CLOCK);

		triangleClockEClass = createEClass(TRIANGLE_CLOCK);
		createEReference(triangleClockEClass, TRIANGLE_CLOCK__MIN_START);
		createEReference(triangleClockEClass, TRIANGLE_CLOCK__MAX_END);
		createEReference(triangleClockEClass, TRIANGLE_CLOCK__SHIFT);
		createEReference(triangleClockEClass, TRIANGLE_CLOCK__PERIOD);

		sporadicActivationEClass = createEClass(SPORADIC_ACTIVATION);
		createEReference(sporadicActivationEClass, SPORADIC_ACTIVATION__MIN_VALUE);
		createEReference(sporadicActivationEClass, SPORADIC_ACTIVATION__MAX_VALUE_DISTANCE);
		createEReference(sporadicActivationEClass, SPORADIC_ACTIVATION__AVG_VALUE_DISTANCE);

		recurrenceEClass = createEClass(RECURRENCE);
		createEAttribute(recurrenceEClass, RECURRENCE__RECURRENCE_TYPE);

		labelPropertiesEClass = createEClass(LABEL_PROPERTIES);
		createEReference(labelPropertiesEClass, LABEL_PROPERTIES__COUNT);
		createEReference(labelPropertiesEClass, LABEL_PROPERTIES__BIT_SIZE);
		createEReference(labelPropertiesEClass, LABEL_PROPERTIES__PER_SWC);

		runnablePropertiesEClass = createEClass(RUNNABLE_PROPERTIES);
		createEAttribute(runnablePropertiesEClass, RUNNABLE_PROPERTIES__RUNTIME_TYPE);
		createEReference(runnablePropertiesEClass, RUNNABLE_PROPERTIES__INSTRUCTIONS_PER_RUNNABLES);
		createEReference(runnablePropertiesEClass, RUNNABLE_PROPERTIES__RUNNABLES_PER_CALL_SEQUENCE);
		createEReference(runnablePropertiesEClass, RUNNABLE_PROPERTIES__RUNNABLES_PER_SWC);
		createEReference(runnablePropertiesEClass, RUNNABLE_PROPERTIES__MIN_STATISTICS_DISTANCE);
		createEReference(runnablePropertiesEClass, RUNNABLE_PROPERTIES__MAX_STATISTICS_DISTANCE);

		semaphorePropertiesEClass = createEClass(SEMAPHORE_PROPERTIES);
		createEReference(semaphorePropertiesEClass, SEMAPHORE_PROPERTIES__COUNT);
		createEAttribute(semaphorePropertiesEClass, SEMAPHORE_PROPERTIES__PRIORITY_CEILING_PROTOCOL);
		createEAttribute(semaphorePropertiesEClass, SEMAPHORE_PROPERTIES__SEMAPHORE_TYPE);
		createEAttribute(semaphorePropertiesEClass, SEMAPHORE_PROPERTIES__WAIT_MODE);
		createEReference(semaphorePropertiesEClass, SEMAPHORE_PROPERTIES__SEMAPHORE_ACCESS);

		semaphoreAccessPropertiesEClass = createEClass(SEMAPHORE_ACCESS_PROPERTIES);
		createEReference(semaphoreAccessPropertiesEClass, SEMAPHORE_ACCESS_PROPERTIES__PER_UNIT_READ_ACCESS_COUNT);
		createEReference(semaphoreAccessPropertiesEClass, SEMAPHORE_ACCESS_PROPERTIES__PER_UNIT_WRITE_ACCESS_COUNT);
		createEAttribute(semaphoreAccessPropertiesEClass, SEMAPHORE_ACCESS_PROPERTIES__REQUEST_ORDER);
		createEAttribute(semaphoreAccessPropertiesEClass, SEMAPHORE_ACCESS_PROPERTIES__ACCESS_TYPE);

		taskPropertiesEClass = createEClass(TASK_PROPERTIES);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__COUNT);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__LOAD);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__PER_TASK_GROUP);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__MTA);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__DEADLINE_FACTOR);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__CALL_SEQUENCES_BETWEEN_SCHEDULE_POINTS);
		createEReference(taskPropertiesEClass, TASK_PROPERTIES__CALL_GRAPHS);
		createEAttribute(taskPropertiesEClass, TASK_PROPERTIES__MAPPING_DETERMINATION);
		createEAttribute(taskPropertiesEClass, TASK_PROPERTIES__PRIORITY_DETERMINATION);

		callGraphPropertiesEClass = createEClass(CALL_GRAPH_PROPERTIES);
		createEReference(callGraphPropertiesEClass, CALL_GRAPH_PROPERTIES__SIGNAL_DOMAIN_COVERAGE);
		createEReference(callGraphPropertiesEClass, CALL_GRAPH_PROPERTIES__CALL_SEQUENCE_USAGE);

		distributionEClass = createEClass(DISTRIBUTION);
		createEAttribute(distributionEClass, DISTRIBUTION__TYPE);

		integerDistributionEClass = createEClass(INTEGER_DISTRIBUTION);
		createEAttribute(integerDistributionEClass, INTEGER_DISTRIBUTION__MIN);
		createEAttribute(integerDistributionEClass, INTEGER_DISTRIBUTION__AVG);
		createEAttribute(integerDistributionEClass, INTEGER_DISTRIBUTION__MAX);

		integerTimeDistributionEClass = createEClass(INTEGER_TIME_DISTRIBUTION);
		createEAttribute(integerTimeDistributionEClass, INTEGER_TIME_DISTRIBUTION__UNIT);

		percentageDistributionEClass = createEClass(PERCENTAGE_DISTRIBUTION);
		createEAttribute(percentageDistributionEClass, PERCENTAGE_DISTRIBUTION__MIN_PERCENTAGE);
		createEAttribute(percentageDistributionEClass, PERCENTAGE_DISTRIBUTION__AVG_PERCENTAGE);
		createEAttribute(percentageDistributionEClass, PERCENTAGE_DISTRIBUTION__MAX_PERCENTAGE);

		doubleDistributionEClass = createEClass(DOUBLE_DISTRIBUTION);
		createEAttribute(doubleDistributionEClass, DOUBLE_DISTRIBUTION__MIN);
		createEAttribute(doubleDistributionEClass, DOUBLE_DISTRIBUTION__AVG);
		createEAttribute(doubleDistributionEClass, DOUBLE_DISTRIBUTION__MAX);

		// Create enums
		recurrenceTypeEEnum = createEEnum(RECURRENCE_TYPE);
		runtimeTypeEEnum = createEEnum(RUNTIME_TYPE);
		semaphoreRequestOrderEEnum = createEEnum(SEMAPHORE_REQUEST_ORDER);
		semaphoreAccessTypeEEnum = createEEnum(SEMAPHORE_ACCESS_TYPE);
		semaphoreTypeEEnum = createEEnum(SEMAPHORE_TYPE);
		waitModesEEnum = createEEnum(WAIT_MODES);
		distributionTypeEEnum = createEEnum(DISTRIBUTION_TYPE);
		processMappingAlgorithmsEEnum = createEEnum(PROCESS_MAPPING_ALGORITHMS);
		priorityDeterminationAlgorithmEEnum = createEEnum(PRIORITY_DETERMINATION_ALGORITHM);
		timeUnitEEnum = createEEnum(TIME_UNIT);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		periodicActivationEClass.getESuperTypes().add(this.getActivation());
		periodicTriangleShiftEClass.getESuperTypes().add(this.getPeriodicActivation());
		sporadicActivationEClass.getESuperTypes().add(this.getActivation());
		recurrenceEClass.getESuperTypes().add(this.getIntegerTimeDistribution());
		integerDistributionEClass.getESuperTypes().add(this.getDistribution());
		integerTimeDistributionEClass.getESuperTypes().add(this.getIntegerDistribution());
		percentageDistributionEClass.getESuperTypes().add(this.getDistribution());
		doubleDistributionEClass.getESuperTypes().add(this.getDistribution());

		// Initialize classes, features, and operations; add parameters
		initEClass(rtmgcEClass, org.eclipse.app4mc.amalthea.generator.configuration.RTMGC.class, "RTMGC", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRTMGC_Generation(), this.getGeneration(), null, "generation", null, 1, 1, org.eclipse.app4mc.amalthea.generator.configuration.RTMGC.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(generationEClass, Generation.class, "Generation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getGeneration_Count(), theXMLTypePackage.getPositiveInteger(), "count", null, 0, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getGeneration_BaseModel(), theEcorePackage.getEString(), "baseModel", null, 0, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getGeneration_HwModels(), theEcorePackage.getEString(), "hwModels", null, 1, -1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getGeneration_OsModels(), theEcorePackage.getEString(), "osModels", null, 1, -1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getGeneration_SwModel(), theEcorePackage.getEString(), "swModel", null, 0, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getGeneration_OutputFolder(), theEcorePackage.getEString(), "outputFolder", null, 0, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getGeneration_Activations(), this.getActivationProperties(), null, "activations", null, 1, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getGeneration_Labels(), this.getLabelProperties(), null, "labels", null, 1, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getGeneration_Runnables(), this.getRunnableProperties(), null, "runnables", null, 1, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getGeneration_Semaphores(), this.getSemaphoreProperties(), null, "semaphores", null, 1, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getGeneration_Tasks(), this.getTaskProperties(), null, "tasks", null, 1, 1, Generation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(activationPropertiesEClass, ActivationProperties.class, "ActivationProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getActivationProperties_PeriodicActivation(), this.getPeriodicActivation(), null, "periodicActivation", null, 1, 1, ActivationProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActivationProperties_PeriodicTriangleShift(), this.getPeriodicTriangleShift(), null, "periodicTriangleShift", null, 1, 1, ActivationProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActivationProperties_SporadicActivation(), this.getSporadicActivation(), null, "sporadicActivation", null, 1, 1, ActivationProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(activationEClass, Activation.class, "Activation", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActivation_AppearanceProbability(), theXMLTypePackage.getPositiveInteger(), "appearanceProbability", null, 0, 1, Activation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(periodicActivationEClass, PeriodicActivation.class, "PeriodicActivation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPeriodicActivation_Recurrence(), this.getRecurrence(), null, "recurrence", null, 1, 1, PeriodicActivation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPeriodicActivation_Offset(), this.getIntegerTimeDistribution(), null, "offset", null, 1, 1, PeriodicActivation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(periodicTriangleShiftEClass, PeriodicTriangleShift.class, "PeriodicTriangleShift", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getPeriodicTriangleShift_Clock(), this.getTriangleClock(), null, "clock", null, 1, 1, PeriodicTriangleShift.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(triangleClockEClass, TriangleClock.class, "TriangleClock", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getTriangleClock_Min_start(), this.getDoubleDistribution(), null, "min_start", null, 0, 1, TriangleClock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTriangleClock_Max_end(), this.getDoubleDistribution(), null, "max_end", null, 0, 1, TriangleClock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTriangleClock_Shift(), this.getIntegerTimeDistribution(), null, "shift", null, 0, 1, TriangleClock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTriangleClock_Period(), this.getIntegerTimeDistribution(), null, "period", null, 0, 1, TriangleClock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(sporadicActivationEClass, SporadicActivation.class, "SporadicActivation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getSporadicActivation_MinValue(), this.getIntegerTimeDistribution(), null, "minValue", null, 1, 1, SporadicActivation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSporadicActivation_MaxValueDistance(), this.getPercentageDistribution(), null, "maxValueDistance", null, 1, 1, SporadicActivation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSporadicActivation_AvgValueDistance(), this.getPercentageDistribution(), null, "avgValueDistance", null, 1, 1, SporadicActivation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(recurrenceEClass, Recurrence.class, "Recurrence", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRecurrence_RecurrenceType(), this.getRecurrenceType(), "recurrenceType", "random", 0, 1, Recurrence.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(labelPropertiesEClass, LabelProperties.class, "LabelProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getLabelProperties_Count(), this.getIntegerDistribution(), null, "count", null, 1, 1, LabelProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getLabelProperties_BitSize(), this.getIntegerDistribution(), null, "bitSize", null, 1, 1, LabelProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getLabelProperties_PerSWC(), this.getIntegerDistribution(), null, "perSWC", null, 1, 1, LabelProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(runnablePropertiesEClass, RunnableProperties.class, "RunnableProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRunnableProperties_RuntimeType(), this.getRuntimeType(), "runtimeType", "instructionsConst", 1, 1, RunnableProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRunnableProperties_InstructionsPerRunnables(), this.getIntegerDistribution(), null, "instructionsPerRunnables", null, 1, 1, RunnableProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRunnableProperties_RunnablesPerCallSequence(), this.getIntegerDistribution(), null, "runnablesPerCallSequence", null, 1, 1, RunnableProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRunnableProperties_RunnablesPerSWC(), this.getIntegerDistribution(), null, "runnablesPerSWC", null, 1, 1, RunnableProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRunnableProperties_MinStatisticsDistance(), this.getPercentageDistribution(), null, "minStatisticsDistance", null, 1, 1, RunnableProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRunnableProperties_MaxStatisticsDistance(), this.getPercentageDistribution(), null, "maxStatisticsDistance", null, 1, 1, RunnableProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(semaphorePropertiesEClass, SemaphoreProperties.class, "SemaphoreProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getSemaphoreProperties_Count(), this.getIntegerDistribution(), null, "count", null, 1, 1, SemaphoreProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSemaphoreProperties_PriorityCeilingProtocol(), theEcorePackage.getEBoolean(), "priorityCeilingProtocol", null, 0, 1, SemaphoreProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSemaphoreProperties_SemaphoreType(), this.getSemaphoreType(), "semaphoreType", "counting", 1, 1, SemaphoreProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSemaphoreProperties_WaitMode(), this.getWaitModes(), "waitMode", "active waiting", 1, 1, SemaphoreProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSemaphoreProperties_SemaphoreAccess(), this.getSemaphoreAccessProperties(), null, "SemaphoreAccess", null, 1, 1, SemaphoreProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(semaphoreAccessPropertiesEClass, SemaphoreAccessProperties.class, "SemaphoreAccessProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getSemaphoreAccessProperties_PerUnitReadAccessCount(), this.getIntegerDistribution(), null, "perUnitReadAccessCount", null, 1, 1, SemaphoreAccessProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSemaphoreAccessProperties_PerUnitWriteAccessCount(), this.getIntegerDistribution(), null, "perUnitWriteAccessCount", null, 1, 1, SemaphoreAccessProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSemaphoreAccessProperties_RequestOrder(), this.getSemaphoreRequestOrder(), "requestOrder", "none", 1, 1, SemaphoreAccessProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSemaphoreAccessProperties_AccessType(), this.getSemaphoreAccessType(), "accessType", "RandRunnable", 1, 1, SemaphoreAccessProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(taskPropertiesEClass, TaskProperties.class, "TaskProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getTaskProperties_Count(), this.getIntegerDistribution(), null, "count", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTaskProperties_Load(), this.getPercentageDistribution(), null, "load", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTaskProperties_PerTaskGroup(), this.getIntegerDistribution(), null, "perTaskGroup", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTaskProperties_Mta(), this.getIntegerDistribution(), null, "mta", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTaskProperties_DeadlineFactor(), this.getDoubleDistribution(), null, "deadlineFactor", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTaskProperties_CallSequencesBetweenSchedulePoints(), this.getIntegerDistribution(), null, "callSequencesBetweenSchedulePoints", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getTaskProperties_CallGraphs(), this.getCallGraphProperties(), null, "callGraphs", null, 1, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getTaskProperties_MappingDetermination(), this.getProcessMappingAlgorithms(), "mappingDetermination", "Worst Fit Decreasing", 0, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getTaskProperties_PriorityDetermination(), this.getPriorityDeterminationAlgorithm(), "priorityDetermination", "Rate Monotonic", 0, 1, TaskProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(callGraphPropertiesEClass, CallGraphProperties.class, "CallGraphProperties", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getCallGraphProperties_SignalDomainCoverage(), this.getPercentageDistribution(), null, "signalDomainCoverage", null, 1, 1, CallGraphProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getCallGraphProperties_CallSequenceUsage(), this.getPercentageDistribution(), null, "callSequenceUsage", null, 1, 1, CallGraphProperties.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(distributionEClass, Distribution.class, "Distribution", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDistribution_Type(), this.getDistributionType(), "type", "Constant Value", 0, 1, Distribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(integerDistributionEClass, IntegerDistribution.class, "IntegerDistribution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getIntegerDistribution_Min(), theXMLTypePackage.getUnsignedInt(), "min", null, 0, 1, IntegerDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getIntegerDistribution_Avg(), theXMLTypePackage.getUnsignedInt(), "avg", null, 0, 1, IntegerDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getIntegerDistribution_Max(), theXMLTypePackage.getUnsignedInt(), "max", null, 0, 1, IntegerDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(integerTimeDistributionEClass, IntegerTimeDistribution.class, "IntegerTimeDistribution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getIntegerTimeDistribution_Unit(), this.getTimeUnit(), "unit", "ms", 0, 1, IntegerTimeDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(percentageDistributionEClass, PercentageDistribution.class, "PercentageDistribution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPercentageDistribution_MinPercentage(), theEcorePackage.getEDouble(), "minPercentage", null, 0, 1, PercentageDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPercentageDistribution_AvgPercentage(), theEcorePackage.getEDouble(), "avgPercentage", null, 0, 1, PercentageDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPercentageDistribution_MaxPercentage(), theEcorePackage.getEDouble(), "maxPercentage", null, 0, 1, PercentageDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(doubleDistributionEClass, DoubleDistribution.class, "DoubleDistribution", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDoubleDistribution_Min(), theEcorePackage.getEDouble(), "min", null, 0, 1, DoubleDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDoubleDistribution_Avg(), theEcorePackage.getEDouble(), "avg", null, 0, 1, DoubleDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDoubleDistribution_Max(), theEcorePackage.getEDouble(), "max", null, 0, 1, DoubleDistribution.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(recurrenceTypeEEnum, RecurrenceType.class, "RecurrenceType");
		addEEnumLiteral(recurrenceTypeEEnum, RecurrenceType.RANDOM);
		addEEnumLiteral(recurrenceTypeEEnum, RecurrenceType.HARMONIC);

		initEEnum(runtimeTypeEEnum, RuntimeType.class, "RuntimeType");
		addEEnumLiteral(runtimeTypeEEnum, RuntimeType.INSTRUCTIONS_CONST);
		addEEnumLiteral(runtimeTypeEEnum, RuntimeType.INSTRUCTIONS_STATISTICS);

		initEEnum(semaphoreRequestOrderEEnum, SemaphoreRequestOrder.class, "SemaphoreRequestOrder");
		addEEnumLiteral(semaphoreRequestOrderEEnum, SemaphoreRequestOrder.NONE);
		addEEnumLiteral(semaphoreRequestOrderEEnum, SemaphoreRequestOrder.REQUEST_GROUPED);
		addEEnumLiteral(semaphoreRequestOrderEEnum, SemaphoreRequestOrder.NAME_INCREASING);

		initEEnum(semaphoreAccessTypeEEnum, SemaphoreAccessType.class, "SemaphoreAccessType");
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.RWPER_TASK);
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.RWPER_CALL_SEQUENCE);
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.RAND_RUNNABLE);
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.WHOLE_CS);
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.GROUPED_FMLP);
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.WEAK_FMLP);
		addEEnumLiteral(semaphoreAccessTypeEEnum, SemaphoreAccessType.EVA);

		initEEnum(semaphoreTypeEEnum, SemaphoreType.class, "SemaphoreType");
		addEEnumLiteral(semaphoreTypeEEnum, SemaphoreType.BINARY);
		addEEnumLiteral(semaphoreTypeEEnum, SemaphoreType.COUNTING);
		addEEnumLiteral(semaphoreTypeEEnum, SemaphoreType.BOTH);

		initEEnum(waitModesEEnum, WaitModes.class, "WaitModes");
		addEEnumLiteral(waitModesEEnum, WaitModes.POLLING);
		addEEnumLiteral(waitModesEEnum, WaitModes.PARKING);

		initEEnum(distributionTypeEEnum, DistributionType.class, "DistributionType");
		addEEnumLiteral(distributionTypeEEnum, DistributionType.CONST);
		addEEnumLiteral(distributionTypeEEnum, DistributionType.UNIFORM);
		addEEnumLiteral(distributionTypeEEnum, DistributionType.WEIBULL);

		initEEnum(processMappingAlgorithmsEEnum, ProcessMappingAlgorithms.class, "ProcessMappingAlgorithms");
		addEEnumLiteral(processMappingAlgorithmsEEnum, ProcessMappingAlgorithms.WFD);
		addEEnumLiteral(processMappingAlgorithmsEEnum, ProcessMappingAlgorithms.WFI);
		addEEnumLiteral(processMappingAlgorithmsEEnum, ProcessMappingAlgorithms.BFD);
		addEEnumLiteral(processMappingAlgorithmsEEnum, ProcessMappingAlgorithms.BFI);

		initEEnum(priorityDeterminationAlgorithmEEnum, PriorityDeterminationAlgorithm.class, "PriorityDeterminationAlgorithm");
		addEEnumLiteral(priorityDeterminationAlgorithmEEnum, PriorityDeterminationAlgorithm.RM);
		addEEnumLiteral(priorityDeterminationAlgorithmEEnum, PriorityDeterminationAlgorithm.DM);

		initEEnum(timeUnitEEnum, TimeUnit.class, "TimeUnit");
		addEEnumLiteral(timeUnitEEnum, TimeUnit.PS);
		addEEnumLiteral(timeUnitEEnum, TimeUnit.NS);
		addEEnumLiteral(timeUnitEEnum, TimeUnit.US);
		addEEnumLiteral(timeUnitEEnum, TimeUnit.MS);
		addEEnumLiteral(timeUnitEEnum, TimeUnit.S);

		// Create resource
		createResource(eNS_URI);
	}

} //RTMGCPackageImpl
