The following image shows the logical dependency between the name segments and describe the used notations. The details differ in terms of delimiters and encoding of the segments.
AMALTHEA uses a named based schema to reference other elements inside of a model.
A custom implementation is used instead of the standard EMF mechanism, which uses an index based implementation.
The target element id is identified by the following schema:
java.net.URLEncoder.encode(<name of element>, StandardCharsets.UTF_8.toString)) + "?type=" + <element>.eClass.name
Samples:
Refering to a Runnable element with name foo in a RunnableCall looks like the following snippet:
<items xsi:type="am:RunnableCall" runnable="foo?type=Runnable" />
Several interfaces and abstract classes are defined in the common model.
They provide basic common functionality for all objects, which are extending it, like the possibility to add
CustomAttributes or
Tags. Tags are available at different elements with the purpose to group them together or to annotate them.
Some derived references are introduces to simplify a multi-level navigation. They are read only.
Reference | ||
ISystem
|
innerPorts → |
QualifiedPort
|
HwStructure
|
innerPorts → |
HwPort
|
HwPath
|
source → |
ProcessingUnit
|
HwPath
|
destination → |
HwDestination
|
TaskScheduler
|
childSchedulers → |
TaskScheduler
|
TaskScheduler
|
parentScheduler → |
TaskScheduler
|
AMALTHEA maintains a number of back pointers in the model. These transient references of an object ‘point back’ to the object referring to it.
Container references provide an easier access to the eContainer of an object.
The following references are specified as opposite references and can be modified.
By the prefix “containing” they clearly indicate that a containment is changed.
Container reference | Containment reference | ||
Component
|
← containingComponent | ports → |
ComponentPort
|
EnumMode
|
← containingMode | literals → |
ModeLiteral
|
HwFeatureCategory
|
← containingCategory | features → |
HwFeature
|
HwAccessElement
|
← containingAccessElement | accessPath → |
HwAccessPath
|
RunnableCall
|
← containingCall | arguments → |
CallArgument
|
ISystem
|
← containingSystem | componentInstances → |
ComponentInstance
|
ISystem
|
← containingSystem | connectors → |
Connector
|
Namespace
|
← previousSegment | nextSegments → |
Namespace
|
Runnable
|
← containingRunnable | parameters → |
RunnableParameter
|
ComponentInterface
|
← containingInterface | subInterfaces → |
SubInterface
|
The following references are specified as opposite references.
Container reference (read only) | Reference | ||
ProcessingUnit
|
← source | accessElements → |
HwAccessElement
|
TaskScheduler
|
← child | parentAssociation → |
SchedulerAssociation
|
The following container references are a special case. Because of the nested structure of sub elements the access to a dedicated container object is computed by traversing multiple eContainer references.
Container reference (read only) | Containment reference | ||
Runnable
|
← containingRunnable | activityGraph ... → |
ActivityGraphItem
|
Process
|
← containingProcess | activityGraph ... → |
ActivityGraphItem
|
ActivityGraph
|
← containingActivityGraph | items ... → |
ActivityGraphItem
|
Runnable
|
← containingRunnable | ... → |
DataDependency
|
The inverse index allows easier and faster navigation, at the expense of greater memory consumption.
The index is built on demand.
The data model has some intermediate objects to express the call of a runnable or the access to a label.
These objects are containments of
Task or
Runnable and can have additional attributes. The back pointers support an easy way to answer queries like “Which tasks call runnable x ?” or “Which functions read label y ?”.
Back pointer (read only) | Reference | ||
LabelAccess
|
← labelAccesses | data → |
Label
|
ChannelAccess
|
← channelAccesses | data → |
Channel
|
SemaphoreAccess
|
← semaphoreAccesses | semaphore → |
Semaphore
|
RunnableCall
|
← runnableCalls | runnable → |
Runnable
|
All elements with memory representation (e.g. labels, runnables) can be mapped to a memory via a MemoryMapping. The back pointers provides a list of all mapping elements that refer to a specific memory or a specific MemoryElement.
Back pointer (read only) | Reference | ||
MemoryMapping
|
← mappings | memory → |
Memory
|
MemoryMapping
|
← mappings | abstractElement → |
AbstractMemoryElement
|
Labels and runnables can be located in exactly one section. The back pointer provides a list of all elements that are assigned to a specific section.
Back pointer (read only) | Reference | ||
Label
|
← labels | section → |
Section
|
Runnable
|
← runnables | section → |
Section
|
CustomEvent and InterProcessStimulus can have explicit triggers. The pointer is established from CustomEventTrigger and InterProcessTrigger. The back pointers provides easier access to the triggering runnables / processes.
Back pointer (read only) | Reference | ||
CustomEventTrigger
|
← explicitTriggers | event → |
CustomEvent
|
InterProcessTrigger
|
← explicitTriggers | stimulus → |
InterProcessStimulus
|
Components define lists of included software elements (e.g. labels, runnables, semaphores). The back pointer provides access to all referring components.
Back pointer (read only) | Reference | ||
Component
|
← referringComponents | labels → |
Label
|
Component
|
← referringComponents | runnables → |
Runnable
|
Component
|
← referringComponents | processes → |
AbstractProcess
|
Component
|
← referringComponents | semaphores → |
Semaphore
|
Component
|
← referringComponents | osEvents → |
OsEvent
|
Allocations refer to a scheduler (Scheduler, TaskScheduler, InterruptController). The back pointer provides access from the scheduler to the allocations.
Back pointer (read only) | Reference | ||
SchedulerAllocation
|
← schedulerAllocations | scheduler → |
Scheduler
|
RunnableAllocation
|
← runnableAllocations | scheduler → |
Scheduler
|
TaskAllocation
|
← taskAllocations | scheduler → |
TaskScheduler
|
ISRAllocation
|
← isrAllocations | controller → |
InterruptController
|
Some other useful back references.
Back pointer (read only) | Reference | ||
Process
|
← affectedProcesses | stimuli → |
Stimulus
|
ITaggable
|
← taggedObjects | tags → |
Tag
|
SchedulerAssociation
|
← childAssociations | parent → |
TaskScheduler
|
INamespaceMember
|
← memberObjects | namespace → |
Namespace
|
IComponentStructureMember
|
← memberObjects | structure → |
ComponentStructure
|
HwConnection
|
← connections | port1 → |
HwPort
|
HwConnection
|
← connections | port2 → |
HwPort
|
Xcore:
A derived back pointer is computed by
AmaltheaIndex.getInverseReferences(...)
.
The visiblity in the generated code and in the user interface is controlled by
@GenModel
annotations.
Example
class Runnable extends AbstractMemoryElement
{ ...
// back pointer (readonly)
@GenModel(documentation="<p><b>Returns an <em>immutable</em> list of callers (RunnableCalls).</b></p>")
@GenModel(propertyCategory="Read only", propertyFilterFlags="org.eclipse.ui.views.properties.expert")
refers transient readonly volatile derived RunnableCall[] runnableCalls get {
AmaltheaIndex.getInverseReferences(this, AmaltheaPackage.eINSTANCE.runnable_RunnableCalls,
#{AmaltheaPackage.eINSTANCE.runnableCall_Runnable} )
}