ptolemy.domains.ddf.lib
Class DDFSelect

java.lang.Object
  extended by ptolemy.kernel.util.NamedObj
      extended by ptolemy.kernel.InstantiableNamedObj
          extended by ptolemy.kernel.Entity
              extended by ptolemy.kernel.ComponentEntity
                  extended by ptolemy.actor.AtomicActor
                      extended by ptolemy.actor.TypedAtomicActor
                          extended by ptolemy.domains.ddf.lib.DDFSelect
All Implemented Interfaces:
java.io.Serializable, java.lang.Cloneable, Actor, Executable, FiringsRecordable, Initializable, TypedActor, Changeable, Debuggable, DebugListener, Derivable, Instantiable, ModelErrorHandler, MoMLExportable, Moveable, Nameable

public class DDFSelect
extends TypedAtomicActor

A type polymorphic select, which routes specified input channels to the output, used in the DDF domain. In the first iteration, an input token at the control port is read and its value is recorded. In the second iteration, an input token is read from the input port channel specified by the most recently seen token at the control port and sent to the output. It alternates between these two kinds of iterations until stopped. The control port must receive IntTokens. The input port may receive tokens of any type. Because tokens are immutable, the same token is sent to the output, rather than a copy. Note that as for any multiport, the channel number starts from 0 and increments by 1 for each additional channel in the order the channel is created (e.g., when a connection is drawn in Vergil).

Note this actor sends an output token every two iterations. Contrast this with Select which sends an output token every iteration.

Since:
Ptolemy II 4.1
Version:
$Id: DDFSelect.java 53042 2009-04-10 20:31:21Z cxh $
Author:
Gang Zhou
See Also:
Serialized Form
Accepted Rating:
Yellow (cxh)
Proposed Rating:
Yellow (zgang)

Nested Class Summary
 
Nested classes/interfaces inherited from class ptolemy.kernel.Entity
Entity.ContainedObjectsIterator
 
Field Summary
private  int _control
          The most recently read control token.
private  boolean _isControlRead
          The boolean to determine whether to read from the control port or from the input port.
private static IntToken _one
          A final static IntToken with value 1.
private  ArrayToken[] _rateArray
          An array of ArrayTokens to be used to set tokenConsumptionRate of the input port.
private  ArrayToken _rateZero
          An ArrayToken to be used to set tokenConsumptionRate of the input port.
private static IntToken _zero
          A final static IntToken with value 0.
 TypedIOPort control
          The input port for control tokens, which specifies the input channels to read the tokens from.
 Parameter control_tokenConsumptionRate
          This parameter provides token consumption rate for control.
 TypedIOPort input
          The input port.
 Parameter input_tokenConsumptionRate
          This parameter provides token consumption rate for input.
 TypedIOPort output
          The output port.
 
Fields inherited from class ptolemy.actor.AtomicActor
_actorFiringListeners, _initializables, _notifyingActorFiring, _stopRequested
 
Fields inherited from class ptolemy.kernel.util.NamedObj
_changeListeners, _changeLock, _changeRequests, _debugging, _debugListeners, _elementName, _isPersistent, _verbose, _workspace, ATTRIBUTES, CLASSNAME, COMPLETE, CONTENTS, DEEP, FULLNAME, LINKS
 
Fields inherited from interface ptolemy.actor.Executable
COMPLETED, NOT_READY, STOP_ITERATING
 
Constructor Summary
DDFSelect(CompositeEntity container, java.lang.String name)
          Construct an actor in the specified container with the specified name.
 
Method Summary
 java.lang.Object clone(Workspace workspace)
          Clone the actor into the specified workspace.
 void connectionsChanged(Port port)
          Pre-calculate the rates to be set in the rate parameter of the input port.
 void fire()
          Fire the actor once.
 void initialize()
          Initialize this actor and rate parameters so that it will read from the control port in the first iteration.
 boolean postfire()
          Update rate parameters for the next iteration.
 boolean prefire()
          Return false if the port or channel it needs to read from in the following firing does not have a token.
 
Methods inherited from class ptolemy.actor.TypedAtomicActor
_addPort, _fireAt, _fireAt, attributeTypeChanged, clone, newPort, typeConstraintList, typeConstraints
 
Methods inherited from class ptolemy.actor.AtomicActor
_actorFiring, _actorFiring, addActorFiringListener, addInitializable, createReceivers, declareDelayDependency, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, isFireFunctional, isStrict, iterate, newReceiver, outputPortList, preinitialize, pruneDependencies, recordFiring, removeActorFiringListener, removeDependency, removeInitializable, setContainer, stop, stopFire, terminate, wrapup
 
Methods inherited from class ptolemy.kernel.ComponentEntity
_adjustDeferrals, _checkContainer, _getContainedObject, _propagateExistence, getContainer, instantiate, isAtomic, isOpaque, moveDown, moveToFirst, moveToIndex, moveToLast, moveUp, propagateExistence, setName
 
Methods inherited from class ptolemy.kernel.Entity
_description, _exportMoMLContents, _removePort, _validateSettables, connectedPortList, connectedPorts, containedObjectsIterator, getAttribute, getPort, getPorts, linkedRelationList, linkedRelations, portList, removeAllPorts, setClassDefinition, uniqueName
 
Methods inherited from class ptolemy.kernel.InstantiableNamedObj
_setParent, exportMoML, getChildren, getElementName, getParent, getPrototypeList, isClassDefinition, isWithinClassDefinition
 
