<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>D. Matveev)</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Sequence: Pipeline Modelling in Pharo</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Dmitry Matveev</string-name>
        </contrib>
      </contrib-group>
      <pub-date>
        <year>2023</year>
      </pub-date>
      <volume>000</volume>
      <fpage>9</fpage>
      <lpage>0009</lpage>
      <abstract>
        <p>In the modern computing systems, data processing is often organized as a pipeline: a sequence of operations including data acquisition, diferent processing stages, and visualization. Normally, these sequences make recurring patterns: as the input data stream produces new data frames in time, the same or nearly the same sequence of operations is applied to this data to produce results. Modelling pipeline performance is a complex problem and an interesting topic for research. With respect to the computing systems, pipeline stages can run on diferent parts of the system, so parallel execution is possible. Also, a computing system can run multiple diferent pipelines concurrently, and as the compute resources are finite, scheduling problems can arise when concurrent pipelines are trying to access the same resource. Finally, modelling systems at early stages can generate important performance insights for system designers. It applies to both software performing the processing, and hardware executing this software. This paper introduces Sequence: a Pharo package for rapid pipeline execution modelling. Built on powers of Smalltalk and the Pharo interactive environment, Sequence ofers a compact syntax to express pipelines and their properties, a sophisticated simulation engine, and Roassal-based visualization for interactive trace inspection.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Pipeline modelling</kwd>
        <kwd>Simulation</kwd>
        <kwd>Live programming</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>Today data processing is all around us. Be it video analytics, audio enhancement, conference
calls, document indexing, etc. – it happens everywhere and everytime when data is generated
and digitized to be processed by a compute device. Data, software processing this data, and
hardware running this software together form a compute system. Modelling such systems
generates important insights for system designers:
• For existing systems, their actual measured performance can be compared with
theorethical modelling numbers, and possible ineficiencies can be spotted or the observed
behavior can be explained;
• For systems at the design stage, modelling can provide projections that can support
design decisions, e.g. identify early which parts of the system should be optimized or
how resources should be distributed to help system meet its performance expectations.</p>
      <p>Many compute-intensive audio and video workloads can be represented in the form of a
pipeline, where a number of processing stages is executed in order. These pipelines often
include input and output: data acquisition and visualization. What makes audio and video
workloads interesting for modelling is their regularity: input data is produced at a predefined
rate (e.g., by a camera at 30 frames per second), and the number of operations performed is
usually the same for every frame. For such systems, properties like latency and throughput
are key to evaluating their performance. Other important metrics include idle time and power
consumption. If the system assumes real-time processing or communication, quality of service
may become a concern.</p>
      <p>
        Simulation is one of the methods to model systems and evaluate the aforementioned properties.
