blob: 126990cff32b07e4c491c8a6cdce82aa23ea2e2f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 CEA LIST.
*
* 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:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and Implementation
*******************************************************************************/
package org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.generator;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.efm.ecore.formalml.specification.XliaModel;
import org.eclipse.efm.ecore.formalml.common.VisibilityKind;
import org.eclipse.efm.ecore.formalml.datatype.CollectionType;
import org.eclipse.efm.ecore.formalml.datatype.DataType;
import org.eclipse.efm.ecore.formalml.datatype.EnumerationLiteral;
import org.eclipse.efm.ecore.formalml.datatype.EnumerationType;
import org.eclipse.efm.ecore.formalml.expression.Expression;
import org.eclipse.efm.ecore.formalml.infrastructure.Behavior;
import org.eclipse.efm.ecore.formalml.infrastructure.ChannelDirection;
import org.eclipse.efm.ecore.formalml.infrastructure.Connector;
import org.eclipse.efm.ecore.formalml.infrastructure.Machine;
import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfExecution;
import org.eclipse.efm.ecore.formalml.infrastructure.ModelOfInteraction;
import org.eclipse.efm.ecore.formalml.infrastructure.Parameter;
import org.eclipse.efm.ecore.formalml.infrastructure.ParameterSet;
import org.eclipse.efm.ecore.formalml.infrastructure.Port;
import org.eclipse.efm.ecore.formalml.infrastructure.Routine;
import org.eclipse.efm.ecore.formalml.infrastructure.Variable;
import org.eclipse.efm.ecore.formalml.infrastructure.XliaSystem;
import org.eclipse.efm.ecore.formalml.statemachine.Pseudostate;
import org.eclipse.efm.ecore.formalml.statemachine.Region;
import org.eclipse.efm.ecore.formalml.statemachine.State;
import org.eclipse.efm.ecore.formalml.statemachine.Statemachine;
import org.eclipse.efm.ecore.formalml.statemachine.Transition;
import org.eclipse.efm.ecore.formalml.statemachine.Vertex;
import org.eclipse.efm.ecore.formalml.statement.BlockStatement;
import org.eclipse.efm.ecore.formalml.statement.ConditionalBlockStatement;
import org.eclipse.efm.ecore.formalml.statement.IfStatement;
import org.eclipse.efm.ecore.formalml.statement.MetaStatement;
import org.eclipse.efm.formalml.ecore.factory.XLIA_DATATYPE;
import org.eclipse.efm.formalml.ecore.factory.XLIA_EXPRESSION;
import org.eclipse.efm.formalml.ecore.factory.XLIA_INFRA;
import org.eclipse.efm.formalml.ecore.factory.XLIA_STATEMACHINE;
import org.eclipse.efm.formalml.ecore.factory.XLIA_STATEMENT;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.MoccActor;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.MoccChannel;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.MoccPort;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.MoccSystem;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.feature.MoccSystemFeature;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.helper.MoccActorHelper;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.ast.helper.MoccPortHelper;
public class MoccCodeGenerator {
protected boolean CONFORMANCE_PURPOSE;
protected MoccSystem moccSystem;
protected XliaModel xliaModel;
protected XliaSystem xliaSystem;
protected Behavior mainBehavior;
protected Variable varTick;
protected Variable varTickInterval;
protected Variable varTickPeriod;
protected Variable varTimestamp;
protected Variable varCanBeActivate;
public EnumerationType MODE_SET_TYPE;
public EnumerationLiteral MODE_NOMINAL;
public EnumerationLiteral MODE_UNDEFINED;
protected Routine macroReceiveToken;
protected Routine macroReceiveTokenMode;
protected Routine macroJsonTraceHeader;
protected Routine macroJsonTraceBegin;
protected Routine macroJsonTraceBody1;
protected Routine macroJsonTraceBody2;
protected Routine macroJsonTraceEnd;
protected Routine macroJsonTraceFooter;
public MoccCodeGenerator(final MoccSystem moccSystem, final boolean conformance) {
this.CONFORMANCE_PURPOSE = conformance;
this.moccSystem = moccSystem;
this.xliaModel = null;
this.xliaSystem = null;
this.mainBehavior = null;
this.varTick = null;
this.varTickInterval = null;
this.varTickPeriod = null;
this.varTimestamp = null;
this.varCanBeActivate = null;
this.MODE_SET_TYPE = null;
this.MODE_NOMINAL = null;
this.MODE_UNDEFINED = null;
this.macroReceiveToken = null;
this.macroReceiveTokenMode = null;
this.macroJsonTraceHeader = null;
this.macroJsonTraceBegin = null;
this.macroJsonTraceBody1 = null;
this.macroJsonTraceBody2 = null;
this.macroJsonTraceEnd = null;
this.macroJsonTraceFooter = null;
}
public MoccCodeGenerator(final MoccSystem moccSystem) {
this(moccSystem, true);
}
public XliaModel transformModel()
{
// Basic static analysis feature
final MoccSystemFeature moccSystemFeature = this.moccSystem.computeFeature();
if( ! moccSystemFeature.consistency ) {
return null;
}
// Transformation to XLIA
this.xliaModel = XLIA_INFRA.createModel();
this.xliaSystem = XLIA_INFRA.createSystem(this.moccSystem.getName());
this.xliaModel.setSystem( this.xliaSystem );
// MODE SET TYPE
this.MODE_SET_TYPE = XLIA_DATATYPE.addEnum(xliaSystem,
"MODE_SET", new String[] {
this.moccSystem.UNDEFINED.getLiteral(),
this.moccSystem.NOMINAL.getLiteral() });
// VALUE: NOMINAL - UNDEFINED - MODE
this.MODE_NOMINAL = XLIA_DATATYPE.getEnumLiteral(
this.MODE_SET_TYPE, this.moccSystem.NOMINAL.getLiteral());
this.MODE_UNDEFINED = XLIA_DATATYPE.getEnumLiteral(
this.MODE_SET_TYPE, this.moccSystem.UNDEFINED.getLiteral());
// MACRO ROUTINES
this.macroReceiveToken = createReceiveTokenRoutine(this.xliaSystem);
this.macroReceiveTokenMode =
createReceiveTokenModeRoutine(this.xliaSystem);
// TIME CONFIGURATION
this.varTickInterval = XLIA_INFRA.createConstant(
XLIA_DATATYPE.createInteger(), "TICK_INTERVAL",
XLIA_EXPRESSION.createInteger(
moccSystemFeature.tick_interval));
this.xliaSystem.getVariable().add(this.varTickInterval);
this.varTickPeriod = XLIA_INFRA.createConstant(
XLIA_DATATYPE.createInteger(), "TICK_PERIOD",
XLIA_EXPRESSION.createInteger(
moccSystemFeature.tick_period));
this.xliaSystem.getVariable().add(this.varTickPeriod);
this.varTick = XLIA_INFRA.createVariable(
XLIA_DATATYPE.createInteger(),
"tick", XLIA_EXPRESSION.zero());
this.xliaSystem.getVariable().add(this.varTick);
this.varTimestamp = XLIA_INFRA.createVariable(
XLIA_DATATYPE.createInteger(),
"timestamp", XLIA_EXPRESSION.zero());
this.xliaSystem.getVariable().add(this.varTimestamp);
// GENERAL ENABLED ACTIVATION
if( moccSystemFeature.hasUntimed ) {
this.varCanBeActivate = XLIA_INFRA.createVariable(
XLIA_DATATYPE.createBoolean(),
"canBeActivate", XLIA_EXPRESSION.trueValue());
this.xliaSystem.getVariable().add(this.varCanBeActivate);
}
// MACRO TRACE ROUTINES
createJsonTraceRoutine(this.xliaSystem);
// ACTOR TRANSFORMATIONS
for (final MoccActor actor : this.moccSystem.getActor()) {
this.xliaSystem.getMachine().add( transformActor(actor) );
}
// MAIN BEHAVIOR
this.mainBehavior = XLIA_INFRA.createBehavior();
this.xliaSystem.setMain(this.mainBehavior);
// MODEL OF INTERACTION
transformChannel();
// MODEL OF EXECUTION
computeScheduler(moccSystemFeature);
return this.xliaModel;
}
private void createJsonTraceRoutine(final Machine machine) {
// TRACE BEGIN
final ParameterSet parameterSetBegin =
XLIA_INFRA.createParameterSet();
final Parameter kind = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createString(), "kind");
parameterSetBegin.getParameter().add(kind);
final Parameter actor = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createString(), "actor");
parameterSetBegin.getParameter().add(actor);
final Parameter nature = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createString(), "nature");
parameterSetBegin.getParameter().add(nature);
final BlockStatement blockBegin =
XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addTrace(blockBegin,
XLIA_EXPRESSION.createExpression("\n\t\t{"),
XLIA_EXPRESSION.createExpression("\n\t\t\t\"kind\": \""),
XLIA_EXPRESSION.createExpression(kind),
XLIA_EXPRESSION.createExpression("\","),
XLIA_EXPRESSION.createExpression("\n\t\t\t\"tick\": "),
XLIA_EXPRESSION.createExpression(this.varTick),
XLIA_EXPRESSION.createExpression(","),
XLIA_EXPRESSION.createExpression("\n\t\t\t\"timestamp\": "),
XLIA_EXPRESSION.createExpression(this.varTimestamp),
XLIA_EXPRESSION.createExpression(","),
XLIA_EXPRESSION.createExpression("\n\t\t\t\"actor\": \""),
XLIA_EXPRESSION.createExpression(actor),
XLIA_EXPRESSION.createExpression("\","),
XLIA_EXPRESSION.createExpression("\n\t\t\t\"nature\": "),
XLIA_EXPRESSION.createExpression(nature),
XLIA_EXPRESSION.createExpression(","),
XLIA_EXPRESSION.createExpression("\n\t\t\t\"data\": ["));
this.macroJsonTraceBegin = XLIA_INFRA.createMacroRoutine(machine,
"jsonTraceBegin", parameterSetBegin, blockBegin);
// TRACE BODY [ WITH MODE ]
this.macroJsonTraceBody1 =
createJsonTraceBodyRoutine(machine, "jsonTraceBody", "");
this.macroJsonTraceBody2 =
createJsonTraceBodyRoutine(machine, "jsonTraceBodyNext", ",");
// TRACE END
final BlockStatement blockEnd =
XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addTrace(blockEnd,
XLIA_EXPRESSION.createExpression("\n\t\t\t]"),
XLIA_EXPRESSION.createExpression("\n\t\t},"));
this.macroJsonTraceEnd = XLIA_INFRA.createMacroRoutine(
machine, "jsonTraceEnd", null, blockEnd);
}
private Routine createJsonTraceBodyRoutine(final Machine machine,
final String routineName, final String traceSeparator) {
// TRACE BODY [ WITH MODE ]
final ParameterSet parameterSet =
XLIA_INFRA.createParameterSet();
final Parameter channel = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createString(), "aChannel");
parameterSet.getParameter().add(channel);
final Parameter tokenCount = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createRational(), "tokenCount");
parameterSet.getParameter().add(tokenCount);
final BlockStatement block =
XLIA_STATEMENT.createBlockStatement();
final MetaStatement traceStatement = XLIA_STATEMENT.addTrace(block,
XLIA_EXPRESSION.createExpression(traceSeparator + "\n\t\t\t\t{"),
XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"channel\": \""),
XLIA_EXPRESSION.createExpression(channel),
XLIA_EXPRESSION.createExpression("\","),
XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"count\": \""),
XLIA_EXPRESSION.createExpression(tokenCount),
XLIA_EXPRESSION.createExpression("\","));
if( moccSystem.FEATURE.hasModeSelector ) {
final Parameter tokenMode = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createString(), "tokenMode");
parameterSet.getParameter().add(tokenMode);
traceStatement.getOperand().add(
XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"mode\": \""));
traceStatement.getOperand().add(
XLIA_EXPRESSION.createCast(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE),
tokenMode) );
traceStatement.getOperand().add(
XLIA_EXPRESSION.createExpression("\"") );
}
else {
traceStatement.getOperand().add(
XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"mode\": \"" +
this.moccSystem.NOMINAL.getLiteral() + "\"") );
}
traceStatement.getOperand().add(
XLIA_EXPRESSION.createExpression("\n\t\t\t\t}"));
return XLIA_INFRA.createMacroRoutine(
machine, routineName, parameterSet, block);
}
private void invokeJsonTraceBodyConsumptionMode(final boolean isFirst,
final BlockStatement block, final MoccPort port) {
XLIA_STATEMENT.addInvoke(block,
(isFirst ? this.macroJsonTraceBody1
: this.macroJsonTraceBody2),
XLIA_EXPRESSION.createExpression(
port.getChannel().getName()),
XLIA_EXPRESSION.createExpression(
port.HELPER.constTOKEN_RATE),
XLIA_EXPRESSION.createExpression(
port.HELPER.varReceivedMode));
}
private void invokeJsonTraceBodyConsumption(final boolean isFirst,
final BlockStatement block, final MoccPort port) {
XLIA_STATEMENT.addInvoke(block,
(isFirst ? this.macroJsonTraceBody1
: this.macroJsonTraceBody2),
XLIA_EXPRESSION.createExpression(
port.getChannel().getName()),
XLIA_EXPRESSION.createExpression(
port.HELPER.constTOKEN_RATE));
// XLIA_EXPRESSION.createExpression(this.MODE_NOMINAL));
}
private void invokeJsonTraceBodyProductionMode(
final boolean isFirst, final BlockStatement block,
final MoccActor actor, final MoccPort port) {
XLIA_STATEMENT.addInvoke(block,
(isFirst ? this.macroJsonTraceBody1
: this.macroJsonTraceBody2),
XLIA_EXPRESSION.createExpression(
port.getChannel().getName()),
XLIA_EXPRESSION.createExpression(
port.HELPER.constTOKEN_RATE),
XLIA_EXPRESSION.createExpression(
actor.HELPER.varProcessingMode));
}
private void invokeJsonTraceBodyProduction(final boolean isFirst,
final BlockStatement block, final MoccPort port) {
XLIA_STATEMENT.addInvoke(block,
(isFirst ? this.macroJsonTraceBody1
: this.macroJsonTraceBody2),
XLIA_EXPRESSION.createExpression(
port.getChannel().getName()),
XLIA_EXPRESSION.createExpression(
port.HELPER.constTOKEN_RATE));
// XLIA_EXPRESSION.createExpression(this.MODE_NOMINAL));
}
// private void createJsonTraceRoutine(final Machine machine) {
// // TRACE BEGIN
// final ParameterSet parameterSetBegin =
// XLIA_INFRA.createParameterSet();
//
// final Parameter kind = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createString(), "kind");
// parameterSetBegin.getParameter().add(kind);
//
// final Parameter actor = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createString(), "actor");
// parameterSetBegin.getParameter().add(actor);
//
// final Parameter nature = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createString(), "nature");
// parameterSetBegin.getParameter().add(nature);
//
//
// final BlockStatement blockBegin =
// XLIA_STATEMENT.createBlockStatement();
//
// XLIA_STATEMENT.addTrace(blockBegin,
// XLIA_EXPRESSION.createExpression("\n\t\t{"),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\"kind\": \""),
// XLIA_EXPRESSION.createExpression(kind),
// XLIA_EXPRESSION.createExpression("\","),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\"tick\": "),
// XLIA_EXPRESSION.createExpression(this.varTick),
// XLIA_EXPRESSION.createExpression(","),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\"timestamp\": "),
// XLIA_EXPRESSION.createExpression(this.varTimestamp),
// XLIA_EXPRESSION.createExpression(","),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\"actor\": \""),
// XLIA_EXPRESSION.createExpression(actor),
// XLIA_EXPRESSION.createExpression("\","),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\"nature\": "),
// XLIA_EXPRESSION.createExpression(nature),
// XLIA_EXPRESSION.createExpression(","),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\"data\": ["));
//
// this.macroJsonTraceBegin = XLIA_INFRA.createMacroRoutine(machine,
// "jsonTraceBegin", parameterSetBegin, blockBegin);
//
// // TRACE BODY [ WITH MODE ]
// final ParameterSet parameterSet =
// XLIA_INFRA.createParameterSet();
//
// final Parameter separator = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createString(), "separator");
// parameterSet.getParameter().add(separator);
//
// final Parameter channel = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createString(), "aChannel");
// parameterSet.getParameter().add(channel);
//
// final Parameter tokenCount = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createRational(), "tokenCount");
// parameterSet.getParameter().add(tokenCount);
//
// final BlockStatement block =
// XLIA_STATEMENT.createBlockStatement();
//
// final MetaStatement traceStatement = XLIA_STATEMENT.addTrace(block,
// XLIA_EXPRESSION.createExpression(separator),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\t{"),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"channel\": \""),
// XLIA_EXPRESSION.createExpression(channel),
// XLIA_EXPRESSION.createExpression("\","),
// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"count\": \""),
// XLIA_EXPRESSION.createExpression(tokenCount),
// XLIA_EXPRESSION.createExpression("\","));
//
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"mode\": \""),
//// XLIA_EXPRESSION.createCast(
//// XLIA_DATATYPE.createReference(this.MODE_SET_TYPE),
//// tokenMode),
//// XLIA_EXPRESSION.createExpression("\""),
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t}"));
//
// if( moccSystem.FEATURE.hasModeSelector ) {
// final Parameter tokenMode = XLIA_INFRA.createParameter(
// XLIA_DATATYPE.createString(), "tokenMode");
// parameterSet.getParameter().add(tokenMode);
//
// traceStatement.getOperand().add(
// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"mode\": \""));
// traceStatement.getOperand().add(
// XLIA_EXPRESSION.createCast(
// XLIA_DATATYPE.createReference(this.MODE_SET_TYPE),
// tokenMode) );
// traceStatement.getOperand().add(
// XLIA_EXPRESSION.createExpression("\"") );
// }
// else {
// traceStatement.getOperand().add(
// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"mode\": \"" +
// this.moccSystem.NOMINAL.getLiteral() + "\"") );
// }
//
// traceStatement.getOperand().add(
// XLIA_EXPRESSION.createExpression("\n\t\t\t\t}"));
//
// this.macroJsonTraceBody = XLIA_INFRA.createMacroRoutine(
// machine, "jsonTraceBody", parameterSet, block);
//
//// // TRACE BODY WITH DEFAULT NOMINAL MODE
//// final ParameterSet parameterSetNominal =
//// XLIA_INFRA.createParameterSet();
////
//// final Parameter separatorNominal = XLIA_INFRA.createParameter(
//// XLIA_DATATYPE.createString(), "separator");
//// parameterSetNominal.getParameter().add(separatorNominal);
////
//// final Parameter channelNominal = XLIA_INFRA.createParameter(
//// XLIA_DATATYPE.createString(), "aChannel");
//// parameterSetNominal.getParameter().add(channelNominal);
////
//// final Parameter tokenCountNominal = XLIA_INFRA.createParameter(
//// XLIA_DATATYPE.createRational(), "tokenCount");
//// parameterSetNominal.getParameter().add(tokenCountNominal);
////
//// final BlockStatement blockNominal =
//// XLIA_STATEMENT.createBlockStatement();
////
//// XLIA_STATEMENT.addTrace(blockNominal,
//// XLIA_EXPRESSION.createExpression(separatorNominal),
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t{"),
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"channel\": \""),
//// XLIA_EXPRESSION.createExpression(channelNominal),
//// XLIA_EXPRESSION.createExpression("\","),
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"count\": \""),
//// XLIA_EXPRESSION.createExpression(tokenCountNominal),
//// XLIA_EXPRESSION.createExpression("\","),
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t\t\"mode\": \"" +
//// this.moccSystem.NOMINAL.getLiteral() + "\""),
//// XLIA_EXPRESSION.createExpression("\n\t\t\t\t}"));
////
//// this.macroJsonTraceBodyNominal = XLIA_INFRA.createMacroRoutine(machine,
//// "jsonTraceBodyNominal", parameterSetNominal, blockNominal);
//
// // TRACE END
// final BlockStatement blockEnd =
// XLIA_STATEMENT.createBlockStatement();
//
// XLIA_STATEMENT.addTrace(blockEnd,
// XLIA_EXPRESSION.createExpression("\n\t\t\t]"),
// XLIA_EXPRESSION.createExpression("\n\t\t},"));
// this.macroJsonTraceEnd = XLIA_INFRA.createMacroRoutine(
// machine, "jsonTraceEnd", null, blockEnd);
// }
protected Routine createReceiveTokenRoutine(final Machine machine) {
final ParameterSet parameterSet = XLIA_INFRA.createParameterSet();
final Parameter receivedPort = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createInstancePort(), "receivedPort");
parameterSet.getParameter().add(receivedPort);
final Parameter receivedToken = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createRational(), "receivedToken");
parameterSet.getParameter().add(receivedToken);
final Parameter tokenCount = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createRational(), "tokenCount");
parameterSet.getParameter().add(tokenCount);
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addInputCom(block, receivedPort, receivedToken);
XLIA_STATEMENT.addIncrementation(block, tokenCount,
XLIA_EXPRESSION.createExpression(receivedToken));
return XLIA_INFRA.createMacroRoutine(
machine, "receiveToken", parameterSet, block);
}
protected Routine createReceiveTokenModeRoutine(final Machine machine) {
final ParameterSet parameterSet = XLIA_INFRA.createParameterSet();
final Parameter receivedPort = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createInstancePort(), "receivedPort");
parameterSet.getParameter().add(receivedPort);
final Parameter receivedToken = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createRational(), "receivedToken");
parameterSet.getParameter().add(receivedToken);
final Parameter tokenCount = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createRational(), "tokenCount");
parameterSet.getParameter().add(tokenCount);
final Parameter modeParam = XLIA_INFRA.createParameter(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE), "mode");
parameterSet.getParameter().add(modeParam);
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addInputCom(block,
receivedPort, receivedToken, modeParam);
XLIA_STATEMENT.addIncrementation(block, tokenCount,
XLIA_EXPRESSION.createExpression(receivedToken));
return XLIA_INFRA.createMacroRoutine(machine,
"receiveTokenMode", parameterSet, block);
}
public Statemachine transformActor(final MoccActor actor)
{
// Basic static analysis feature
final Statemachine xliaActor =
XLIA_STATEMACHINE.createStatemachine(actor.getName());
actor.HELPER = new MoccActorHelper(actor, xliaActor);
// MODE TYPE
if( moccSystem.FEATURE.hasModeSelector ) {
modeActorDeclaration(actor, actor.HELPER, xliaActor);
}
if( actor.FEATURE.isModeSelector ) {
XLIA_DATATYPE.addEnumLiterals(
this.MODE_SET_TYPE, actor.getSelectionSetLiterals());
actor.HELPER.modeSelectionSet = modeLiterals(
this.MODE_SET_TYPE, actor.getSelectionSetLiterals());
if( actor.FEATURE.isModeProcessor ) {
selectorProcessorActorDeclaration(actor, xliaActor);
}
else {
selectorActorDeclaration(actor, xliaActor);
}
}
else if( actor.FEATURE.isModeProcessor ) {
processorActorDeclaration(actor, xliaActor);
}
// CONSTANT: FREQUENCY
if( actor.FEATURE.isTimed ) {
actor.HELPER.constFREQUENCY = XLIA_INFRA.createConstant(
XLIA_DATATYPE.createInteger(), "FREQUENCY",
XLIA_EXPRESSION.createInteger(actor.getFrequency()));
xliaActor.getVariable().add(actor.HELPER.constFREQUENCY);
}
else {
actor.HELPER.constREPETITION = XLIA_INFRA.createPublicConstant(
XLIA_DATATYPE.createInteger(), "REPETITION",
XLIA_EXPRESSION.createInteger(actor.FEATURE.repetition));
xliaActor.getVariable().add(actor.HELPER.constREPETITION);
// For scheduler
actor.HELPER.varActivationCount =
XLIA_INFRA.createPublicLocaleVariable(
XLIA_DATATYPE.createInteger(),
"activationCount", XLIA_EXPRESSION.zero());
xliaActor.getVariable().add(actor.HELPER.varActivationCount);
}
// VARIABLE: INTEGER TOKEN
if( actor.FEATURE.hasIntegerRate ) {
actor.HELPER.varIntToken = XLIA_INFRA.createLocaleVariable(
XLIA_DATATYPE.createInteger(),
"intToken", XLIA_EXPRESSION.zero());
xliaActor.getVariable().add(actor.HELPER.varIntToken);
}
// VARIABLE: RATIONAL TOKEN
if( actor.FEATURE.hasRationalRate ) {
actor.HELPER.varRatToken = XLIA_INFRA.createLocaleVariable(
XLIA_DATATYPE.createRational(),
"ratToken", XLIA_EXPRESSION.zero());
xliaActor.getVariable().add(actor.HELPER.varRatToken);
}
for( final MoccPort moccPort : actor.getInputPort() ) {
transformInputPort(moccPort, xliaActor);
}
for( final MoccPort moccPort : actor.getOutputPort() ) {
transformOutputPort(moccPort, xliaActor);
}
// MACRO ROUTINES
if( actor.hasInputPort() ) {
computeInitializationBehavior(actor);
computeReceptionBehavior(actor);
computeActivationTestBehavior(actor);
computeConsumptionBehavior(actor);
computeConsumptionTraceBehavior(actor);
}
if( actor.hasOutputPort() ) {
computeProductionBehavior(actor);
}
if( actor.FEATURE.isModeSelector )
{
if( actor.FEATURE.isModeProcessor )
{
// Mode Selector & Processor
transformActor(actor, xliaActor);
}
else {
if( actor.FEATURE.hasInput )
{
// Mode Selector
transformActor(actor, xliaActor);
}
else {
// Mode Selector without input
transformOutputActor(actor, xliaActor);
}
}
}
else if( actor.FEATURE.isModeProcessor )
{
if( actor.FEATURE.hasInput )
{
if( actor.FEATURE.hasOutput )
{
// Mode Processor
transformProcessorActor(actor, xliaActor);
}
else {
// Mode Processor without output
transformInputActor(actor, xliaActor);
}
}
else {
// Mode Processor without input
transformOutputActor(actor, xliaActor);
}
}
else
{
if( actor.FEATURE.hasInput )
{
if( actor.FEATURE.hasOutput )
{
// Regular
transformActor(actor, xliaActor);
}
else {
// Regular without output
transformInputActor(actor, xliaActor);
}
}
else {
// Regular without input
transformOutputActor(actor, xliaActor);
}
}
return xliaActor;
}
public static EnumerationLiteral[] modeLiterals(
final EnumerationType enumeration, final String[] values)
{
final EnumerationLiteral[] literals =
new EnumerationLiteral[values.length];
for (int offset = 0; offset < values.length; offset++) {
literals[offset] =
XLIA_DATATYPE.getEnumLiteral(enumeration, values[offset]);
}
return literals;
}
/**
* create xLIA Port for Token
* @param moccPort
* @param direction
* @param xliaActor
* @param tokenType
* @return
*/
public Port createPortToken(final String name,
final MoccPort moccPort, final ChannelDirection direction,
final Statemachine xliaActor, final DataType tokenType)
{
final String prefix =
(direction == ChannelDirection.INPUT) ? "received": "sent";
final Port xliaPort =
XLIA_INFRA.createPort(name, tokenType, prefix + "Token");
xliaPort.setVisibility(VisibilityKind.PUBLIC);
xliaPort.setDirection(direction);
xliaActor.getPort().add( xliaPort );
return xliaPort;
}
public Port createPortToken(
final MoccPort moccPort, final ChannelDirection direction,
final Statemachine xliaActor, final DataType tokenType)
{
return createPortToken(moccPort.getName(),
moccPort, direction, xliaActor, tokenType);
}
/**
* create xLIA Port for Token and Mode
* @param moccPort
* @param direction
* @param xliaActor
* @param tokenType
* @param modeType
* @return
*/
public Port createPortTokenMode(final String name, final MoccPort moccPort,
final ChannelDirection direction, final Statemachine xliaActor,
final DataType tokenType, final DataType modeType)
{
final String prefix =
(direction == ChannelDirection.INPUT) ? "received": "sent";
final Port xliaPort = XLIA_INFRA.createPort(name,
tokenType, prefix + "Token", modeType, prefix + "Mode");
xliaPort.setVisibility(VisibilityKind.PUBLIC);
xliaPort.setDirection(direction);
xliaActor.getPort().add( xliaPort );
return xliaPort;
}
public Port createPortTokenMode(final MoccPort moccPort,
final ChannelDirection direction, final Statemachine xliaActor,
final DataType tokenType, final DataType modeType)
{
return createPortTokenMode(moccPort.getName(),
moccPort, direction, xliaActor, tokenType, modeType);
}
/**
* OUTPUT PORT -> XLIA
* @param moccPort
* @param xliaActor
*/
public void transformOutputPort(
final MoccPort moccPort, final Statemachine xliaActor)
{
// CONSTANT: TOKEN PRODUCTION
final DataType varType =
XLIA_DATATYPE.createRationalOrInteger(moccPort.isRational());
final String targetActor =
moccPort.getChannel().getInputActor().getName();//.toUpperCase();
final Expression value = moccPort.isRational() ?
XLIA_EXPRESSION.createRational(
moccPort.getRate(), moccPort.getRateDenominator())
: XLIA_EXPRESSION.createInteger(moccPort.getRate());
final Variable constTokenProductionRate =
XLIA_INFRA.createConstant(
varType, "PRODUCTION_TO_" + targetActor, value);
xliaActor.getVariable().add(constTokenProductionRate);
// OUTPUT PORT
final DataType tokenType =
XLIA_DATATYPE.createRationalOrInteger(moccPort.isRational());
Port xliaPort = null;
if( moccSystem.FEATURE.hasModeSelector )
{
final DataType modeType =
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE);
xliaPort = createPortTokenMode(
moccPort.getChannel().getName(), moccPort,
ChannelDirection.OUTPUT, xliaActor, tokenType, modeType);
}
else {
xliaPort = createPortToken(moccPort.getChannel().getName(),
moccPort, ChannelDirection.OUTPUT, xliaActor, tokenType);
}
moccPort.HELPER =
new MoccPortHelper(xliaPort, constTokenProductionRate);
}
/**
* INPUT PORT -> XLIA
* @param moccPort
* @param xliaActor
*/
public void transformInputPort(
final MoccPort moccPort, final Statemachine xliaActor)
{
// CONSTANT: REQUIRED TOKENS RATE
DataType constType =
XLIA_DATATYPE.createRationalOrInteger(moccPort.isRational());
final String sourceActor =
moccPort.getChannel().getOutputActor().getName();
Expression value = moccPort.isInputRational() ?
XLIA_EXPRESSION.createRational(
moccPort.getRate(), moccPort.getRateDenominator())
: XLIA_EXPRESSION.createInteger(moccPort.getRate());
final Variable constREQ = XLIA_INFRA.createConstant(constType,
"REQUIRED_FROM_" + sourceActor/*.toUpperCase()*/, value);
xliaActor.getVariable().add(constREQ);
// CONSTANT: INITIAL TOKEN COUNT
Variable tokenInitialRate = null;
final MoccChannel channel = moccPort.getChannel();
if( channel.hasInitialRate() ) {
constType = XLIA_DATATYPE.createRationalOrInteger(
channel.hasRationalRate());
value = channel.hasRationalRate() ?
XLIA_EXPRESSION.createRational(
channel.getInitialRate(),
channel.getInitialRateDenominator())
: XLIA_EXPRESSION.createInteger(channel.getInitialRate());
tokenInitialRate = XLIA_INFRA.createConstant(constType,
"INITIAL_FROM_" + sourceActor/*.toUpperCase()*/, value);
xliaActor.getVariable().add(tokenInitialRate);
}
// VARIABLE: TOKEN COUNT
final DataType tokenCountType =
XLIA_DATATYPE.createRationalOrInteger(
moccPort.isRationalTokenCount());
final Variable varTokenCount = XLIA_INFRA.createVariable(
tokenCountType, "tokenCount_from_" + sourceActor);
xliaActor.getVariable().add(varTokenCount);
// INPUT PORT
final DataType portTokenType =
XLIA_DATATYPE.createRationalOrInteger(
moccPort.isOutputRational());
final DataType channelTokenType =
XLIA_DATATYPE.createRationalOrInteger(moccPort.isRational());
// moccPort.isOutputRational());
Port xliaPort = null;
Port xliaChannelPort = null;
Variable varReceivedMode = null;
if( moccSystem.FEATURE.hasModeSelector )
{
xliaPort = createPortTokenMode(moccPort,
ChannelDirection.INPUT, xliaActor, portTokenType,
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE));
varReceivedMode = XLIA_INFRA.createVariable(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE),
"receivedMode_from_" + sourceActor);
xliaActor.getVariable().add(varReceivedMode);
if( CONFORMANCE_PURPOSE ) {
xliaChannelPort = createPortTokenMode(
moccPort.getChannel().getName(), moccPort,
// ChannelDirection.INPUT, xliaActor, channelTokenType,
ChannelDirection.OUTPUT, xliaActor, channelTokenType,
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE));
}
}
else {
xliaPort = createPortToken(moccPort,
ChannelDirection.INPUT, xliaActor, portTokenType);
if( CONFORMANCE_PURPOSE ) {
xliaChannelPort = createPortToken(
moccPort.getChannel().getName(), moccPort,
// ChannelDirection.INPUT, xliaActor, channelTokenType);
ChannelDirection.OUTPUT, xliaActor, channelTokenType);
}
}
// Mapping: MoccPort-->PortHelper
moccPort.HELPER = new MoccPortHelper(xliaPort, xliaChannelPort,
tokenInitialRate, varTokenCount, varReceivedMode, constREQ);
}
/**
* CHANNEL -> XLIA
*/
public void transformChannel()
{
final ModelOfInteraction moInteraction =
XLIA_INFRA.createMOI(this.mainBehavior);
if( CONFORMANCE_PURPOSE ) {
final Connector connectorEnv =
XLIA_INFRA.createConnectorEnv("channel_env");
for( final MoccActor actor : this.moccSystem.getActor() ) {
for( final MoccPort moccPort : actor.getInputPort() ) {
// XLIA_INFRA.addConnectorEndInputPoint(connectorEnv,
XLIA_INFRA.addConnectorEndOutputPoint(connectorEnv,
moccPort.actor.HELPER.statemachine,
moccPort.HELPER.xliaChannelPort );
}
}
if( ! connectorEnv.getConnectorEnd().isEmpty() ) {
moInteraction.getConnectors().add( connectorEnv );
}
}
for( final MoccChannel channel : this.moccSystem.getChannel() ) {
final MoccActor outputActor = channel.getOutputActor();
final Connector connector =
XLIA_INFRA.createConnectorFifo(channel.getName(),
outputActor.FEATURE.repetition);
XLIA_INFRA.addConnectorEndOutputPoint(connector,
outputActor.HELPER.statemachine,
channel.getOutputPort().HELPER.xliaPort );
XLIA_INFRA.addConnectorEndInputPoint(connector,
channel.getInputActor().HELPER.statemachine,
channel.getInputPort().HELPER.xliaPort);
moInteraction.getConnectors().add( connector );
}
}
public void computeScheduler(final MoccSystemFeature moccSystemFeature)
{
final ModelOfExecution moExcecution = XLIA_INFRA.createMOE(this.mainBehavior);
// MOE: RUN
final Routine runRoutine =
XLIA_INFRA.createRoutine(XLIA_STATEMENT.OP_RUN);
moExcecution.setRunRoutine(runRoutine);
final BlockStatement blockRun = XLIA_STATEMENT.createBlockStatement();
runRoutine.setBodyBlock(blockRun);
XLIA_STATEMENT.addActivitySchedule(blockRun);
// MOE: SCHEDULE
final Routine scheduleRoutine =
XLIA_INFRA.createRoutine(XLIA_STATEMENT.OP_SCHEDULE);
moExcecution.setScheduleRoutine(scheduleRoutine);
final BlockStatement blockSchedule =
XLIA_STATEMENT.createBlockStatement();
scheduleRoutine.setBodyBlock(blockSchedule);
int activationCount =
moccSystemFeature.tick_period / moccSystemFeature.tick_interval;
if( activationCount > 1 ) {
final IfStatement ifStatement = XLIA_STATEMENT.addIf(blockSchedule);
computeSchedulingActor(moccSystemFeature, ifStatement, 0);
activationCount = activationCount - 1;
for( int index = 1 ; index < activationCount; index++) {
computeSchedulingActor(moccSystemFeature,
XLIA_STATEMENT.addElseIf(ifStatement), index);
}
final BlockStatement elseBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setElseBlock(elseBlock);
computeSchedulingActor(moccSystemFeature, elseBlock, activationCount);
// MOE: RUN
XLIA_STATEMENT.addAssignment(blockRun, this.varTimestamp,
XLIA_EXPRESSION.createExpression(
XLIA_EXPRESSION.OP_PLUS,
this.varTimestamp, this.varTickInterval));
if( moccSystemFeature.hasUntimed ) {
XLIA_STATEMENT.addAssignment(blockRun, this.varTick,
XLIA_EXPRESSION.createExpression(
XLIA_EXPRESSION.OP_PLUS,
this.varTick, this.varTickInterval));
// PERIOD RE-INITIALISATION
final IfStatement ifPeriod = XLIA_STATEMENT.addIf(blockRun);
ifPeriod.setCondition(XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_EQ,
this.varTick, this.varTickPeriod));
final BlockStatement blockReinit =
XLIA_STATEMENT.createBlockStatement();
ifPeriod.setBodyBlock(blockReinit);
// ENABLED ONLY RECEPTION BEFORE RE-INITIALISATION
final BlockStatement blockReception =
XLIA_STATEMENT.createBlockStatement(
blockReinit, XLIA_STATEMENT.OP_SEQUENCE_WEAK);
XLIA_STATEMENT.addAssignment(blockReception,
this.varCanBeActivate,
XLIA_EXPRESSION.falseValue());
for( final MoccActor actor : moccSystem.getActor() ) {
if( actor.FEATURE.hasInput ) {
XLIA_STATEMENT.addActivityRun(blockReception,
actor.HELPER.statemachine);
}
}
XLIA_STATEMENT.addAssignment(blockReception,
this.varCanBeActivate,
XLIA_EXPRESSION.trueValue());
// NEW PERIO INTIALISATION
XLIA_STATEMENT.addAssignment(blockReinit,
this.varTick, XLIA_EXPRESSION.zero());
for( final MoccActor actor : moccSystem.getActor() ) {
if( ! actor.FEATURE.isTimed ) {
XLIA_STATEMENT.addGuard(blockReinit,
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_EQ,
actor.HELPER.statemachine,
actor.HELPER.varActivationCount,
actor.HELPER.constREPETITION));
XLIA_STATEMENT.addAssignment(blockReinit,
actor.HELPER.statemachine,
actor.HELPER.varActivationCount,
XLIA_EXPRESSION.zero());
}
}
}
else {
// Tick Incrementation
XLIA_STATEMENT.addAssignment(blockRun, this.varTick,
XLIA_EXPRESSION.createExpression(
XLIA_EXPRESSION.OP_MODULO,
XLIA_EXPRESSION.createExpression(
XLIA_EXPRESSION.OP_PLUS,
this.varTick, this.varTickInterval),
XLIA_EXPRESSION.createExpression(
this.varTickPeriod)));
}
}
else {
computeSchedulingActor(moccSystemFeature, blockSchedule, 0);
}
}
protected void computeSchedulingActor(
final MoccSystemFeature moccSystemFeature,
final ConditionalBlockStatement ifBlock, final int activationIndex) {
final BlockStatement thenBlock = XLIA_STATEMENT.createBlockStatement();
ifBlock.setBodyBlock(thenBlock);
ifBlock.setCondition(XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_EQ,
this.varTick,
XLIA_EXPRESSION.createInteger(
activationIndex * moccSystemFeature.tick_interval)));
computeSchedulingActor(moccSystemFeature, thenBlock, activationIndex);
}
protected void computeSchedulingActor(
final MoccSystemFeature moccSystemFeature,
final BlockStatement thenBlock, final int activationIndex) {
// int statementCount = 0;
for( final MoccActor actor : moccSystem.getActor() ) {
if( actor.FEATURE.activation[activationIndex] ) {
if( actor.FEATURE.isTimed ) {
XLIA_STATEMENT.addActivityRun(thenBlock,
actor.HELPER.statemachine);
}
else {
XLIA_STATEMENT.addActivityRtc(thenBlock,
actor.HELPER.statemachine);
}
// Increment statementCount
// ++statementCount;
}
}
// if( (statementCount > 1) /*&& (! moccSystemFeature.hasTimed)*/ ) {
// thenBlock.setOp( XLIA_STATEMENT.OP_SEQUENCE_WEAK );
// }
}
////////////////////////////////////////////////////////////////////////////
// Variable Declaration for Mode Selector / Processor Actor
public void modeActorDeclaration(final MoccActor actor,
final MoccActorHelper actorSelectorHelper,
final Statemachine xliaActor)
{
// CONSTANT: DEFAULT MODE
actor.HELPER.constDEFAULT_MODE = XLIA_INFRA.createConstant(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE),
"DEFAULT_MODE",
XLIA_EXPRESSION.createExpression(this.MODE_NOMINAL));
xliaActor.getVariable().add(actor.HELPER.constDEFAULT_MODE);
// VARIABLE: MODE UTILS
// actor.HELPER.varProducingMode = XLIA_INFRA.createVariable(
// XLIA_DATATYPE.createReference(
// actorSelectorHelper.MODE_SET_TYPE),
// "producingMode",
// XLIA_EXPRESSION.createExpression(actor.HELPER.constDEFAULT_MODE));
// xliaActor.getVariable().add(actor.HELPER.varProducingMode);
actor.HELPER.varProcessingMode = XLIA_INFRA.createVariable(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE),
"processingMode",
XLIA_EXPRESSION.createExpression(actor.HELPER.constDEFAULT_MODE));
xliaActor.getVariable().add(actor.HELPER.varProcessingMode);
}
public void selectorActorDeclaration(
final MoccActor actor, final Statemachine xliaActor)
{
// CONSTANT: SELECTION SET
final CollectionType constType = XLIA_DATATYPE.createCollectionList(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE), -1);
actor.HELPER.constSELECTIONG_SET =
XLIA_INFRA.createConstant(constType, "SELECTION_SET",
XLIA_EXPRESSION.createCollectionLiterals(
actor.HELPER.modeSelectionSet));
xliaActor.getVariable().add(actor.HELPER.constSELECTIONG_SET);
}
public void processorActorDeclaration (
final MoccActor actor, final Statemachine xliaActor)
{
// VARIABLE: PROCESSING SET
final CollectionType constType = XLIA_DATATYPE.createCollectionList(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE), -1);
actor.HELPER.modeProcessingSet = modeLiterals(this.MODE_SET_TYPE,
actor.getProcessingSetLiterals());
actor.HELPER.constPROCESSING_SET =
XLIA_INFRA.createConstant(constType, "PROCESSING_SET",
XLIA_EXPRESSION.createCollectionLiterals(
actor.HELPER.modeProcessingSet));
xliaActor.getVariable().add(actor.HELPER.constPROCESSING_SET);
}
public void selectorProcessorActorDeclaration(
final MoccActor actor, final Statemachine xliaActor)
{
selectorActorDeclaration(actor, xliaActor);
// VARIABLE: PROCESSING SET
final CollectionType constType = XLIA_DATATYPE.createCollectionList(
XLIA_DATATYPE.createReference(this.MODE_SET_TYPE), -1);
actor.HELPER.modeProcessingSet = modeLiterals(
this.MODE_SET_TYPE, actor.getProcessingSetLiterals());
actor.HELPER.constPROCESSING_SET =
XLIA_INFRA.createConstant(constType, "PROCESSING_SET",
XLIA_EXPRESSION.createCollectionLiterals(
actor.HELPER.modeProcessingSet));
xliaActor.getVariable().add(actor.HELPER.constPROCESSING_SET);
}
////////////////////////////////////////////////////////////////////////////
// Mode Processor Actor
public void transformProcessorActor(
final MoccActor actor, final Statemachine xliaActor)
{
// transformRegularActor(actor, xliaActor); // TODO
final Region region = XLIA_STATEMACHINE.createRegion(xliaActor);
final Pseudostate s_init =
XLIA_STATEMACHINE.createInitialState(region, "s_init");
final State s_idle = XLIA_STATEMACHINE.createState(region, "idle");
final Pseudostate s_activation =
XLIA_STATEMACHINE.createJunctionState(region, "activation");
final BlockStatement blockEnable =
XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addInvoke(blockEnable,
actor.HELPER.macroComputeProcessingMode);
XLIA_STATEMACHINE.setEnable(s_activation, blockEnable);
// Initialisation
computeInitialisationBehavior(actor, s_init, s_idle);
// Reception & Activation
computeReceptionActivationBehavior(actor, region, s_idle, s_activation);
// Processing & Production --> Activation | Passing
computeProcessingBehavior(actor, region, s_activation, s_idle);
}
////////////////////////////////////////////////////////////////////////////
// Regular Actor
public void transformOutputActor(
final MoccActor actor, final Statemachine xliaActor)
{
final Region region = XLIA_STATEMACHINE.createRegion(xliaActor);
final Pseudostate s_init =
XLIA_STATEMACHINE.createInitialState(region, "s_init");
final State s_idle = XLIA_STATEMACHINE.createState(region, "idle");
final Pseudostate s_activation =
XLIA_STATEMACHINE.createJunctionState(region, "activation");
// Initialisation
computeInitialisationBehavior(actor, s_init, s_idle);
//No Reception
// Activation
XLIA_STATEMACHINE.createTransition("t_activate", s_idle, s_activation);
// Production
computeProductionBehavior(actor, s_activation, s_idle);
}
public void transformInputActor(
final MoccActor actor, final Statemachine xliaActor)
{
final Region region = XLIA_STATEMACHINE.createRegion(xliaActor);
final Pseudostate s_init =
XLIA_STATEMACHINE.createInitialState(region, "s_init");
final State s_idle = XLIA_STATEMACHINE.createState(region, "idle");
final Pseudostate s_activation =
XLIA_STATEMACHINE.createJunctionState(region, "activation");
// Initialisation
computeInitialisationBehavior(actor, s_init, s_idle);
// Reception & Activation
computeReceptionActivationBehavior(actor, region, s_idle, s_activation);
// Zero sProduction
computeZeroProductionBehavior(actor, s_activation, s_idle);
}
public void transformActor(
final MoccActor actor, final Statemachine xliaActor)
{
final Region region = XLIA_STATEMACHINE.createRegion(xliaActor);
final Pseudostate s_init =
XLIA_STATEMACHINE.createInitialState(region, "s_init");
final State s_idle = XLIA_STATEMACHINE.createState(region, "idle");
final Pseudostate s_activation =
XLIA_STATEMACHINE.createJunctionState(region, "activation");
if( moccSystem.FEATURE.hasModeSelector && actor.FEATURE.hasInput ) {
final BlockStatement blockEnable =
XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addInvoke(blockEnable,
actor.HELPER.macroComputeProcessingMode);
XLIA_STATEMACHINE.setEnable(s_activation, blockEnable);
}
// Initialisation
computeInitialisationBehavior(actor, s_init, s_idle);
// Reception & Activation
computeReceptionActivationBehavior(actor, region, s_idle, s_activation);
// Production
computeProductionBehavior(actor, s_activation, s_idle);
}
/**
* Initialisation Behavior
* @param actor
* @param s_init
* @param s_idle
*/
protected void computeInitialisationBehavior(
final MoccActor actor, final Pseudostate s_init, final State s_idle)
{
final Transition transition =
XLIA_STATEMACHINE.createTransition("t_init", s_init, s_idle);
if( actor.HELPER.macroInitialization != null ) {
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
transition.setBehavior(block);
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroInitialization);
}
}
/**
* Reception Activation Behavior
* @param actor
* @param region
* @param s_idle
* @param s_activation
*/
protected void computeReceptionActivationBehavior(
final MoccActor actor, final Region region,
final State s_idle, final Pseudostate s_activation)
{
// receiving Pseudostate
final Pseudostate s_receiving =
XLIA_STATEMACHINE.createJunctionState(region, "receiving");
// Activation
computeActivationBehavior(actor, s_idle, s_activation);
computeActivationBehavior(actor, s_receiving, s_activation);
// Reception
computeReceptionTransition(actor,
-1 /*else*/, s_idle, s_receiving);
computeReceptionTransition(actor,
1 /*priority*/, s_receiving, s_receiving);
// int priority = 0;
//
// for( final MoccPort moccPort : actor.getInputPort() ) {
// priority = priority + 1;
//
// computeReceptionTransition(actor,
// moccPort, priority, s_idle, s_receiving);
//
// computeReceptionTransition(actor,
// moccPort, priority, s_receiving, s_receiving);
// }
XLIA_STATEMACHINE.createTransitionElse("t_idle", s_receiving, s_idle);
}
protected void computeReceptionTransition(final MoccActor actor,
final int priority, final Vertex source, final Vertex target)
{
final Transition transition = XLIA_STATEMACHINE.createTransition(
"t_reception", priority, source, target);
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroReception);
transition.setBehavior(block);
}
// protected void computeReceptionTransition(
// final MoccActor actor, final MoccPort moccPort,
// final int priority, final Vertex source, final Vertex target)
// {
// final Transition transition = XLIA_STATEMACHINE.createTransition(
// "t_receive_" + moccPort.getName(), priority, source, target);
//
// final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
//
// final Variable vaReceivedToken = moccPort.isOutputRational() ?
// actor.HELPER.varRatToken : actor.HELPER.varIntToken;
//
// if( moccPort.isInputMode() ) {
// XLIA_STATEMENT.addInvoke(block,
// actor.getSelector().HELPER.macroReceiveTokenMode,
// moccPort.HELPER.xliaPort, vaReceivedToken,
// moccPort.HELPER.varReceivedModeTokenCount,
// moccPort.HELPER.varReceivedMode);
// }
// else {
// XLIA_STATEMENT.addInvoke(block,
// this.macroReceiveToken, moccPort.HELPER.xliaPort,
// vaReceivedToken, moccPort.HELPER.varReceivedModeTokenCount);
// }
//
// transition.setBehavior(block);
// }
protected void computeProcessingBehavior(
final MoccActor actor, final Region region,
final Pseudostate s_activation, final State s_idle)
{
// Processing --> Activation
final Pseudostate s_processing =
XLIA_STATEMACHINE.createJunctionState(region, "processing");
final Transition t_activate = XLIA_STATEMACHINE.createTransition(
"t_process", s_activation, s_processing);
final BlockStatement blockProcess =
XLIA_STATEMENT.createBlockStatement();
t_activate.setBehavior(blockProcess);
XLIA_STATEMENT.addInvoke(blockProcess,
actor.HELPER.macroActivationProcessTest);
// Processing --> Passing
final Pseudostate s_passing =
XLIA_STATEMACHINE.createJunctionState(region, "passing");
final Transition t_pass = XLIA_STATEMACHINE.createTransitionElse(
"t_pass", s_activation, s_passing);
final BlockStatement blockPass = XLIA_STATEMENT.createBlockStatement();
t_pass.setBehavior(blockPass);
// XLIA_STATEMENT.addInvoke(blockPass,
// actor.HELPER.macroActivationPassTest);
// Production
computeProductionBehavior(actor, s_processing, s_idle, "t_running");
// Passing
computeProductionBehavior(actor, s_passing, s_idle, "t_passing");
}
/**
* Activation Behavior
* @param actor
* @param s_idle
* @param s_activation
*/
protected void computeActivationBehavior(final MoccActor actor,
final Vertex s_source, final Pseudostate s_activation)
{
final Transition transition = XLIA_STATEMACHINE.createTransition(
"t_activate", s_source, s_activation);
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
transition.setBehavior(block);
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroActivationTest);
}
/**
* Initialization Behavior
* @param actor
* @param block
*/
protected void computeInitializationBehavior(final MoccActor actor)
{
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
for( final MoccPort moccPort : actor.getInputPort() ) {
final Expression value =
(moccPort.HELPER.constTOKEN_INITIAL_RATE == null)
? XLIA_EXPRESSION.zero()
: XLIA_EXPRESSION.createExpression(
moccPort.HELPER.constTOKEN_INITIAL_RATE);
XLIA_STATEMENT.addAssignment(block,
moccPort.HELPER.varReceivedModeTokenCount, value);
}
actor.HELPER.macroInitialization =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "initialization", block);
}
/**
* Reception Behavior
* @param actor
* @param block
*/
protected void computeReceptionBehavior(final MoccActor actor)
{
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
int statementCount = 0;
for( final MoccPort moccPort : actor.getInputPort() ) {
final Variable vaReceivedToken = moccPort.isOutputRational() ?
actor.HELPER.varRatToken : actor.HELPER.varIntToken;
if( moccSystem.FEATURE.hasModeSelector ) {
XLIA_STATEMENT.addInvoke(block, this.macroReceiveTokenMode,
moccPort.HELPER.xliaPort, vaReceivedToken,
moccPort.HELPER.varReceivedModeTokenCount,
moccPort.HELPER.varReceivedMode);
}
else {
XLIA_STATEMENT.addInvoke(block, this.macroReceiveToken,
moccPort.HELPER.xliaPort, vaReceivedToken,
moccPort.HELPER.varReceivedModeTokenCount);
}
// Increment statementCount
++statementCount;
}
if( statementCount > 1 ) {
// block.setOp(XLIA_STATEMENT.OP_INTERLEAVING);
block.setOp(XLIA_STATEMENT.OP_SEQUENCE_WEAK);
}
actor.HELPER.macroReception =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "reception", block);
}
/**
* Activation Test
* @param actor
* @param block
*/
protected void computeActivationTestBehavior(final MoccActor actor)
{
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
// GENERAL ACTIVATION FLAG
if( moccSystem.FEATURE.hasUntimed ) {
XLIA_STATEMENT.addGuard(block,
XLIA_EXPRESSION.createExpression(this.varCanBeActivate));
}
// REPETITION COUNT / PERIOD CONDITION
if( ! actor.FEATURE.isTimed ) {
XLIA_STATEMENT.addGuard(block,
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_LT,
actor.HELPER.varActivationCount,
actor.HELPER.constREPETITION));
}
// TOKEN RATE CONDITION
for( final MoccPort moccPort : actor.getInputPort() ) {
XLIA_STATEMENT.addGuard(block,
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_GTE,
moccPort.HELPER.varReceivedModeTokenCount,
moccPort.HELPER.constTOKEN_RATE));
}
actor.HELPER.macroActivationTest =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "activationTest", block);
if( actor.FEATURE.isModeProcessor ) {
computeActivationProcessingTestBehavior(actor);
}
else if( moccSystem.FEATURE.hasModeSelector
&& actor.FEATURE.hasOutput ) {
computeActivationPassingMode(actor);
}
}
private void computeActivationPassingMode(final MoccActor actor) {
// Processing Mode Computer
final BlockStatement blockEnable = XLIA_STATEMENT.createBlockStatement();
final List< Expression > undefinedMode = new ArrayList<Expression>();
for( final MoccPort inPort : actor.getInputPort() ) {
undefinedMode.add(
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_EQ,
inPort.HELPER.varReceivedMode,
this.MODE_UNDEFINED));
}
if( ! undefinedMode.isEmpty() ) { // Singleton input mode case
final IfStatement ifStatement = XLIA_STATEMENT.addIf(blockEnable);
// Undefined Mode Passing
ifStatement.setCondition(
XLIA_EXPRESSION.createOR(undefinedMode));
final BlockStatement thenBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setBodyBlock(thenBlock);
XLIA_STATEMENT.addAssignment(thenBlock,
actor.HELPER.varProcessingMode, this.MODE_UNDEFINED);
final BlockStatement elseBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setElseBlock(elseBlock);
XLIA_STATEMENT.addAssignment(elseBlock,
actor.HELPER.varProcessingMode, this.MODE_NOMINAL);
}
actor.HELPER.macroComputeProcessingMode =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine,
"computeProcessingMode", blockEnable);
}
private void computeActivationProcessingMode(final MoccActor actor) {
// Processing Mode Computer
final BlockStatement blockEnable = XLIA_STATEMENT.createBlockStatement();
final List< Expression > identicalModes = new ArrayList<Expression>();
final List< Expression > undefinedMode = new ArrayList<Expression>();
final List< Expression > differentModes = new ArrayList<Expression>();
Variable firstInputMode = null;
for( final MoccPort inPort : actor.getInputPort() ) {
if( inPort.isInputMode() ) {
if( firstInputMode == null ) {
firstInputMode = inPort.HELPER.varReceivedMode;
}
else {
identicalModes.add(
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_EQ, firstInputMode,
inPort.HELPER.varReceivedMode));
differentModes.add(
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_NOT_EQ, firstInputMode,
inPort.HELPER.varReceivedMode));
}
}
undefinedMode.add(
XLIA_EXPRESSION.createRelational(
XLIA_EXPRESSION.OP_EQ,
inPort.HELPER.varReceivedMode,
this.MODE_UNDEFINED));
}
if( firstInputMode == null ) {
// NO INPUT MODE
}
else if( identicalModes.isEmpty() ) { // Singleton input mode case
final IfStatement ifStatement = XLIA_STATEMENT.addIf(blockEnable);
// Undefined Mode Passing
ifStatement.setCondition(
XLIA_EXPRESSION.createOR(undefinedMode));
final BlockStatement thenBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setBodyBlock(thenBlock);
XLIA_STATEMENT.addAssignment(thenBlock,
actor.HELPER.varProcessingMode, this.MODE_UNDEFINED);
// Else Identical i.e. Singleton
final BlockStatement elseBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setElseBlock(elseBlock);
XLIA_STATEMENT.addAssignment(elseBlock,
actor.HELPER.varProcessingMode, firstInputMode);
}
else if( actor.isNominalSingletonProcessingSet() ) {
XLIA_STATEMENT.addAssignment(blockEnable,
actor.HELPER.varProcessingMode, this.MODE_NOMINAL);
}
else {
final IfStatement ifStatement = XLIA_STATEMENT.addIf(blockEnable);
// Identical Mode Processing
ifStatement.setCondition(
XLIA_EXPRESSION.createAND(identicalModes));
final BlockStatement thenBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setBodyBlock(thenBlock);
XLIA_STATEMENT.addAssignment(thenBlock,
actor.HELPER.varProcessingMode, firstInputMode);
// Undefined Mode Passing
final ConditionalBlockStatement undefElseIfStatement =
XLIA_STATEMENT.addElseIf(ifStatement);
undefElseIfStatement.setCondition(
XLIA_EXPRESSION.createOR(undefinedMode));
final BlockStatement undefElseIfBlock =
XLIA_STATEMENT.createBlockStatement();
undefElseIfStatement.setBodyBlock(undefElseIfBlock);
XLIA_STATEMENT.addAssignment(undefElseIfBlock,
actor.HELPER.varProcessingMode, this.MODE_UNDEFINED);
// Different Mode passing
final ConditionalBlockStatement diffElseIfStatement =
XLIA_STATEMENT.addElseIf(ifStatement);
diffElseIfStatement.setCondition(
XLIA_EXPRESSION.createOR(differentModes));
final BlockStatement diffElseIfBlock =
XLIA_STATEMENT.createBlockStatement();
diffElseIfStatement.setBodyBlock(diffElseIfBlock);
XLIA_STATEMENT.addAssignment(diffElseIfBlock,
actor.HELPER.varProcessingMode, this.MODE_UNDEFINED);
// Else Mode passing
final BlockStatement elseBlock =
XLIA_STATEMENT.createBlockStatement();
ifStatement.setElseBlock(elseBlock);
XLIA_STATEMENT.addAssignment(elseBlock,
actor.HELPER.varProcessingMode, this.MODE_UNDEFINED);
}
actor.HELPER.macroComputeProcessingMode =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine,
"computeProcessingMode", blockEnable);
}
private void computeActivationProcessingTestBehavior(final MoccActor actor) {
// Processing Mode Computer
computeActivationProcessingMode(actor);
// Activation PROCESSING
final BlockStatement blockProcess = XLIA_STATEMENT.createBlockStatement();
final List< Expression > processConditions = new ArrayList<Expression>();
for( final EnumerationLiteral literal : actor.HELPER.modeProcessingSet )
{
processConditions.add(
XLIA_EXPRESSION.createRelational(XLIA_EXPRESSION.OP_EQ,
actor.HELPER.varProcessingMode, literal));
}
XLIA_STATEMENT.addGuard(blockProcess,
XLIA_EXPRESSION.createOR(processConditions));
actor.HELPER.macroActivationProcessTest =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine,
"activationProcessTest", blockProcess);
// Activation PASSING
final BlockStatement blockPass = XLIA_STATEMENT.createBlockStatement();
final List< Expression > passConditions = new ArrayList<Expression>();
for( final EnumerationLiteral literal : actor.HELPER.modeProcessingSet )
{
passConditions.add(
XLIA_EXPRESSION.createRelational(XLIA_EXPRESSION.OP_NOT_EQ,
actor.HELPER.varProcessingMode, literal));
}
XLIA_STATEMENT.addGuard(blockPass,
XLIA_EXPRESSION.createAND(passConditions));
actor.HELPER.macroActivationPassTest = XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "activationPassTest", blockPass);
}
/**
* Consumption Behavior
* @param actor
* @param block
*/
protected void computeConsumptionBehavior(final MoccActor actor)
{
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
XLIA_STATEMENT.addInvoke(block, macroJsonTraceBegin,
XLIA_EXPRESSION.createExpression("CONSUMPTION"),
XLIA_EXPRESSION.createExpression(actor.getName()),
XLIA_EXPRESSION.createExpression(actor.getNature()));
boolean isFirst = true;
for( final MoccPort moccPort : actor.getInputPort() ) {
XLIA_STATEMENT.addDecrementation(block,
moccPort.HELPER.varReceivedModeTokenCount,
XLIA_EXPRESSION.createExpression(
moccPort.HELPER.constTOKEN_RATE));
if( moccSystem.FEATURE.hasModeSelector )
{
assert (moccPort.HELPER.varReceivedMode != null) :
"Unexpected a null varReceivedMode for port " +
moccPort.getName();
invokeJsonTraceBodyConsumptionMode(isFirst, block, moccPort);
}
else {
invokeJsonTraceBodyConsumption(isFirst, block, moccPort);
}
isFirst = false;
}
XLIA_STATEMENT.addInvoke(block, macroJsonTraceEnd);
// Increment varActivationCount during consumption for non-timed actor
if( ! actor.FEATURE.isTimed ) {
XLIA_STATEMENT.addAssignment(block,
actor.HELPER.varActivationCount,
XLIA_EXPRESSION.createExpression(
XLIA_EXPRESSION.OP_PLUS,
actor.HELPER.varActivationCount,
XLIA_EXPRESSION.createInteger(1)));
}
actor.HELPER.macroConsumption =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "consumption", block);
}
/**
* Consumption Behavior for trace conformance purpose
* @param actor
* @param block
*/
protected void computeConsumptionTraceBehavior(final MoccActor actor)
{
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
for( final MoccPort moccPort : actor.getInputPort() ) {
// final Variable vaReceivedToken = moccPort.isInputRational() ?
// actor.HELPER.varRatToken : actor.HELPER.varIntToken;
if( moccSystem.FEATURE.hasModeSelector )
{
assert (moccPort.HELPER.varReceivedMode != null) :
"Unexpected a null varReceivedMode for port " +
moccPort.getName();
XLIA_STATEMENT.addOutputCom(block,
moccPort.HELPER.xliaChannelPort,
moccPort.HELPER.constTOKEN_RATE,
moccPort.HELPER.varReceivedMode);
}
else {
XLIA_STATEMENT.addOutputCom(block,
moccPort.HELPER.xliaChannelPort,
moccPort.HELPER.constTOKEN_RATE);
}
// XLIA_STATEMENT.addInputCom(block,
// moccPort.HELPER.xliaChannelPort,
// vaReceivedToken, moccPort.HELPER.varReceivedMode);
// }
// else {
// XLIA_STATEMENT.addInputCom(block,
// moccPort.HELPER.xliaChannelPort, vaReceivedToken);
// }
// XLIA_STATEMENT.addGuard(block,
// XLIA_EXPRESSION.createRelational(XLIA_EXPRESSION.OP_EQ,
// vaReceivedToken, moccPort.HELPER.constTOKEN_RATE));
}
actor.HELPER.macroConsumptionTrace =
XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "consumptionTrace", block);
}
/**
* Production Behavior
* @param actor
* @param block
*/
protected void computeProductionBehavior(final MoccActor actor)
{
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
// Increment varActivationCount during consumption for non-timed actor
// without input port
if( (! actor.FEATURE.isTimed)
&& (actor.HELPER.macroConsumption == null) )
{
XLIA_STATEMENT.addAssignment(block,
actor.HELPER.varActivationCount,
XLIA_EXPRESSION.createExpression(
XLIA_EXPRESSION.OP_PLUS,
actor.HELPER.varActivationCount,
XLIA_EXPRESSION.createInteger(1)));
}
XLIA_STATEMENT.addInvoke(block, macroJsonTraceBegin,
XLIA_EXPRESSION.createExpression("PRODUCTION"),
XLIA_EXPRESSION.createExpression(actor.getName()),
XLIA_EXPRESSION.createExpression(actor.getNature()));
boolean isFirst = true;
if( actor.FEATURE.isModeSelector ) {
final BlockStatement prodBlock =
XLIA_STATEMENT.createBlockStatement(
block, XLIA_STATEMENT.OP_INTERLEAVING);
for( final EnumerationLiteral modeLiteral :
actor.HELPER.modeSelectionSet )
{
XLIA_STATEMENT.addAssignment(prodBlock,
actor.HELPER.varProcessingMode, modeLiteral);
}
for( final MoccPort moccPort : actor.getOutputPort() ) {
XLIA_STATEMENT.addOutputCom(block,
moccPort.HELPER.xliaPort,
moccPort.HELPER.constTOKEN_RATE,
actor.HELPER.varProcessingMode);
invokeJsonTraceBodyProductionMode(
isFirst, block, actor, moccPort);
isFirst = false;
}
}
else {
for( final MoccPort moccPort : actor.getOutputPort() ) {
if( moccSystem.FEATURE.hasModeSelector )
{
XLIA_STATEMENT.addOutputCom(block,
moccPort.HELPER.xliaPort,
moccPort.HELPER.constTOKEN_RATE,
actor.HELPER.varProcessingMode);
invokeJsonTraceBodyProductionMode(
isFirst, block, actor, moccPort);
}
else {
XLIA_STATEMENT.addOutputCom(block,
moccPort.HELPER.xliaPort,
moccPort.HELPER.constTOKEN_RATE);
invokeJsonTraceBodyProduction(isFirst, block, moccPort);
}
isFirst = false;
}
}
XLIA_STATEMENT.addInvoke(block, macroJsonTraceEnd);
actor.HELPER.macroProduction = XLIA_INFRA.createMacroRoutine(
actor.HELPER.statemachine, "production", block);
}
/**
* Production Behavior
* @param actor
* @param s_activation
* @param s_idle
*/
protected void computeProductionBehavior(
final MoccActor actor, final Pseudostate s_activation,
final State s_idle, final String transitionName)
{
final Transition transition = XLIA_STATEMACHINE.createTransition(
transitionName, s_activation, s_idle);
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
transition.setBehavior(block);
if( actor.hasInputPort() ) {
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroConsumption);
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroConsumptionTrace);
}
if( actor.hasOutputPort() ) {
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroProduction);
}
}
protected void computeProductionBehavior(final MoccActor actor,
final Pseudostate s_activation, final State s_idle)
{
computeProductionBehavior(actor, s_activation, s_idle, "t_running");
}
/**
* Zero Production Behavior
* @param actor
* @param s_activation
* @param s_idle
*/
protected void computeZeroProductionBehavior(final MoccActor actor,
final Pseudostate s_activation, final State s_idle)
{
final Transition transition = XLIA_STATEMACHINE.createTransition(
"t_running", s_activation, s_idle);
if( actor.hasInputPort() ) {
final BlockStatement block = XLIA_STATEMENT.createBlockStatement();
transition.setBehavior(block);
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroConsumption);
XLIA_STATEMENT.addInvoke(block, actor.HELPER.macroConsumptionTrace);
}
}
}