An example, Ex_Timer
, shows how to define a concrete atomic
class from Atomic
. In this example, we define a class
SimplestTimer
which generates an output, op
, every
3.3 seconds as illustrated in Figure 3.1.
SimplestTimer
has one output port, op
. In the
constructor, op
is assigned by calling AddOP
. The
function init()
does nothing because the class has no
internal variable. The function tau()
returns 3.3 all the
time.
class SimplestTimer: public Atomic { public: OutputPort* op; SimplestTimer(const string& name=""): Atomic(name), n(0) { op = AddOP("op"); } /*virtual*/ void init(){} /*virtual*/ Time tau() const { return 3.3; }Since there is no input transition defined,
delta_x
has the
null body. However, delta_y
returns the output op
.
/*virtual*/ bool delta_x(const PortValue& x) {return false;} /*virtual*/ void delta_y(PortValue& y) { y.Set(op); }The display function
Get_s()
returns the current status,
which is constantly Working
.
/*virtual*/ string Get_s() const { return string("Working"); } };
If you try step
, you can see the animation is increasing the
elapsed time. The following display shows the state at time
2.188 where the schedule time t_s
=3.3 and
the elapsed time t_e
=2.188.
(STimer:Working, t_s=3.300, t_e=2.188) at 2.188The simulation run will stop at 3.3 because its run mode is step-by-step when using
step
. At that time, it will display
the discrete state transition as follows.
(STimer:Working, t_s=3.300, t_e=3.300) --({!STimer.op},t_c=3.3)--> (STimer:Working, t_s=3.300, t_e=0.000)The first state is the source of state transition. An arc shows a triggering event which is the output
op
of STimer
at
the current time=3.3. The second state is the destination of the
state transition in which the lifespan is also 3.3 but the elapsed
time has been reset to zero.
Ex_Timer
.
te
to
tr
by applying the command dtmode
. Then preset the
simulation ending time to ``5'' by pause_at
5. Now
run
until the simulation stops. When it stops at
t_c
=5, print the total state using pinrt
with option
q
. What are the values of t_s
and t_r
,
respectively? Guess the value of t_e
at this moment.
int n
in
SimplestTimer
class. n
should be set = zero in
init()
, and it should increase by one in delta_y()
.
Get_s()
shows n
in the C print format of
"Working, n=%d
" .