blob: 1065f37270a151103dd5f241ab7b3727e5a46a97 [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;
public class MoccPort {
public final MoccActor actor;
public enum Direction { INPUT , OUTPUT }
protected final Direction direction;
protected final String name;
public int rate;
protected final int rateDenominator;
protected MoccChannel channel;
public MoccPort(final MoccActor actor, final Direction direction,
final String name, final int rate, final int rateDenominator) {
super();
assert (actor != null) : "Unexpected a null MoccActor";
this.actor = actor;
this.direction = direction;
this.name = name;
this.rate = rate;
this.rateDenominator = rateDenominator;
this.channel = null;
actor.addPort( this );
}
public MoccPort(final MoccActor actor,
final Direction direction, final String name, final int rate) {
this(actor, direction, name, rate, 1);
}
// GETTERS - SETTERS
public MoccActor getActor() {
return actor;
}
public boolean isInput() {
return( direction == Direction.INPUT );
}
public boolean isInputMode() {
return( (direction == Direction.INPUT)
&& (channel.getOutputActor().isModeProducer()) );
}
public MoccActor getModeSelector() {
if( direction == Direction.INPUT ) {
if( channel.getOutputActor().isModeProducer() ) {
return channel.getOutputActor().getSelector();
}
}
else if( this.actor.isModeProducer() ) {
return this.actor.getSelector();
}
return null;
}
public boolean isOutput() {
return( direction == Direction.OUTPUT );
}
public boolean isOutputMode() {
return( (direction == Direction.OUTPUT) && (actor.isModeProducer()) );
}
public String getName() {
return name;
}
public int getRate() {
return rate;
}
public int getRateDenominator() {
return rateDenominator;
}
public boolean isRational() {
return( rateDenominator > 1 );
}
public boolean isInputRational() {
return( (channel != null) && channel.getInputPort().isRational() );
}
public boolean hasEnoughInitialRate() {
assert (channel != null) :
"Unexpected a null MoccChannel in updateInputChannel";
return( ((channel.getInitialRate() * rateDenominator)
>= (rate * channel.getInitialRateDenominator())) );
}
public boolean hasEnoughInitialRate(final MoccActor sourceActor) {
assert (channel != null) :
"Unexpected a null MoccChannel in updateInputChannel";
return( (channel.getOutputPort().getActor() == sourceActor)
&& hasEnoughInitialRate() );
}
public boolean hasInitialRate() {
return( (channel != null) && channel.hasInitialRate() );
}
public boolean isOutputRational() {
return( (channel != null) && channel.getOutputPort().isRational() );
}
public boolean isRationalTokenCount() {
return( isRational() || isOutputRational() );
}
public MoccChannel getChannel() {
return channel;
}
public void updateInputChannel(final MoccChannel channel) {
assert (channel != null) :
"Unexpected a null MoccChannel in updateInputChannel";
this.channel = channel;
this.actor.updateInputChannel(this.channel);
}
public void updateOutputChannel(final MoccChannel channel) {
assert (channel != null) :
"Unexpected a null MoccChannel in updateOutputChannel";
this.channel = channel;
this.actor.updateOutputChannel(this.channel);
}
public String strRate() {
if( isRational() ) {
return( "" + rate + "/" + rateDenominator );
}
else {
return( "" + rate );
}
}
@Override
public String toString() {
final StringBuilder sout = new StringBuilder();
sout.append(direction.toString().toLowerCase())
.append(" port< rate = ").append(strRate());
if( channel.hasInitialRate() ) {
sout.append(" , initial = ").append(channel.strInitialRate());
}
if( channel.hasInitialMode() ) {
sout.append(" , mode = ")
.append(channel.getInitialMode().getLiteral());
}
sout.append(" > ").append(name);
return sout.toString();
}
}