blob: b114a415ed41c674da46ba6a2aab5d6bb432d1cc [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.io.StringWriter;
import java.util.Arrays;
import java.util.Vector;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.mocc.ast.feature.MoccSystemFeature;
import org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph.util.PrettyPrintWriter;
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;
protected boolean channelWellFormedness;
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>();
this.channelWellFormedness = true;
this.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);
this.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) {
// Check if there is only one channel between 2 actors
if( this.channelWellFormedness ) {
for( final MoccChannel itChannel : channels ) {
if( (itChannel.getInputPort() == channel.getInputPort())
&& (itChannel.getOutputPort() == channel.getOutputPort()) )
{
this.channelWellFormedness = false;
break;
}
else if( itChannel.getInputPort().getName().equals(channel.getInputPort().getName())
&& itChannel.getOutputPort().getName().equals(channel.getOutputPort().getName()) )
{
this.channelWellFormedness = false;
break;
}
}
}
channels.add(channel);
}
public boolean isChannelConsistent() {
return channelWellFormedness;
}
public boolean isWellFormed() {
return channelWellFormedness;
}
public MoccChannel addChannel(final boolean isDeciding,
final String name, final MoccPort outputPort,
final int initialRate, final int initialRateDenominator,
final MoccMode initialMode, final MoccPort inputPort)
{
return new MoccChannel(this, name, isDeciding, outputPort,
initialMode, initialRate, initialRateDenominator, inputPort);
}
public MoccChannel addChannel(final boolean isDeciding, final String name,
final MoccPort outputPort, final int initialRate,
final int initialRateDenominator, final MoccPort inputPort)
{
return new MoccChannel(this, name, isDeciding, outputPort,
initialRate, initialRateDenominator, inputPort);
}
public MoccChannel addChannel(final boolean isDeciding,
final String name, final MoccPort outputPort,
final int initialRate, final MoccPort inputPort)
{
return new MoccChannel(this, name,
isDeciding, outputPort, initialRate, inputPort);
}
// public MoccChannel addChannel(final boolean isDeciding,
// 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 boolean isDeciding, 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 boolean isDeciding,
// 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 boolean isDeciding,
// 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 boolean isDeciding, 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 boolean isDeciding,
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), isDeciding, outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
final MoccActor outputActor,
final int outRate, final int outRateDenom,
final MoccActor inputActor, final int inRate)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), isDeciding, outRate, outRateDenom);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
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, isDeciding, outRate);
final MoccPort inPort = inputActor.addInputPort(
inPortName, isDeciding, inRate, inRateDenom);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate, final int inRateDenom)
{
final MoccPort outPort = outputActor.addOutputPort(
"to" + inputActor.getName(), isDeciding, outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate, inRateDenom);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, 0, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
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(), isDeciding, outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate, inRateDenom);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, initialMode, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
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(), isDeciding, outRate);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate, inRateDenom);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
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(),
isDeciding, outRate, outRateDenominator);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, initialMode, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
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(),
isDeciding, outRate, outRateDenominator);
final MoccPort inPort = inputActor.addInputPort(
"from" + outputActor.getName(), isDeciding, inRate);
return addChannel(isDeciding,
outputActor.getName() + "_" + inputActor.getName(),
outPort, initialRate, initialRateDenominator, inPort);
}
public MoccChannel addChannel(final boolean isDeciding,
final int initialRate, final MoccActor outputActor,
final int outRate, final MoccActor inputActor, final int inRate)
{
return addChannel(isDeciding, initialRate, 1,
outputActor, outRate, 1, inputActor, inRate);
}
public MoccChannel addChannel(final boolean isDeciding,
final int initialRate, final MoccActor outputActor,
final int outRate, final int outRateDenominator,
final MoccActor inputActor, final int inRate)
{
return addChannel(isDeciding, initialRate, 1,
outputActor, outRate, outRateDenominator, inputActor, inRate);
}
public MoccChannel addChannel(final boolean isDeciding,
final int initialRate, final MoccMode initialMode,
final MoccActor outputActor, final int outRate,
final MoccActor inputActor, final int inRate)
{
return addChannel(isDeciding, 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;
// }
public String toAbstract() {
final StringWriter buffer = new StringWriter();
final PrettyPrintWriter writer = new PrettyPrintWriter(buffer);
toAbstract( writer );
return buffer.toString();
}
public PrettyPrintWriter toAbstract(final PrettyPrintWriter writer) {
writer.appendTabEol("// The Polygraph System Graph Abstract");
writer.appendTab("system ").append(name).appendEol(" {");
writer
.appendTab2("well-formed = ").appendEol(isWellFormed())
.appendTab2("actor = ").appendEol(getActor().size())
.appendTab2("channel = ").append(getChannel().size())
.appendTab2("channel OK? = ").appendEol(isChannelConsistent());
if( FEATURE != null ) {
writer
.appendTab2("timed = ").appendEol(FEATURE.timedActorCount)
.appendTab2("phase = ").appendEol(FEATURE.phaseActorCount)
.appendTab2("consistency = ").appendEol(FEATURE.consistency);
if( FEATURE.consistency ) {
writer
.appendTab2("repetition = " )
.appendEol(Arrays.toString(FEATURE.repetitions))
.appendTab2("firings = " ).appendEol(FEATURE.firings)
.appendTab2("frequencies = " ).appendEol(FEATURE.strFrequencies())
.appendTab2("tick_frequency = ").appendEol(FEATURE.tick_frequency)
.appendTab2("tick_step = +").appendEol(FEATURE.tick_step)
.appendTab2("period = " ).appendEol(FEATURE.period) // time resolution
.appendTab2("hyperperiod = " ).appendEol(FEATURE.hyperperiod); // live resolution
writer.appendEol();
for( final MoccActor actor : getActor() ) {
writer.appendTab2(actor.FEATURE.strActivation())
.append(' ').append(actor.getName())
.appendEol( actor.isTimed() ? "*" : "" );
}
}
}
writer.appendTabEol('}');
return writer;
}
@Override
public String toString() {
final StringWriter buffer = new StringWriter();
final PrettyPrintWriter writer = new PrettyPrintWriter(buffer);
toWriter( writer );
return buffer.toString();
}
public PrettyPrintWriter toWriter(final PrettyPrintWriter writer) {
writer.appendTabEol("// The MOCC system graph");
writer.appendTab("system ").append(name).appendEol2(" {");
final PrettyPrintWriter writer2 = writer.itab2();
for( final MoccActor actor : getActor() ) {
actor.toWriter(writer2);
}
writer.appendEol();
for( final MoccChannel channel : getChannel() ) {
channel.toWriter(writer2);
}
writer.appendEol();
writer.appendTab2Eol("moe {");
if( FEATURE != null ) {
writer.appendTab3("consistency = ").appendEol(FEATURE.consistency);
writer.appendTab3Eol("// Causality partial order");
writer.appendTab3("root = [ " );
for( final MoccActor actor : this.FEATURE.rootActor ) {
writer.append(actor.getName()).append(' ');
}
writer.appendEol(']');
writer.appendTab3("leaf = [ " );
for( final MoccActor actor : this.FEATURE.leafActor ) {
writer.append(actor.getName()).append(' ');
}
writer.appendEol(']');
writer.appendTab3("order = [ " );
for( final MoccActor actor : this.actors ) {
writer.append(actor.schedule).append(':')
.append(actor.getName()).append(' ');
}
writer.appendEol(']');
int schedule = 0;
writer.appendTab3("stage = 0:[ " );
for( final MoccActor actor : this.actors ) {
if( actor.schedule == schedule ) {
writer.append(actor.getName()).append(' ');
}
else {
schedule = actor.schedule;
writer.appendEol(']')
.appendTab3("stage = ").append(schedule)
.append(":[ " ).append(actor.getName()).append(' ');
}
}
writer.appendEol(']');
writer.appendEol();
writer.appendTab3("timed_actor = " )
.append(FEATURE.timedActorCount).append(" / ")
.appendEol(actors.size())
.appendTab3("phase = ")
.append(FEATURE.phaseActorCount).append(" / ")
.appendEol(actors.size())
.appendTab3("frequencies = " )
.appendEol(FEATURE.strFrequencies())
.appendTab3("tick_frequency = ").appendEol(FEATURE.tick_frequency)
.appendTab3("tick_step = +").appendEol(FEATURE.tick_step)
.appendTab3("period = " ).appendEol(FEATURE.period) // time resolution
.appendTab3("hyperperiod = " ).appendEol(FEATURE.hyperperiod) // live resolution
.appendTab3("repetition = " )
.appendEol(Arrays.toString(FEATURE.repetitions))
.appendTab3("firings = " ).appendEol(FEATURE.firings);
writer.appendEol();
for( final MoccActor actor : getActor() ) {
writer.appendTab3(actor.FEATURE.strActivation())
.append(' ').append(actor.getName())
.appendEol( actor.isTimed() ? "*" : "" );
}
}
writer.appendTab2Eol('}');
// sout.appendTab2Eol("schedule {");
//
// sout.appendTab2Eol('}');
writer.appendTabEol('}');
writer.flush();
return writer;
}
}