blob: 0de27cdd6dfde33e7978848edebbf871fabb642b [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 (inspired by Horacio Hoyos' prototype)
******************************************************************************/
package org.eclipse.qvtd.compiler.internal.qvts2qvts.partitioner;
import java.util.Set;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.checks.CheckedCondition;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.checks.CheckedConditionAnalysis;
import org.eclipse.qvtd.compiler.internal.qvts2qvts.checks.ConstantTargetCheckedCondition;
import org.eclipse.qvtd.pivot.qvtschedule.NavigableEdge;
import org.eclipse.qvtd.pivot.qvtschedule.SuccessEdge;
/**
* A SelfCyclicFallibilityAnalysis provides the FallibilityAnalysis for a single partition cycle.
*/
public class SelfCyclicFallibilityAnalysis extends AbstractFallibilityAnalysis
{
protected class SelfCyclicCheckedConditionVisitor extends AbstractCheckedConditionVisitor
{
@Override
public @NonNull Boolean visitConstantTargetCheckedCondition(@NonNull ConstantTargetCheckedCondition constantTargetCheckedCondition) {
NavigableEdge predicateEdge = constantTargetCheckedCondition.getPredicateEdge();
if (!(predicateEdge instanceof SuccessEdge)) {
return false;
}
if (checkedSuccessHeadEdges.contains(predicateEdge)) {
return true;
}
if (realizedSuccessHeadEdges.contains(predicateEdge)) {
return true;
}
if (predicatedSuccessNonHeadEdges.contains(predicateEdge)) {
return true;
}
if (speculatedSuccessNonHeadEdges.contains(predicateEdge)) {
return true;
}
return false;
}
}
public SelfCyclicFallibilityAnalysis(@NonNull MappingPartitionAnalysis<?> partitionAnalysis) {
super(partitionAnalysis);
}
@Override
public boolean isInfallible() {
analyzeSuccessEdges(partition);
SelfCyclicCheckedConditionVisitor visitor = new SelfCyclicCheckedConditionVisitor();
CheckedConditionAnalysis checkedConditionAnalysis = new CheckedConditionAnalysis((MappingPartitionAnalysis<?>) partitionAnalysis, scheduleManager);
// Set<@NonNull Property> allCheckedProperties = checkedConditionAnalysis.getAllCheckedProperties();
Set<@NonNull CheckedCondition> checkedConditions = checkedConditionAnalysis.computeCheckedConditions();
boolean isInfallible = true;
for (@NonNull CheckedCondition checkedCondition : checkedConditions) {
if (!checkedCondition.accept(visitor)) {
isInfallible = false;
break;
}
}
return isInfallible;
}
@Override
public boolean isTerminating() {
return true;
}
}