Methods inherited from class ptolemy.kernel.util.NamedObj
_addAttribute, _adjustOverride, _attachText, _cloneFixAttributeFields, _debug, _debug, _debug, _debug, _debug, _getIndentPrefix, _isMoMLSuppressed, _markContentsDerived, _propagateValue, _recordDecoratedAttributes, _removeAttribute, _splitName, _stripNumericSuffix, addChangeListener, addDebugListener, attributeChanged, attributeList, attributeList, deepContains, depthInHierarchy, description, description, event, executeChangeRequests, exportMoML, exportMoML, exportMoML, exportMoML, exportMoMLPlain, getAttribute, getAttributes, getChangeListeners, getClassName, getDecoratorAttribute, getDecoratorAttributes, getDerivedLevel, getDerivedList, getDisplayName, getFullName, getModelErrorHandler, getName, getName, getSource, handleModelError, isDeferringChangeRequests, isOverridden, isPersistent, lazyContainedObjectsIterator, message, propagateValue, propagateValues, removeChangeListener, removeDebugListener, requestChange, setClassName, setDeferringChangeRequests, setDerivedLevel, setDisplayName, setModelErrorHandler, setPersistent, setSource, sortContainedObjects, toplevel, toString, validateSettables, workspace
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface ptolemy.actor.Actor
createReceivers, getCausalityInterface, getDirector, getExecutiveDirector, getManager, inputPortList, newReceiver, outputPortList
 
Methods inherited from interface ptolemy.actor.Executable
isFireFunctional, isStrict, iterate, stop, stopFire, terminate
 
Methods inherited from interface ptolemy.actor.Initializable
addInitializable, preinitialize, removeInitializable, wrapup
 
Methods inherited from interface ptolemy.kernel.util.Nameable
description, getContainer, getDisplayName, getFullName, getName, getName, setName
 
Methods inherited from interface ptolemy.kernel.util.Derivable
getDerivedLevel, getDerivedList, propagateValue
 

Field Detail

input

public TypedIOPort input
The input port. The port type can be any type.


control

public TypedIOPort control
The input port for control tokens, which specifies the input channels to read the tokens from. The type is int.


output

public TypedIOPort output
The output port. The type is at least the type of input.


input_tokenConsumptionRate

public Parameter input_tokenConsumptionRate
This parameter provides token consumption rate for input. The type is array of ints.


control_tokenConsumptionRate

public Parameter control_tokenConsumptionRate
This parameter provides token consumption rate for control. The type is int.


_control

private int _control
The most recently read control token.


_isControlRead

private boolean _isControlRead
The boolean to determine whether to read from the control port or from the input port.


_one

private static final IntToken _one
A final static IntToken with value 1.


_zero

private static final IntToken _zero
A final static IntToken with value 0.


_rateArray

private ArrayToken[] _rateArray
An array of ArrayTokens to be used to set tokenConsumptionRate of the input port. Each ArrayToken indicates the input port needs to consume one token from a corresponding channel and no token from the rest of the channels. The array is initialized in the method connectionsChanged().


_rateZero

private ArrayToken _rateZero
An ArrayToken to be used to set tokenConsumptionRate of the input port. It indicates the input port does not consume any token from any channel. This variable is initialized in the method connectionsChanged().

Constructor Detail

DDFSelect

public DDFSelect(CompositeEntity container,
                 java.lang.String name)
          throws IllegalActionException,
                 NameDuplicationException
Construct an actor in the specified container with the specified name.

Parameters:
container - The container.
name - The name of this actor within the container.
Throws:
IllegalActionException - If the actor cannot be contained by the proposed container.
NameDuplicationException - If the name coincides with an actor already in the container.
Method Detail

clone

public java.lang.Object clone(Workspace workspace)
                       throws java.lang.CloneNotSupportedException
Clone the actor into the specified workspace. This calls the base class and then sets the type constraints.

Overrides:
clone in class AtomicActor
Parameters:
workspace - The workspace for the new object.
Returns:
A new actor.
Throws:
java.lang.CloneNotSupportedException - If a derived class has an attribute that cannot be cloned.
See Also:
NamedObj.exportMoML(Writer, int, String), NamedObj.setDeferringChangeRequests(boolean)

connectionsChanged

public void connectionsChanged(Port port)
Pre-calculate the rates to be set in the rate parameter of the input port. Initialize the private variables _rateZero, which indicates the input port does not consume any token from any channel, and _rateArray, each element of which indicates the input port needs to consume one token from a corresponding channel and no token from the rest of the channels.

Overrides:
connectionsChanged in class AtomicActor
Parameters:
port - The port that has connection changes.

fire

public void fire()
          throws IllegalActionException
Fire the actor once. If the control port is not read in the previous iteration, read a new token from the control port and record the value of the token and this concludes the current firing. Otherwise output the token consumed from the input port channel specified by the most recently seen token on the control port. Then reset an internal variable so that it will read from the control port in the next iteration.

Specified by:
fire in interface Executable
Overrides:
fire in class AtomicActor
Throws:
IllegalActionException - If there is no director, and hence no receivers have been created, or the value of the received control token is out of range.

initialize

public void initialize()
                throws IllegalActionException
Initialize this actor and rate parameters so that it will read from the control port in the first iteration.

Specified by:
initialize in interface Initializable
Overrides:
initialize in class AtomicActor
Throws:
IllegalActionException - If setToken() throws it.

postfire

public boolean postfire()
                 throws IllegalActionException
Update rate parameters for the next iteration.

Specified by:
postfire in interface Executable
Overrides:
postfire in class AtomicActor
Returns:
True if execution can continue into the next iteration.
Throws:
IllegalActionException - If setToken() throws it.

prefire

public boolean prefire()
                throws IllegalActionException
Return false if the port or channel it needs to read from in the following firing does not have a token. Otherwise, return whatever the superclass returns.

Specified by:
prefire in interface Executable
Overrides:
prefire in class AtomicActor
Returns:
True if there are enough tokens to fire.
Throws:
IllegalActionException - If the receivers do not support the query, or if there is no director, and hence no receivers.