blob: 985c614f6531068cc4d385ac523d6ebb33d360aa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.ocl.pivot.utilities.ClassUtil;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.AbstractTransformationAnalysis;
import org.eclipse.qvtd.compiler.internal.qvtb2qvts.RegionHelper;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.Concurrency;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.analysis.PartialRegionAnalysis;
import org.eclipse.qvtd.compiler.internal.utilities.CompilerUtil;
import org.eclipse.qvtd.pivot.qvtschedule.RootPartition;
import org.eclipse.qvtd.pivot.qvtschedule.RootRegion;
public class RootPartitionAnalysis extends AbstractCompositePartitionAnalysis<@NonNull RootPartition>
{
public static @NonNull RootPartitionAnalysis createRootPartitionAnalysis(@NonNull PartitionedTransformationAnalysis partitionedTransformationAnalysis,
@NonNull AbstractTransformationAnalysis transformationAnalysis,
@NonNull String name, @NonNull Map<@NonNull PartialRegionAnalysis<@NonNull PartitionsAnalysis>, @NonNull Set<@NonNull PartialRegionAnalysis<@NonNull PartitionsAnalysis>>> partitionAnalysis2predecessors) {
RootPartition rootPartition = RegionHelper.createRootPartition(name, transformationAnalysis.getScheduleManager());
transformationAnalysis.getRootRegion().setOwnedRootPartition(rootPartition);
RootPartitionAnalysis rootPartitionAnalysis = new RootPartitionAnalysis(partitionedTransformationAnalysis, rootPartition, partitionAnalysis2predecessors);
return rootPartitionAnalysis;
}
private @Nullable RootRegion rootRegion = null;
private RootPartitionAnalysis(@NonNull PartitionedTransformationAnalysis partitionedTransformationAnalysis, @NonNull RootPartition rootPartition,
@NonNull Map<@NonNull PartialRegionAnalysis<@NonNull PartitionsAnalysis>, @NonNull Set<@NonNull PartialRegionAnalysis<@NonNull PartitionsAnalysis>>> partitionAnalysis2predecessors) {
super(partitionedTransformationAnalysis, rootPartition, partitionAnalysis2predecessors);
partitionedTransformationAnalysis.setRootPartitionAnalysis(this);
// partitionedTransformationAnalysis.addPartitionAnalysis(this);
}
@Override
protected @NonNull List<@NonNull Concurrency> createPartitionSchedule() {
List<@NonNull Concurrency> flatPartitionSchedule = new ArrayList<>();
Iterable<@NonNull Concurrency> parallelSchedule = CompilerUtil.computeParallelSchedule(originalPartitionAnalysis2predecessors, TransformationPartitioner.ROOT_SCHEDULE_SUCCESSORS);
if (TransformationPartitioner.ROOT_SCHEDULE.isActive()) {
CompilerUtil.traceSchedule(TransformationPartitioner.ROOT_SCHEDULE, getName(), parallelSchedule);
}
for (@NonNull Iterable<@NonNull PartialRegionAnalysis<@NonNull PartitionsAnalysis>> concurrency : parallelSchedule) {
appendConcurrency(flatPartitionSchedule, concurrency);
}
if (TransformationPartitioner.PARALLEL_SCHEDULE.isActive()) {
CompilerUtil.traceSchedule(TransformationPartitioner.PARALLEL_SCHEDULE, null, flatPartitionSchedule);
}
return flatPartitionSchedule;
}
public @NonNull RootRegion getRootRegion() {
return ClassUtil.nonNullState(rootRegion);
}
public void setRootRegion(@NonNull RootRegion rootRegion) {
this.rootRegion = rootRegion;
}
// @Override
// public boolean isRealized(@NonNull Edge edge) {
// throw new UnsupportedOperationException();
// }
}