-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathESPINOSA-CUEVAS-DANIEL.lst
More file actions
339 lines (329 loc) · 16.3 KB
/
ESPINOSA-CUEVAS-DANIEL.lst
File metadata and controls
339 lines (329 loc) · 16.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
- Pascal-FC for IBM PC compatibles -
- GNU Compiler Version P5.2
G L Davies & A Burns, University of York
Compiler listing
1 0 (***********************************)
2 0 (* EJERCICIO TÚNEL 28/04/2015 *)
3 0 (* JOSÉ ANTONIO RIAZA VALVERDE *)
4 0 (* DANIEL ESPINOSA CUEVAS *)
5 0 (***********************************)
6 0
7 0 PROGRAM tunel;
8 0
9 0 CONST
10 0 MAXCOCHES = 20; (* Número de coches que pasarán por la carretera *)
11 0 MAXDIRECCIONES = 2; (* Número de direcciones por donde puede venir el coche *)
12 0 MAXTUNEL = 3; (* Número de coches máximo que pueden cruzar en un dirección si hay otros esperando *)
13 0
14 0 MONITOR control;
15 0 EXPORT llegada, entrada, salida;
16 0 VAR
17 0 tunel : CONDITION;
18 0 i : INTEGER; (* Bucles *)
19 0 ncoches : ARRAY [1..MAXDIRECCIONES] OF INTEGER; (* Número de coches esperando en las direcciones *)
20 0 ntunel : INTEGER; (* Número de coches cruzando el túnel *)
21 0 dtunel : INTEGER; (* Dirección de los coches que están cruzando el túnel *)
22 0 ndtunel : INTEGER; (* Número de coches que han cruza el túnel en una dirección *)
23 0
24 0 PROCEDURE llegada (id : INTEGER; direccion : INTEGER); BEGIN
25 0 ncoches[direccion] := ncoches[direccion] + 1; (* Incrementar número de coches esperando en dirección $direccion *)
26 10 (* Imprimir por pantalla la llegada del coche $id por la dirección $direccion *)
27 10 writeln('LLEGADA (id: ', id, ', dir: ', direccion, ') - El coche ', id, ' está esperando en dirección ', direccion);
28 27 END;
29 28
30 28 PROCEDURE entrada (id : INTEGER; direccion : INTEGER); BEGIN
31 28 (* Si los coches que están cruzando no van en el mismo sentido
32 28 o van en el mismo sentido pero se ha sobrepasado el máximo *)
33 28 IF (NOT(ntunel = 0) AND (
34 32 (NOT(direccion = dtunel) AND (NOT(dtunel = 0)))
35 41 OR
36 41 ((MAXTUNEL = ndtunel) AND(direccion = dtunel) AND NOT(empty(tunel)))
37 52 )) THEN
38 55 delay(tunel);
39 57
40 57 IF (NOT(direccion = dtunel)) THEN BEGIN (* Si ha cambiado la dirección *)
41 62 ndtunel := 0; (* Reiniciar contador *)
42 65 dtunel := direccion; (* Cambiar dirección *)
43 68 END;
44 68 ntunel := ntunel + 1; (* Incrementar número de coches cruzando el túnel *)
45 73 writeln('ENTRADA (id: ', id, ', dir: ', direccion, ') - El coche ', id, ' entra desde dirección ', direccion);
46 90 ncoches[direccion] := ncoches[direccion] - 1; (* Decrementar coches en espera en dirección $direccion *)
47 100 sleep(1+random(3));
48 105 END;
49 106
50 106 PROCEDURE salida (id : INTEGER; direccion : INTEGER); BEGIN
51 106 writeln('SALIDA (id: ', id, ', dir: ', direccion, ') - El coche ', id, ' sale desde dirección ', direccion);
52 123 (* Incrementar número de coches que han pasado seguidos en esa dirección *)
53 123 ndtunel := ndtunel + 1;
54 128 (* Decrementar número de coches cruzando el túnel *)
55 128 ntunel := ntunel - 1;
56 133 (* Si no quedan coches en el tunel, liberar *)
57 133 IF (ntunel = 0) THEN resume(tunel);
58 139 END;
59 140
60 140 BEGIN
61 141 FOR i := 1 TO MAXDIRECCIONES DO ncoches[i] := 0;
62 151 ntunel := 0;
63 154 ndtunel := 0;
64 157 dtunel := 0;
65 160 END;
66 161
67 161 PROCESS TYPE coche (id : INTEGER; direccion : INTEGER); BEGIN
68 161 sleep(1+random(10)); (* Dormir proceso un tiempo aleatorio *)
69 166 control.llegada(id, direccion);
70 173 control.entrada(id, direccion);
71 180 control.salida(id, direccion);
72 187 END;
73 188
74 188 (* PROGRAMA *)
75 188 VAR
76 188 i : INTEGER;
77 188 coches : ARRAY [1..MAXCOCHES] OF coche;
78 188
79 188 BEGIN
80 189 COBEGIN
81 190 (* Iterar e iniciar los procesos de coches *)
82 190 FOR i := 1 TO MAXCOCHES DO coches[i](i, 1 + round(random(MAXDIRECCIONES - 1)));
83 210 COEND;
84 211 END.
Symbol table
name link objekt type ref nrm lev adr aux
45 _main 44 procedure notyp 2 True 0 188 0
46 any 0 variable synch 0 True 1 5 0
47 maxcoches 46 constant integer 0 False 1 20 0
48 maxdirecci 47 constant integer 0 False 1 2 0
49 maxtunel 48 constant integer 0 False 1 3 0
50 control 49 variable monvar 3 True 1 5 140
51 tunel 0 variable condition 0 True 1 7 0
52 i 51 variable integer 0 True 1 8 0
53 ncoches 52 variable array 1 True 1 9 0
54 ntunel 53 variable integer 0 True 1 11 0
55 dtunel 54 variable integer 0 True 1 12 0
56 ndtunel 55 variable integer 0 True 1 13 0
57 llegada 56 monproc notyp 4 True 2 0 0
58 id 0 variable integer 0 True 3 5 0
59 direccion 58 variable integer 0 True 3 6 0
60 entrada 57 monproc notyp 5 True 2 28 0
61 id 0 variable integer 0 True 3 5 0
62 direccion 61 variable integer 0 True 3 6 0
63 salida 60 monproc notyp 6 True 2 106 0
64 id 0 variable integer 0 True 3 5 0
65 direccion 64 variable integer 0 True 3 6 0
66 coche 50 type id process 7 True 1 161 0
67 id 0 variable integer 0 True 2 5 0
68 direccion 67 variable integer 0 True 2 6 0
69 i 66 variable integer 0 True 1 14 0
70 coches 69 variable array 2 True 1 15 0
Generated P-code
0 ldadr 1 9 ;24
1 ldval.i 3 6 ;25
2 ixary.i 0 1 ;25
3 ldadr 1 9 ;25
4 ldval.i 3 6 ;25
5 ixary.i 0 1 ;25
6 rpadr.i 0 0 ;25
7 ldcon.i 0 1 ;25
8 addop.i 0 0 ;25
9 store.i 0 0 ;25
10 ldcon.i 0 13 ;27
11 wrstr 0 0 ;27
12 ldval.i 3 5 ;27
13 wrval.i 0 0 ;27
14 ldcon.i 0 7 ;27
15 wrstr 0 13 ;27
16 ldval.i 3 6 ;27
17 wrval.i 0 0 ;27
18 ldcon.i 0 13 ;27
19 wrstr 0 20 ;27
20 ldval.i 3 5 ;27
21 wrval.i 0 0 ;27
22 ldcon.i 0 29 ;27
23 wrstr 0 33 ;27
24 ldval.i 3 6 ;27
25 wrval.i 0 0 ;27
26 wrlin 0 0 ;27
27 rproc 0 0 ;27
28 ldval.i 1 11 ;33
29 ldcon.i 0 0 ;33
30 releq.i 0 0 ;33
31 notop.b 0 0 ;33
32 ldval.i 3 6 ;34
33 ldval.i 1 12 ;34
34 releq.i 0 0 ;34
35 notop.b 0 0 ;34
36 ldval.i 1 12 ;34
37 ldcon.i 0 0 ;34
38 releq.i 0 0 ;34
39 notop.b 0 0 ;34
40 andop.b 0 0 ;34
41 ldcon.i 0 3 ;36
42 ldval.i 1 13 ;36
43 releq.i 0 0 ;36
44 ldval.i 3 6 ;36
45 ldval.i 1 12 ;36
46 releq.i 0 0 ;36
47 andop.b 0 0 ;36
48 ldadr 1 7 ;36
49 stfun.b 0 20 ;36
50 notop.b 0 0 ;36
51 andop.b 0 0 ;36
52 iorop.b 0 0 ;36
53 andop.b 0 0 ;36
54 jmpiz 0 57 ;37
55 ldadr 1 7 ;38
56 delay 0 0 ;38
57 ldval.i 3 6 ;40
58 ldval.i 1 12 ;40
59 releq.i 0 0 ;40
60 notop.b 0 0 ;40
61 jmpiz 0 68 ;40
62 ldadr 1 13 ;40
63 ldcon.i 0 0 ;41
64 store.i 0 0 ;41
65 ldadr 1 12 ;41
66 ldval.i 3 6 ;42
67 store.i 0 0 ;42
68 ldadr 1 11 ;43
69 ldval.i 1 11 ;44
70 ldcon.i 0 1 ;44
71 addop.i 0 0 ;44
72 store.i 0 0 ;44
73 ldcon.i 0 13 ;45
74 wrstr 0 62 ;45
75 ldval.i 3 5 ;45
76 wrval.i 0 0 ;45
77 ldcon.i 0 7 ;45
78 wrstr 0 75 ;45
79 ldval.i 3 6 ;45
80 wrval.i 0 0 ;45
81 ldcon.i 0 13 ;45
82 wrstr 0 82 ;45
83 ldval.i 3 5 ;45
84 wrval.i 0 0 ;45
85 ldcon.i 0 23 ;45
86 wrstr 0 95 ;45
87 ldval.i 3 6 ;45
88 wrval.i 0 0 ;45
89 wrlin 0 0 ;45
90 ldadr 1 9 ;45
91 ldval.i 3 6 ;46
92 ixary.i 0 1 ;46
93 ldadr 1 9 ;46
94 ldval.i 3 6 ;46
95 ixary.i 0 1 ;46
96 rpadr.i 0 0 ;46
97 ldcon.i 0 1 ;46
98 subop.i 0 0 ;46
99 store.i 0 0 ;46
100 ldcon.i 0 1 ;47
101 ldcon.i 0 3 ;47
102 stfun.i 0 19 ;47
103 addop.i 0 0 ;47
104 sleep 0 0 ;47
105 rproc 0 0 ;47
106 ldcon.i 0 13 ;51
107 wrstr 0 118 ;51
108 ldval.i 3 5 ;51
109 wrval.i 0 0 ;51
110 ldcon.i 0 7 ;51
111 wrstr 0 131 ;51
112 ldval.i 3 6 ;51
113 wrval.i 0 0 ;51
114 ldcon.i 0 13 ;51
115 wrstr 0 138 ;51
116 ldval.i 3 5 ;51
117 wrval.i 0 0 ;51
118 ldcon.i 0 22 ;51
119 wrstr 0 151 ;51
120 ldval.i 3 6 ;51
121 wrval.i 0 0 ;51
122 wrlin 0 0 ;51
123 ldadr 1 13 ;51
124 ldval.i 1 13 ;53
125 ldcon.i 0 1 ;53
126 addop.i 0 0 ;53
127 store.i 0 0 ;53
128 ldadr 1 11 ;53
129 ldval.i 1 11 ;55
130 ldcon.i 0 1 ;55
131 subop.i 0 0 ;55
132 store.i 0 0 ;55
133 ldval.i 1 11 ;57
134 ldcon.i 0 0 ;57
135 releq.i 0 0 ;57
136 jmpiz 0 139 ;57
137 ldadr 1 7 ;57
138 resum 0 0 ;57
139 rproc 0 0 ;57
140 prsel 0 0 ;58
141 ldadr 1 8 ;60
142 ldcon.i 0 1 ;61
143 ldcon.i 0 2 ;61
144 for1u.i 0 151 ;61
145 ldadr 1 9 ;61
146 ldval.i 1 8 ;61
147 ixary.i 0 1 ;61
148 ldcon.i 0 0 ;61
149 store.i 0 0 ;61
150 for2u.i 0 145 ;61
151 ldadr 1 11 ;61
152 ldcon.i 0 0 ;62
153 store.i 0 0 ;62
154 ldadr 1 13 ;62
155 ldcon.i 0 0 ;63
156 store.i 0 0 ;63
157 ldadr 1 12 ;63
158 ldcon.i 0 0 ;64
159 store.i 0 0 ;64
160 mretn 0 0 ;64
161 ldcon.i 0 1 ;68
162 ldcon.i 0 10 ;68
163 stfun.i 0 19 ;68
164 addop.i 0 0 ;68
165 sleep 0 0 ;68
166 ldadr 1 5 ;69
167 enmon 0 0 ;69
168 mkstk 0 57 ;69
169 ldval.i 2 5 ;69
170 ldval.i 2 6 ;69
171 calls 0 6 ;69
172 exmon 0 0 ;69
173 ldadr 1 5 ;70
174 enmon 0 0 ;70
175 mkstk 0 60 ;70
176 ldval.i 2 5 ;70
177 ldval.i 2 6 ;70
178 calls 0 6 ;70
179 exmon 0 0 ;70
180 ldadr 1 5 ;71
181 enmon 0 0 ;71
182 mkstk 0 63 ;71
183 ldval.i 2 5 ;71
184 ldval.i 2 6 ;71
185 calls 0 6 ;71
186 exmon 0 0 ;71
187 rproc 1 0 ;71
188 mexec 0 141 ;77
189 cobeg 0 0 ;77
190 ldadr 1 14 ;80
191 ldcon.i 0 1 ;82
192 ldcon.i 0 20 ;82
193 for1u.i 0 210 ;82
194 mkstk 1 66 ;82
195 ldadr 1 15 ;82
196 ldval.i 1 14 ;82
197 ixary.i 0 2 ;82
198 procv 0 0 ;82
199 ldval.i 1 14 ;82
200 ldcon.i 0 1 ;82
201 ldcon.i 0 2 ;82
202 ldcon.i 0 1 ;82
203 subop.i 0 0 ;82
204 stfun.i 0 19 ;82
205 float 0 0 ;82
206 stfun.i 0 9 ;82
207 addop.i 0 0 ;82
208 calls 1 6 ;82
209 for2u.i 0 194 ;82
210 coend 0 0 ;82
211 stopx 0 0 ;83