Program simulation; (***************************************************************************) (* Programme de systŠme de fenetrage avec boutons et gestion de la souris *) (* ainsi que de simulation d'un r‚seau routier en ville. *) (* BARETS Olivier & PATAUD Fr‚d‚ric & PEYRAT Fran‡ois 1993/1994 *) (* plateforme : PC-DOS_386 avec clavier 102 touches / mode VGA / souris *) (* PC 486DX33 16Mo Ram *) (* ligne de commande de lancement : 'svgaint simula' *) (***************************************************************************) Begin Pref iiuwgraph block Begin Pref mouse block Const Noir = 0, Bleu = 1, Vert = 2, Cyan = 3, Rouge = 4, Magenta = 5, Marron = 6, GrisClair = 7, GrisFonce = 8, BleuClair = 9, VertClair =10, CyanClair =11, RougeClair =12, MagentaClair=13, Jaune =14, Blanc =15; Const T_F1 =315, T_F2 =316, T_F3 =317, T_F4 =318, T_F5 =319, T_F6 =320, T_F7 =321, T_F8 =322, T_F9 =323, T_F10 =324, T_SHFTF1 =340, T_SHFTF2 =341, T_SHFTF3 =342, T_SHFTF4 =343, T_SHFTF5 =344, T_SHFTF6 =345, T_SHFTF7 =346, T_SHFTF8 =347, T_SHFTF9 =348, T_SHFTF10=349, T_CTRLF1 =350, T_CTRLF2 =351, T_CTRLF3 =352, T_CTRLF4 =353, T_CTRLF5 =354, T_CTRLF6 =355, T_CTRLF7 =356, T_CTRLF8 =357, T_CTRLF9 =358, T_CTRLF10=359, T_ALTF1 =360, T_ALTF2 =361, T_ALTF3 =362, T_ALTF4 =363, T_ALTF5 =364, T_ALTF6 =365, T_ALTF7 =366, T_ALTF8 =367, T_ALTF9 =368, T_ALTF10 =369, Tou_Ent =013, T_ESC =027, T_N =078, T_Y =089, T_FLGCH =331, T_FLDTE =333, T_FLHAU =328, T_FLBAS =336, T_ALT1 =376, T_ALT2 =377, T_PGUP =329, T_PGDOWN =337, T_Back =008, T_ESPACE =032, T_CTRLENT=010; Const Larg_bot=18, (* largeur des boutons *) Haut_bot=18; (* hauteur des boutons *) Var SIZEX : integer, SIZEY : integer; (* les variables du systŠme de fenetrage *) Var code : integer, Larg_Vil : integer, (* largeur de la ville *) Haut_Vil : integer, (* Hauteur de la ville *) Larg_Aff : integer, (* largeur de l'interieur de la fenetre maine *) Haut_Aff : integer, (* hauteur de l'interieur de la fenetre maine *) Xdep_Aff : integer, (* Point de depart de l'affichage en X ds maine *) Ydep_Aff : integer, (* point de depart de l'affichage en Y ds maine *) COEF_X : real, (* coeficient de zoom en x *) COEF_Y : real, (* coeficient de zoom en y *) COORD_X : integer, (* coordonn‚e en X de Xdep_Aff en relatif *) COORD_Y : integer, (* coordonn‚e en Y de Ydep_Aff en relatif *) Keys : ListKey, SLKEYS : arrayof listkey, SLCLICS : arrayof cliquer, clics : cliquer, EDIT : editor, edit_bool: boolean, SIMULA : simulateur, DOS : MS_DOS; (* les variables de la simulation *) Var RaciSomm : Sommets, RaciArcs : Arcs, Activ : arrayof Pointeur, (* liste des vehicules en activite *) NbCarActiv : integer, NbMaxCar : integer, NBSOMMETS : integer, SimStop : boolean; (***************************************************************************) (* Permet de cr‚er un pointeur en loglan *) (***************************************************************************) Unit Pointeur : class; End Pointeur; (***************************************************************************) (* definition des classes et procedures de simprocess *) (***************************************************************************) UNIT PRIORITYQUEUE: CLASS; (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*) UNIT QUEUEHEAD: CLASS; (* HEAP ACCESING MODULE *) VAR LAST,ROOT:NODE; UNIT MIN: FUNCTION: ELEM; BEGIN IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI; END MIN; UNIT INSERT: PROCEDURE(R:ELEM); (* INSERTION INTO HEAP *) VAR X,Z:NODE; BEGIN X:= R.LAB; IF LAST=NONE THEN ROOT:=X; ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT ELSE IF LAST.NS=0 THEN LAST.NS:=1; Z:=LAST.LEFT; LAST.LEFT:=X; X.UP:=LAST; X.LEFT:=Z; Z.RIGHT:=X; ELSE LAST.NS:=2; Z:=LAST.RIGHT; LAST.RIGHT:=X; X.RIGHT:=Z; X.UP:=LAST; Z.LEFT:=X; LAST.LEFT.RIGHT:=X; X.LEFT:=LAST.LEFT; LAST:=Z; FI FI; CALL CORRECT(R,FALSE) END INSERT; UNIT DELETE: PROCEDURE(R: ELEM); VAR X,Y,Z:NODE; BEGIN X:=R.LAB; Z:=LAST.LEFT; IF LAST.NS =0 THEN Y:= Z.UP; Y.RIGHT:= LAST; LAST.LEFT:=Y; LAST:=Y; ELSE Y:= Z.LEFT; Y.RIGHT:= LAST; LAST.LEFT:= Y; FI; Z.EL.LAB:=X; X.EL:= Z.EL; LAST.NS:= LAST.NS-1; R.LAB:=Z; Z.EL:=R; IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE) ELSE CALL CORRECT(X.EL,TRUE) FI; END DELETE; UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN); (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *) VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN; BEGIN Z:=R.LAB; IF DOWN THEN WHILE NOT FIN DO IF Z.NS =0 THEN FIN:=TRUE ELSE IF Z.NS=1 THEN X:=Z.LEFT ELSE IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT FI; FI; IF Z.LESS(X) THEN FIN:=TRUE ELSE T:=X.EL; X.EL:=Z.EL; Z.EL:=T; Z.EL.LAB:=Z; X.EL.LAB:=X FI; FI; Z:=X; OD ELSE X:=Z.UP; IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; WHILE NOT LOG DO T:=Z.EL; Z.EL:=X.EL; X.EL:=T; X.EL.LAB:=X; Z.EL.LAB:=Z; Z:=X; X:=Z.UP; IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI; OD FI; END CORRECT; END QUEUEHEAD; UNIT NODE: CLASS (EL:ELEM); (* ELEMENT OF THE HEAP *) VAR LEFT,RIGHT,UP: NODE, NS:INTEGER; UNIT LESS: FUNCTION(X:NODE): BOOLEAN; BEGIN IF X= NONE THEN RESULT:=FALSE ELSE RESULT:=EL.LESS(X.EL) FI; END LESS; END NODE; UNIT ELEM: CLASS(PRIOR:REAL); (* PREFIX OF INFORMATION TO BE STORED IN NODE *) VAR LAB: NODE; UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN; BEGIN IF X=NONE THEN RESULT:= FALSE ELSE RESULT:= PRIOR< X.PRIOR FI; END LESS; BEGIN LAB:= NEW NODE(THIS ELEM); END ELEM; END PRIORITYQUEUE; UNIT SIMULATION: PRIORITYQUEUE CLASS; (* THE LANGUAGE FOR SIMULATION PURPOSES *) VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *) PQ:QUEUEHEAD, (* THE TIME AXIS *) MAINPR: MAINPROGRAM; UNIT SIMPROCESS: pointeur 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