There are many diferent types of simulations [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. For compute systems, the most comprehensive
ones are cycle-approximate and cycle-accurate simulations[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ][
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Such simulations construct
a complete microprocessor pipeline to collect actual timing information down to individual
cycles. However, for the evaluation purposes such fine-grain precision is not only rarely needed,
but may not be even possible – as it requires excessive and a very detailed description of the
modelled system compute resource but also a very detailed description of the modelled system,
which may be hard to populate at the prototyping stage. In such cases, methods like discrete
event simulation (DES)[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] with more coarse-grain models may provide a reasonable estimate in
a much shorter time.
      </p>
      <p>
        In this paper, we present Sequence, a framework for rapid pipeline modelling in Pharo[
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
Sequence combines a compact language to express pipelines and define their execution
environment, an event stream-based execution simulator, and an interactive trace visualization powered
by Roassal[
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], a Smalltalk package for scriptable interactive visualizations. As Sequence is
built with Pharo, a modern Smalltalk dialect and environment, it follows the “everything is
object” approach where both pipeline definition and the resulting trace are objects. It enables
developers and researches with scripting capabilities when synthesizing simulations (e.g., to
evaluate diferent hypotheses or perform a parameter search) as well as when processing the
simulation results, all in the same environment and in the same programming language.
      </p>
      <p>The paper is organized as follows: a brief overview of related work and DES simulation tools
is given in section 2. Section 3 covers the functionality and diferent aspects of Sequence and
provides a number of examples. Section 4 highlights some key properties of Sequence which
make it stand out from other tools. Finally, section 5 concludes the paper and outlines directions
for the future work.</p>
      <p>Initially, Sequence was designed to model computer vision workloads in heterogeneous
systems. However, as those scenarios are quite complex and, at the same time, the resulting
framework turned out generic enough, for illustrative purposes this paper lists some real-life
scenarios as modelling examples in section 3.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Related work</title>
      <p>
        A general overview of open-source DES tools is given in [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. Most of those tools are generic,
which makes them flexible and applicable in diferent domains, but at the same time it requires
them to provide low-level means to express and organize simulations, which brings its extra cost
for developers to adopt. Among those, SimPy [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] stands out as one of the closest analogues from
the Python world. SimPy follows process-oriented simulation and relies on Python generators
and coroutines, calling itself “pseudo-parallel”. SimPy is still seen as a low-level tool where
additional efort is required to build process simulations atop of it.
      </p>
      <p>
        OMNeT++[
        <xref ref-type="bibr" rid="ref9">9</xref>
        ][
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] is a C++ component-based simulation library and framework. Components
or modules in OMNeT++ can communicate with message passing; modules can be simple and
compound (built from other modules). OMNeT++ also provides its own domain-specific language
called NED to describe the simulation component model. The object model in OMNeT++
implies using inheritance to implement module classes; simulations are built into ready-made
simulation programs linked with the OMNeT++ simulation kernel. The resulting simulations can
be configured with .INI files and visualized through a dedicated graphical runtime environment.
      </p>
      <p>
        PowerDEVS[
        <xref ref-type="bibr" rid="ref11">11</xref>
        ][
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] is a C++ toolkit which implements DEVS, the Discrete EVent System
formalism. It allows to code atomic DEVS models in C++, and combine them into systems
(structures) in a graphical tool. PowerDEVS is a powerful tool to model dynamic and continuous
systems, but may be too formal and low-level to simulate simpler DES processes.
      </p>
      <p>
        ns-3[
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] is C++ DES framework for computer network simulation. ns-3 is an example
of purpose-built simulation software, where domain specifics are reflected in the library API.
Having said that, ns-3 provides means to express computer networks at the high level, directly
operating with a computer network vocabulary: network topologies, protocols, channels, and
packet flow simulation.
      </p>
      <p>
        JaamSim[
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] is a free, open-source simulation package written in Java. Similar to OMNeT++,
JaamSim specifies its own language to define simulation models, as well as the graphical user
interface. The object model can be extended with custom classes in Java. JaamSim supports
both process-orientated and event-orientated simulation models.
      </p>
      <p>
        DESMO-J[
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] is positioned as a modern open-source library for Java-based discrete event
simulation. DESMO-J expects the model structure (including properties and behavior of all
components) to be coded in appropriate Java classes and makes the simulation environment
(simulation clock clock, random number generation, event list, reporting) readily available
atop of that. Similar to JaamSim, DESMO-J also supports event-oriented and process-oriented
perspectives to implement a model.
      </p>
      <p>
        Finally, Cormas[
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] is a generic agent-based modeling platform dedicated to common-pool
resource management, written in Smalltalk. In contrast with other tools mentioned in this
section, Cormas implements a diferent paradigm with focus on multi-agent interactive simulation.
Cormas is an important example of simulation tool built on powers of Smalltalk programming
language and environment, the same as used to implement Sequence.
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Workload simulation with Sequence</title>
      <p>In this section we present our own pipeline simulation package Sequence. We explain how to
define workloads in Sequence and model various scenarios in it.</p>
      <p>
        Sequence implements DES characteristics as defined in [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] and [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Sequence API design
is inspired by classic Smalltalk packages Roassal[
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] and PetitParser[
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. In contrast with the
majority of DES libraries decribed in Section 2, Sequence doesn’t require programmer to derive
Listing 1: Defining a pipeline with Sequence
| a b |
a := ’A’ asSeqBlock latency: 20 ms.
b := ’B’ asSeqBlock latency: 20 fps.
a &gt;&gt; b.
(Sequence startingWith: a)
      </p>
      <p>
        runFor: 500 ms
new classes to express the simulated domain. Instead, Sequence ofers an ad-hoc compositional
approach where a simulation can be defined as a script in a single Playground[
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] window.
      </p>
      <sec id="sec-3-1">
        <title>3.1. Blocks and Sequences</title>
        <p>Pipeline workloads are defined as sequences of operations. In Sequence, operations are called
Blocks. Objects of class “SeqBlock” are basic building blocks of any sequence.</p>
        <p>Every block has two mandatory properties, a name and its execution time. Sequence extends
standard Smalltalk classes with new messages to construct blocks and specify this information
in a compact manner as shown in Listing 1. Blocks are connected using message #&gt;&gt;. After all
required blocks are created and configured, a Sequence object is constructed and is sent to a
500 ms simulation. The simulation result is a trace represented by class SeqTrace; instances of
this class support Pharo inspectors and by default open as Roassal canvas as shown in Figure 1.</p>
        <p>Trace represents events registered during the simulation. Every box stands for an executed
block; boxes are placed in order on a time line. Number sufixes are data frame numbers, we
see block A executed on frame 0 is followed by block B executed on frame 0, as defined in the
scenario from Listing 1.
3.2. Data
Input data is an important aspect of modelling. On Figure 1 we see a pipeline of two connected
blocks executed repeatedly – Sequence creates data stream implicitly and automatically produces
frames 0..7 to feed the pipeline.</p>
        <p>
          In real-world scenarios, pipeline execution may depend on data. For example, every data
frame may contain a diferent amount of information to process, which would afect the block’s
execution time. Imagine a car workshop where service work (“S”) depends on the complexity
of the issue, but in the end there is a car wash procedure (“W”) which takes nearly the same
amount of time for every car. Example of such modelling is shown in Listing 2: Sequence
accepts a generator block which produces data for every frame using a Poisson generator from
Listing 2: Data stream and data-dependent block latency
| s w g |
s := ’S’ asSeqBlock latency: [ :f | (f data * 10) ms ].
w := ’W’ asSeqBlock latency: 25 ms.
s &gt;&gt; w.
g := PMPoissonGenerator new lambda: 5.
(Sequence startingWith: s)
runFor: 800 ms
on: [ g next ]
| scan payment |
scan := ’S’ asSeqBlock latency: 5 ms; tasks: [ :f | f data ].
payment := ’P’ asSeqBlock latency: 30 ms.
scan &gt;&gt; payment.
g := PMPoissonGenerator new lambda: 10.
(Sequence startingWith: scan)
runFor: 500 ms
on: [ g next ]
PolyMath1[
          <xref ref-type="bibr" rid="ref19">19</xref>
          ], where a generated number represents repair complexity; latency for a block is
specified as a callback (a BlockClosure).
        </p>
        <p>Note that in listing 2 and in other examples, the block duration is specified in milliseconds
while the domain assumes durations in minutes or hours; this is a known limitation as Sequence
was initially designed with millisecond-scale task simulations in mind; this limitation will be
addressed in the future versions.</p>
        <p>There are cases when input data may spawn multiple tasks to process, for example in
selfservice checkouts customers need to scan a number of products and then proceed to payment.
Sequence allows to specify this behavior using #tasks: callback as shown in Listing 3.
1https://github.com/PolyMathOrg/PolyMath</p>
        <sec id="sec-3-1-1">
          <title>Listing 4: Parallel process execution</title>
          <p>| a b |
a := ’A’ asSeqBlock latency: 27 ms.
b := ’B’ asSeqBlock latency: 30 ms.
SeqNaiveMultiExecutor new
add: (Sequence startingWith: a);
add: (Sequence startingWith: b);
runFor: 500 ms;
trace.</p>
        </sec>
      </sec>
      <sec id="sec-3-2">
        <title>3.3. Multi-process execution</title>
        <p>In the previous examples we demonstrated how Sequence can model various processes.
Sequence, however, is not limited to a single-process modelling – it can run simulation for multiple
pipelines in parallel. The way how Sequence runs a simulation depends on an executor class, in
Listings 1, 2, and 3, a default SeqNaiveExecutor was used implicitly. Listing 4 shows how to
model two parallel processes using a special executor class, a SeqNaiveMultiExecutor.</p>
        <p>Visualization of the multi-process scenario is shown on Figure 4. When there are multiple
sequences executing in the same simulation, every sequence gets its individual color in the
trace.</p>
      </sec>
      <sec id="sec-3-3">
        <title>3.4. Targets and scheduling</title>
        <p>In Sequence, Targets represent resources where blocks can be executed. On a visualized trace
targets are shown as logical rows (defining every block event’s position on Y-axis): if the events
are placed in the same row on a trace, it means that they have happened on the same target. By
default, every block has its own unique target, this is why Figures 1, 2, 3, and 4 show events
only of the same block in every row.</p>
        <p>Listing 5 shows how the same target can be specified to two pipeline blocks explicitly. Note
Sequence relies on Smalltalk’s cascading messages to configure blocks with new details in a
compact way.</p>
        <p>When two separate processes access the same resource, they become concurrent. In this case,
if the resource is already locked by one block, another block assigned to the same resource
can’t be executed and has to wait. In this situation, scheduling is required to distribute properly
resource time between the concurrent processes. Sequence allows to customize this behavior
using scheduler objects and provides some basic scheduler implementations out of the box.
Figure 5 shows a trace for the case when a simple round-robin scheduler is involved.</p>
        <p>Resources may be quantitive; in this case the amount of resources available on target is</p>
        <sec id="sec-3-3-1">
          <title>Listing 5: Concurrent process execution</title>
          <p>| a b t |
t := SeqTarget new.
a := ’A’ asSeqBlock latency: 27 ms; target: t.
b := ’B’ asSeqBlock latency: 30 ms; target: t.
SeqNaiveMultiExecutor new
add: (Sequence startingWith: a);
add: (Sequence startingWith: b);
scheduler: SeqRoundRobinScheduler new;
runFor: 500 ms;
trace.</p>
        </sec>
        <sec id="sec-3-3-2">
          <title>Listing 6: Concurrent execution on a target with lanes</title>
          <p>| a b t |
t := SeqTarget new lanes: 2.
a := ’A’ asSeqBlock latency: 25 ms; target: t; lanes: 2.
b := ’B’ asSeqBlock latency: 30 ms; target: t; lanes: 1.</p>
          <p>SeqNaiveMultiExecutor new
add: (Sequence startingWith: a);
add: (Sequence startingWith: b);
scheduler: SeqRoundRobinScheduler new;
runFor: 500 ms;
trace.
specified by the message lanes:, the same message configures how much resource is required
for a block. Currently resource allocation is atomic, so if there’s  resources (lanes) available
on a target, and a block requires such number  of lanes where  &gt;  , no allocation will
happen.</p>
          <p>Example of this situation is given in Listing 6 and Figure 6: a shared target has two lanes,
block “A” requires two lanes to run, while block “B” needs only one. The round-robin scheduler
balances execution between “A” and “B”; even if there’s room available on the target when “B”
executes, “A” can’t trigger since there’s not enough lanes available.</p>
          <p>Listing 7: Execution with a live source
| s1 a s2 b |
s1 := ’Src1’ asSeqBlock latency: 30 fps; live.
a := ’A’ asSeqBlock latency: 22 fps.
s2 := ’Src2’ asSeqBlock latency: 30 fps; live.
b := ’B’ asSeqBlock latency: 30 fps.
s1 &gt;&gt; a.
s2 &gt;&gt; b.</p>
          <p>SeqNaiveMultiExecutor new
add: (Sequence startingWith: s1);
add: (Sequence startingWith: s2);
runFor: 500 ms;
trace.</p>
        </sec>
      </sec>
      <sec id="sec-3-4">
        <title>3.5. Metrics. Live sources</title>
        <p>Sequence trace contains comprehensive information about all events registered during modelling.
For the convience, Sequence keeps track of the most interesting pipeline properties such as the
number of completed frames and pipeline latency.</p>
        <p>Pipeline latency is calculated as a duration between a point in time when pipeline started
processing a frame, and a point in time when pipeline finished processing the frame.</p>
        <p>The start time of a pipeline is the moment when there is (new) data to process. By default,
Sequence assumes new data is available as soon as a pipeline can process a new frame. The
ifnish time of the pipeline is the moment when pipeline’s last block completes its execution for
the given frame. As a classic DES system, Sequence tracks its own simulated clock and advances
the time point as new events are handled by the executor.</p>
        <p>In real-world scenarios, when real-time processes are modelled, input data is generated by
the real world and is registered by the system with some sample rate. In this case, the modelling
source is called live and runs with its own cadence, independently from a processing pipeline. If
a pipeline is fast enough to process data until a new data frame arrives, it maintains its real-time
property. Otherwise, it will accumulate an output delay or cause a frame drop. In the case of a
live source, the pipeline start time is taken as the time when pipeline started processing data
from a live source (the live source own latency is excluded from that time).</p>
        <p>Pipeline latency, pipeline output latency (an inverse of its throughput), number of frames
processed and dropped (when enabled by executor) are the metrics Sequence collects and displays
by default. As trace is a regular Smalltalk objects containing a collection of all registered events,
developers can calculate their own metrics of interest based on this data.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Discussion: What makes Sequence special</title>
      <p>Sequence combines real-time approach of short scriptable programming paired with quick
response based on standard Smalltalk inspectors.</p>
      <p>This is unique quality of Smalltalk as a live environment. Sequence provides rapid response
so a researcher can adjust parameters and explore diferent behaviors in an interactive manner.</p>
      <p>
        Sequence avoids the “compile-and-run” loop which is specific to C++ and Java-based solutions.
This makes Sequence-powered simulations easier to debug: as Sequence stays a Smalltalk library
and doesn’t introduce its own language, the existing superior Smalltalk debugging tools and
workflows[
        <xref ref-type="bibr" rid="ref20">20</xref>
        ] can be reused. Sequence doesn’t use coroutines and other complicated control
lfow mechanisms which makes debugging deterministic and clean, as the Sequence’s simulation
state can be clearly seen in the standard Pharo debugger.
      </p>
      <p>Another strong point behind Sequence is that there is no semantic gap between the simulated
data and its visual representation. Objects visualized in the trace are the same objects generated
during the simulation, which allows any sorts of analysis or post-processing to be done in the
same Smalltalk environment where the simulation has been executed.</p>
      <p>At the same time, as a purpose-built package, Sequence remains relatively compact and
simple inside, whilst providing powerful pipeline modelling capabilities.</p>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusion and future work</title>
      <p>Sequence illustrates how a powerful simulation can be built atop of very basic concepts. With
programmable interface and inspectable results, Sequence builds a solid foundation on the
future work in the field.</p>
      <p>One of the logical directions for further development of Sequence may be seen in expanding
its applicability to other areas, e.g. modelling of real-life processes, service load, manufacturing,
etc.</p>
      <p>Section 3 shows that Sequence already can be applied for modelling of diferent processes,
not only limited to computer data processing workloads. While this scaling shouldn’t require
dramatic changes in the Sequence’s event stream execution engine, a revision of supported
event durations and visualized trace scale may be required.</p>
      <p>
        Another perspective topic is composable simulations[
        <xref ref-type="bibr" rid="ref21">21</xref>
        ]. Currently Sequence implements
a flat structure where a pipeline can consist only of terminal blocks. Extending Sequence to
handle pipelines of pipelines would enable new types of simulations at diferent levels: engineers
could simulate smaller portions of the system and then combine those into more complex and
sophisticated simulations. Also, the same machinery could enable simulating branching and
conditional execution within Sequence.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Galvão Scheidegger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. Fernandes</given-names>
            <surname>Pereira</surname>
          </string-name>
          ,
          <string-name>
            <surname>M. L. Moura de Oliveira</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Banerjee</surname>
            ,
            <given-names>J. A.</given-names>
          </string-name>
          <string-name>
            <surname>Barra Montevechi</surname>
          </string-name>
          ,
          <article-title>An introductory guide for hybrid simulation modelers on the primary simulation methods in industrial engineering identified through a systematic review of the literature</article-title>
          ,
          <source>Computers &amp; Industrial Engineering</source>
          <volume>124</volume>
          (
          <year>2018</year>
          )
          <fpage>474</fpage>
          -
          <lpage>492</lpage>
          . URL: https://www.sciencedirect.com/science/article/pii/S0360835218303693. doi:https://doi. org/10.1016/j.cie.
          <year>2018</year>
          .
          <volume>07</volume>
          .046.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M. T.</given-names>
            <surname>Yourst</surname>
          </string-name>
          ,
          <article-title>PTLsim: A cycle accurate full system x86-64 microarchitectural simulator</article-title>
          ,
          <source>in: 2007 IEEE International Symposium on Performance Analysis of Systems &amp; Software, IEEE</source>
          ,
          <year>2007</year>
          , pp.
          <fpage>23</fpage>
          -
          <lpage>34</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>J.</given-names>
            <surname>Yi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Lilja</surname>
          </string-name>
          , Simulation of computer architectures: Simulators, benchmarks, methodologies, and recommendations, Computers, IEEE Transactions on
          <volume>55</volume>
          (
          <year>2006</year>
          )
          <fpage>268</fpage>
          -
          <lpage>280</lpage>
          . doi:
          <volume>10</volume>
          .1109/TC.
          <year>2006</year>
          .
          <volume>44</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>J.</given-names>
            <surname>Banks</surname>
          </string-name>
          , Introduction to Simulation, in
          <source>: Proceedings of the 31st Conference on Winter Simulation</source>
          :
          <article-title>Simulation-a Bridge to the Future - Volume 1</article-title>
          , WSC '99,
          <string-name>
            <surname>Association</surname>
          </string-name>
          for Computing Machinery, New York, NY, USA,
          <year>1999</year>
          , p.
          <fpage>7</fpage>
          -
          <lpage>13</lpage>
          . URL: https://doi.org/10.1145/ 324138.324142. doi:
          <volume>10</volume>
          .1145/324138.324142.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Black</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Nierstrasz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Pollet</surname>
          </string-name>
          , Pharo by example,
          <source>Lulu. com</source>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>A.</given-names>
            <surname>Bergel</surname>
          </string-name>
          , Agile Visualization, LULU Press,
          <year>2016</year>
          . URL: http://AgileVisualization.com.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>G.</given-names>
            <surname>Dagkakis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Heavey</surname>
          </string-name>
          ,
          <article-title>A review of open source discrete event simulation software for operations research</article-title>
          ,
          <source>Journal of Simulation</source>
          <volume>10</volume>
          (
          <year>2016</year>
          )
          <fpage>193</fpage>
          -
          <lpage>206</lpage>
          . URL: https://doi.org/10.1057/jos.
          <year>2015</year>
          .
          <article-title>9</article-title>
          . doi:
          <volume>10</volume>
          .1057/jos.
          <year>2015</year>
          .
          <article-title>9</article-title>
          . arXiv:https://doi.org/10.1057/jos.
          <year>2015</year>
          .
          <volume>9</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>N.</given-names>
            <surname>Matlof</surname>
          </string-name>
          ,
          <article-title>Introduction to Discrete-Event Simulation and the SimPy Language</article-title>
          , Davis, CA. Dept of Computer Science. University of California at Davis.
          <source>Retrieved on August</source>
          <volume>2</volume>
          (
          <year>2008</year>
          )
          <fpage>1</fpage>
          -
          <lpage>33</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>A.</given-names>
            <surname>Varga</surname>
          </string-name>
          , OMNeT++, Springer Berlin Heidelberg, Berlin, Heidelberg,
          <year>2010</year>
          , pp.
          <fpage>35</fpage>
          -
          <lpage>59</lpage>
          . URL: https://doi.org/10.1007/978-3-
          <fpage>642</fpage>
          -12331-
          <issue>3</issue>
          _3. doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>642</fpage>
          -12331-
          <issue>3</issue>
          _
          <fpage>3</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>A.</given-names>
            <surname>Varga</surname>
          </string-name>
          , A Practical Introduction to the OMNeT++ Simulation Framework, Springer International Publishing, Cham,
          <year>2019</year>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>51</lpage>
          . URL: https://doi.org/10.1007/ 978-3-
          <fpage>030</fpage>
          -12842-
          <issue>5</issue>
          _1. doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>030</fpage>
          -12842-
          <issue>5</issue>
          _
          <fpage>1</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>E.</given-names>
            <surname>Kofman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Lapadula</surname>
          </string-name>
          , E. Pagliero,
          <article-title>PowerDEVS: A DEVS-based environment for hybrid system modeling and simulation</article-title>
          , School of Electronic Engineering, Universidad Nacional de Rosario,
          <source>Tech. Rep. LSD0306</source>
          (
          <year>2003</year>
          )
          <fpage>1</fpage>
          -
          <lpage>25</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>F. J.</given-names>
            <surname>Preyser</surname>
          </string-name>
          ,
          <article-title>An approach to develop a user friendly way of implementing DEV&amp;DESS models in powerDEVS, Masterthesis</article-title>
          , TU Wien (
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>G. F.</given-names>
            <surname>Riley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. R.</given-names>
            <surname>Henderson</surname>
          </string-name>
          ,
          <source>The ns-3 Network Simulator</source>
          , Springer Berlin Heidelberg, Berlin, Heidelberg,
          <year>2010</year>
          , pp.
          <fpage>15</fpage>
          -
          <lpage>34</lpage>
          . URL: https://doi.org/10.1007/978-3-
          <fpage>642</fpage>
          -12331-
          <issue>3</issue>
          _2. doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>642</fpage>
          -12331-
          <issue>3</issue>
          _
          <fpage>2</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>D. H.</given-names>
            <surname>King</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H. S.</given-names>
            <surname>Harrison</surname>
          </string-name>
          ,
          <article-title>Open-source simulation software “JaamSim”</article-title>
          , in: 2013
          <source>Winter Simulations Conference (WSC)</source>
          ,
          <year>2013</year>
          , pp.
          <fpage>2163</fpage>
          -
          <lpage>2171</lpage>
          . doi:
          <volume>10</volume>
          .1109/WSC.
          <year>2013</year>
          .
          <volume>6721593</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>J.</given-names>
            <surname>Göbel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Joschko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Koors</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Page</surname>
          </string-name>
          ,
          <source>The Discrete Event Simulation Framework DESMOJ: Review</source>
          , Comparison To Other Frameworks And
          <string-name>
            <surname>Latest Development</surname>
          </string-name>
          ,
          <year>2013</year>
          , pp.
          <fpage>100</fpage>
          -
          <lpage>109</lpage>
          . doi:
          <volume>10</volume>
          .7148/2013-0100.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>P.</given-names>
            <surname>Bommel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Becu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Le Page</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bousquet</surname>
          </string-name>
          ,
          <string-name>
            <surname>Cormas:</surname>
          </string-name>
          <article-title>An agent-based simulation platform for coupling human decisions with computerized dynamics</article-title>
          , in: T. Kaneda,
          <string-name>
            <given-names>H.</given-names>
            <surname>Kanegae</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Toyoda</surname>
          </string-name>
          , P. Rizzi (Eds.),
          <source>Simulation and Gaming in the Network Society</source>
          , Springer Singapore, Singapore,
          <year>2016</year>
          , pp.
          <fpage>387</fpage>
          -
          <lpage>410</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>J.</given-names>
            <surname>Kurs</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Larcheveque</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Renggli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Bergel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Cassou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Laval</surname>
          </string-name>
          , Petitparser: Building modular parsers (
          <year>2013</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>J.</given-names>
            <surname>Kubelka</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Robbes</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Bergel</surname>
          </string-name>
          ,
          <article-title>The Road to Live Programming: Insights from the Practice</article-title>
          ,
          <source>in: Proceedings of the 40th International Conference on Software Engineering</source>
          , ICSE '18,
          <string-name>
            <surname>Association</surname>
          </string-name>
          for Computing Machinery, New York, NY, USA,
          <year>2018</year>
          , p.
          <fpage>1090</fpage>
          -
          <lpage>1101</lpage>
          . URL: https://doi.org/10.1145/3180155.3180200. doi:
          <volume>10</volume>
          .1145/3180155.3180200.
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>D. H.</given-names>
            <surname>Besset</surname>
          </string-name>
          ,
          <article-title>Object-oriented implementation of numerical methods; An introduction with</article-title>
          <source>Smalltalk</source>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>J.</given-names>
            <surname>Ressia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Bergel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Nierstrasz</surname>
          </string-name>
          ,
          <article-title>Object-centric debugging</article-title>
          ,
          <source>in: 2012 34th International Conference on Software Engineering (ICSE)</source>
          ,
          <year>2012</year>
          , pp.
          <fpage>485</fpage>
          -
          <lpage>495</lpage>
          . doi:
          <volume>10</volume>
          .1109/ICSE.
          <year>2012</year>
          .
          <volume>6227167</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>S.</given-names>
            <surname>Kasputis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H. C.</given-names>
            <surname>Ng</surname>
          </string-name>
          ,
          <article-title>Composable simulations</article-title>
          ,
          <source>in: 2000 Winter Simulation Conference Proceedings (Cat. No. 00CH37165)</source>
          , volume
          <volume>2</volume>
          , IEEE,
          <year>2000</year>
          , pp.
          <fpage>1577</fpage>
          -
          <lpage>1584</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>