blob: e4f8db5043400fb0ef70151791de7a65138f0e24 [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.mocc.ast;
import java.util.Arrays;
import java.util.Vector;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.mocc.ast.feature.MoccSystemFeature;
public class MoccSystem {
protected String name;
public final Vector< MoccMode > MODE_SET;
public final MoccMode UNDEFINED;
public final MoccMode NOMINAL;
protected final Vector< MoccActor > actors;
protected final Vector< MoccChannel > channels;
public MoccSystemFeature FEATURE;
public MoccSystem(final String name,
final String nameModeUndefined, final String literalModeUndefined,
final String nameModeNominal, final String literalModeNominal) {
this.name = name;
this.actors = new Vector<MoccActor>();
this.channels = new Vector<MoccChannel>();
MODE_SET = new Vector<MoccMode>();
this.UNDEFINED = newMode(nameModeUndefined, literalModeUndefined);
this.NOMINAL = newMode(nameModeNominal , literalModeNominal );
this.FEATURE = null;
}
public MoccSystem(final String name) {
this(name, "undefined", "UNDEFINED", "nominal" , "NOMINAL");
}
// GETTERS - SETTERS
public String getName() {
return name;
}
// MODE
public int uniqModeValue = 0;
public MoccMode newMode(final String name, final String literal) {
for (final MoccMode moccMode : MODE_SET) {
if( moccMode.getLiteral().equals(literal) )
{
return moccMode;
}
}
final MoccMode mode = new MoccMode(uniqModeValue++, name, literal);
MODE_SET.add( mode );
return mode;
}
public String[] getModeLiterals() {
final String[] literals = new String[MODE_SET.size()];
for (int index = 0; index < literals.length; index++) {
literals[index] = MODE_SET.elementAt(index).getLiteral();
}
return literals;
}
// Actors
public Vector<MoccActor> getActor() {
return actors;
}
public void addActor(final MoccActor actor) {
actors.add(actor);
}
// Channels
public Vector<MoccChannel> getChannel() {
return channels;
}
public void addChannel(final MoccChannel channel) {
channels.add(channel);
}
public MoccChannel addChannel(final String name, final MoccPort outputPort,
final int initialRate, final int initialRateDenominator,
final MoccMode initialMode, final MoccPort inputPort)
{
return new MoccChannel(this, name, outputPort, initialMode,
initialRate, initialRateDenominator, inputPort);
}
public MoccChannel addChannel(final String name,
final MoccPort outputPort, final int initialRate,
final int initialRateDenominator, final MoccPort inputPort)
{
return new MoccChannel(this, name, outputPort,
initialRate, initialRateDenominator, inputPort);
}
public MoccChannel addChannel(final String name, final MoccPort outputPort,
final int initialRate, final MoccPort inputPort)
{
return new MoccChannel(this, name, outputPort, initialRate, inputPort);
}
// public MoccChannel addChannel(
// final MoccActor outputActor, final String outPortName, final int outRate,
// final MoccActor inputActor, final String inPortName, final int inRate)
// {
// final MoccPort outPort = outputActor.addOutputPort(outPortName, outRate);
//
// final MoccPort inPort = inputActor.addInputPort(inPortName, inRate);
//
// return addChannel(outputActor.getName() + "_" + inputActor.getName(),
// outPort, 0, inPort);
// }
//
// public MoccChannel addChannel(final MoccActor outputActor,
// final String outPortName, final int outRate, final int outRateDenom,
// final MoccActor inputActor, final String inPortName, final int inRate)
// {
// final MoccPort outPort =
// outputActor.addOutputPort(outPortName, outRate, outRateDenom);
//
// final MoccPort inPort = inputActor.addInputPort(inPortName, inRate);
//
// return addChannel(outputActor.getName() + "_" + inputActor.getName(),
// outPort, 0, inPort);
// }
//
// public MoccChannel addChannel(
// final MoccActor outputActor, final String outPortName,
// final int outRate, final MoccActor inputActor,
// final String inPortName, final int inRate, final int inRateDenom)
// {
// final MoccPort outPort = outputActor.addOutputPort(outPortName, outRate);
//
// final MoccPort inPort =
// inputActor.addInputPort(inPortName, inRate, inRateDenom);
//
// return addChannel(outputActor.getName() + "_" + inputActor.getName(),
// outPort, 0, inPort);
// }
//
//
// public MoccChannel addChannel(
// final int initialRate, final int initialRateDenominator,
// final MoccActor outputActor, final String outPortName,
// final int outRate, final int outRateDenominator,
// final MoccActor inputActor, final String inPortName, final int inRate)
// {
// final MoccPort outPort = outputActor.addOutputPort(
// outPortName, outRate, outRateDenominator);
//
// final MoccPort inPort = inputActor.addInputPort(inPortName, inRate);
//
// return addChannel(outputActor.getName() + "_" + inputActor.getName(),
// outPort, initialRate, initialRateDenominator, inPort);
// }
//
// public MoccChannel addChannel(final int initialRate,
// final MoccActor outputActor, final String outPortName,
// final int outRate, final MoccActor inputActor,
// final String inPortName, final int inRate)
// {
// return addChannel(initialRate, 1, outputActor, outPortName,
// outRate, 1, inputActor, inPortName, inRate);
// }
public MoccChannel addChannel(
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(final MoccActor outputActor,
final int outRate, final int outRateDenom,
final MoccActor inputActor, final int inRate)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate, outRateDenom);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(
final MoccActor outputActor, final String outPortName,
final int outRate, final MoccActor inputActor,
final String inPortName, final int inRate, final int inRateDenom)
{
final MoccPort outPort = outputActor.addOutputPort(outPortName, outRate);
final MoccPort inPort =
inputActor.addInputPort(inPortName, inRate, inRateDenom);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate, final int inRateDenom)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate, inRateDenom);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(
final int initialRate, final int initialRateDenominator,
final MoccMode initialMode,
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate, final int inRateDenom)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate, inRateDenom);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, initialMode, inPort);
}
public MoccChannel addChannel(
final int initialRate, final int initialRateDenominator,
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate, final int inRateDenom)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate, inRateDenom);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, inPort);
}
public MoccChannel addChannel(
final int initialRate, final int initialRateDenominator,
final MoccMode initialMode, final MoccActor outputActor,
final int outRate, final int outRateDenominator,
final MoccActor inputActor, final int inRate)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate, outRateDenominator);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, initialMode, inPort);
}
public MoccChannel addChannel(final int initialRate,
final int initialRateDenominator, final MoccActor outputActor,
final int outRate, final int outRateDenominator,
final MoccActor inputActor, final int inRate)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), outRate, outRateDenominator);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), inRate);
return addChannel(outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, inPort);
}
public MoccChannel addChannel(
final int initialRate, final MoccActor outputActor,
final int outRate, final MoccActor inputActor, final int inRate)
{
return addChannel(initialRate, 1,
outputActor, outRate, 1, inputActor, inRate);
}
public MoccChannel addChannel(
final int initialRate, final MoccMode initialMode,
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate)
{
return addChannel(initialRate, 1, initialMode,
outputActor, outRate, 1, inputActor, inRate);
}
// MoccActorFeature
public MoccSystemFeature computeFeature() {
FEATURE = new MoccSystemFeature(this, false);
return FEATURE;
}
public MoccSystemFeature computeFeatureStrict() {
FEATURE = new MoccSystemFeature(this, true);
return FEATURE;
}
// public MoccSystemFeature getFeature() {
// assert (FEATURE != null) : "Unexpected a null MoccSystemFeature";
//
// return FEATURE;
// }
@Override
public String toString() {
final StringBuilder sout = new StringBuilder();
sout.append("// The MOCC system graph\n\n");
sout.append("system ").append(name).append(" {").append("\n\n");
for( final MoccActor actor : getActor() ) {
sout.append(actor.toString()).append('\n');
}
sout.append('\n');
for( final MoccChannel channel : getChannel() ) {
sout.append(channel.toString()).append('\n');
}
sout.append('\n').append("moe {").append('\n');
if( FEATURE != null ) {
sout.append('\t').append("consistency = ")
.append(FEATURE.consistency).append('\n');
sout.append('\t').append("// Causality partial order").append('\n');
sout.append('\t').append("root = [ " );
for( final MoccActor actor : this.FEATURE.rootActor ) {
sout.append(actor.getName()).append(' ');
}
sout.append(']').append('\n');
sout.append('\t').append("leaf = [ " );
for( final MoccActor actor : this.FEATURE.leafActor ) {
sout.append(actor.getName()).append(' ');
}
sout.append(']').append('\n');
sout.append('\t').append("order = [ " );
for( final MoccActor actor : this.actors ) {
sout.append(actor.schedule).append(':')
.append(actor.getName()).append(' ');
}
sout.append(']').append('\n');
int schedule = 0;
sout.append('\t').append("stage = 0:[ " );
for( final MoccActor actor : this.actors ) {
if( actor.schedule == schedule ) {
sout.append(actor.getName()).append(' ');
}
else {
schedule = actor.schedule;
sout.append(']').append('\n')
.append('\t').append("stage = ").append(schedule)
.append(":[ " ).append(actor.getName()).append(' ');
}
}
sout.append(']').append('\n');
sout.append('\n')
.append('\t').append("frequencies = " )
.append(Arrays.toString(FEATURE.frequencies)).append('\n')
.append('\t').append("time = +" )
.append(FEATURE.time_interval).append('\n')
.append('\t').append("period = " )
.append(FEATURE.time_period).append('\n')
.append('\t').append("repetition = " )
.append(Arrays.toString(FEATURE.repetitions))
.append('\n')
.append('\n');
for( final MoccActor actor : getActor() ) {
sout.append('\t').append(actor.FEATURE.strActivation())
.append(' ').append(actor.getName())
.append( actor.isTimed() ? "*" : "" )
.append('\n');
}
sout.append('\n');
}
sout.append('\t').append("schedule {").append('\n');
sout.append('\t').append('}').append('\n');
sout.append('}').append('\n');
sout.append('\n').append('}');
return sout.toString();
}
}