UNIT SIMULATION: PRIORITYQUEUE CLASS; (* THE LANGUAGE FOR SIMULATION PURPOSES *) VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) PQ:QUEUEHEAD, (* THE TIME AXIS *) MAINPR: MAINPROGRAM; UNIT SIMPROCESS : COROUTINE; (* USER PROCESS PREFIX *) VAR EVENT, (* ACTIVATION MOMENT NOTICE *) EVENTAUX: EVENTNOTICE, (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *) (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *) FINISH: BOOLEAN; UNIT IDLE: FUNCTION: BOOLEAN; BEGIN RESULT:= EVENT= NONE; END IDLE; UNIT TERMINATED: FUNCTION :BOOLEAN; BEGIN RESULT:= FINISH; END TERMINATED; UNIT EVTIME: FUNCTION: REAL; (* TIME OF ACTIVATION *) BEGIN IF IDLE THEN CALL ERROR1; FI; RESULT:= EVENT.EVENTTIME; END EVTIME; UNIT ERROR1:PROCEDURE; BEGIN ATTACH(MAIN); WRITELN(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME"); END ERROR1; UNIT ERROR2:PROCEDURE; BEGIN ATTACH(MAIN); WRITELN(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME"); END ERROR2; BEGIN RETURN; INNER; FINISH:=TRUE; CALL PASSIVATE; CALL ERROR2; END SIMPROCESS; UNIT EVENTNOTICE: ELEM CLASS; (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *) VAR EVENTTIME: REAL, PROC: SIMPROCESS; UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN; (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *) BEGIN IF X=NONE THEN RESULT:= FALSE ELSE RESULT:= EVENTTIME< X.EVENTTIME OR (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI; END LESS; END EVENTNOTICE; UNIT MAINPROGRAM: SIMPROCESS CLASS; (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *) BEGIN DO ATTACH(MAIN) OD; END MAINPROGRAM; UNIT TIME:FUNCTION:REAL; (* CURRENT VALUE OF SIMULATION TIME *) BEGIN RESULT:=CURRENT.EVTIME END TIME; UNIT CURRENT: FUNCTION: SIMPROCESS; (* THE FIRST PROCESS ON THE TIME AXIS *) BEGIN RESULT:=CURR; END CURRENT; UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL); (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF "PRIOR"- PRIORITY *) (* WITHIN TIME MOMENT T *) BEGIN IF T