#USE "proto.tsr" #USE strmhdr #USE linkaddr #USE "proto.tsr" #USE strmhdr #USE splib #USE solib VAL INTERVAL IS 10: PROC knap.k(CHAN OF STREAM from.queue, --to.queue, CHAN OF STREAM out, VAL INT name, VAL INT num.trans) BOOL running: [MAX.CAP]INT sol: [MAX.QUEUE]INT queue: [MAX]INT p.k, w.k: INT M, bandas, resto, best.solution, last.send: SEQ [MAX.CAP]INT p, w: INT t.p, t.w: SEQ from.queue ? CASE problem; t.p::p; t.w::w; M sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," Problem") sem ! 1 out ! problem; t.p::p; t.w::w; M SEQ bandas := t.p / num.trans resto := t.p \ num.trans IF resto >= name bandas := bandas + 1 resto = 0 resto := num.trans TRUE SKIP SEQ i = 0 FOR bandas SEQ p.k[i] := p[(i * num.trans) + (name - 1)] w.k[i] := w[(i * num.trans) + (name - 1)] INT last.solution, top, f.u, u, c.p, c.w: BOOL no.last: SEQ SEQ i = 0 FOR bandas SEQ c.p := p.k[i] c.w := w.k[i] no.last := NOT((i = (bandas - 1)) AND (resto = name)) SEQ k = 0 FOR (M + 1) sol[k] := INFINITY last.solution := c.w last.send := 0 best.solution := INFINITY top := 0 sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," solving bandas=") so.write.int(from.isv,to.isv,bandas,0) sem ! 1 SEQ running:= TRUE WHILE running SEQ --to.queue ! signal from.queue ? CASE optimal; f.u; u SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," R=") so.write.int(from.isv,to.isv,f.u,0) sem ! 1 IF f.u <> INFINITY -- No UNTIL.HERE SEQ IF sol[u] < f.u sol[u] := f.u TRUE SKIP TRUE SKIP SEQ SEQ k = top FOR (u - top) + 1 SEQ IF (sol[k] > best.solution) SEQ best.solution := sol[k] last.send := k IF no.last SEQ out ! optimal; sol[k]; k sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," S=") so.write.int(from.isv,to.isv,sol[k],0) sem ! 1 TRUE SKIP TRUE SKIP top := u + 1 IF u > (last.send + INTERVAL) SEQ last.send := u IF no.last out ! optimal; INFINITY; u -- UNTIL.HERE ; u TRUE SKIP TRUE SKIP IF f.u <> INFINITY -- No UNTIL.HERE SEQ IF (u + c.w) <= M SEQ last.solution := u + c.w sol[last.solution] := f.u + c.p TRUE SKIP TRUE SKIP finish SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," Finish") sem ! 1 IF (top <= last.solution) SEQ k = top FOR (last.solution - top) + 1 IF (sol[k] > best.solution) SEQ best.solution := sol[k] IF no.last out ! optimal; sol[k]; k TRUE SKIP TRUE SKIP TRUE SKIP IF no.last out ! finish TRUE SKIP running := FALSE IF resto = name SEQ out ! solution; best.solution sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," Solucion=") so.write.int(from.isv,to.isv,best.solution,0) sem ! 1 resto < name SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NEsperando solucion") sem ! 1 from.queue ? CASE solution; best.solution out ! solution; best.solution TRUE SKIP sem ! 1 so.write.string(from.isv,to.isv,"*NT") so.write.int(from.isv,to.isv,name,0) so.write.string(from.isv,to.isv," FIN") sem ! 1 : #USE "proto.tsr" #USE strmhdr #USE solib #USE splib #USE extrio #USE linkaddr PROC queue(CHAN OF SP from.isv,to.isv, CHAN OF STREAM in,out) PROC open.file(VAL []BYTE name,INT fich) BOOL exist,error: BYTE result: [20]BYTE datos: INT32 id: VAL spm.input IS 1(BYTE): VAL spt.text IS 2(BYTE): SEQ so.test.exists(from.isv,to.isv,name,exist) IF NOT exist so.write.string(from.isv,to.isv,"Fichero no encontrado") TRUE SKIP so.open(from.isv,to.isv,name,spt.text,spm.input,id,result) fich := INT id : PROC fread.int(INT fich,valor) BOOL error: [20]BYTE datos: INT datos.leidos: BYTE result: INT32 num: SEQ so.gets(from.isv,to.isv,INT32 fich,datos.leidos,datos,result) STRINGTOINT32(error,num,[datos FROM 0 FOR datos.leidos]) valor := INT num : PROC fread.int16(INT fich, INT16 valor) BOOL error: [20]BYTE datos: INT datos.leidos: BYTE result: INT32 num: SEQ so.gets(from.isv,to.isv,INT32 fich,datos.leidos,datos,result) STRINGTOINT16(error,valor,[datos FROM 0 FOR datos.leidos]) : PROC so.prompt.int(VAL []BYTE msg,VAL INT n) SEQ so.write.string(from.isv,to.isv,msg) so.write.int(from.isv,to.isv,n,0) : PROC so.msg(VAL []BYTE msg) SEQ so.write.string(from.isv,to.isv,msg) : PROC so.pause() SEQ BYTE key,result: so.getkey(from.isv,to.isv,key,result) : --PROC read.knapsack.problem(CHAN OF SP from.filer,to.filer, PROC read.knapsack.problem(INT n,capacity, []INT cost,weight) BOOL err: [64]BYTE nombre.fichero: -- [MAX.N]REAL32 quotient: -- [MAX.N]INT tmp.cost,tmp.weight: INT nil: INT i,p,head: INT fich: BYTE result: PROC insert() INT p,q: BOOL not.found: SEQ p,q := head, head not.found := TRUE WHILE (p <> nil) AND (not.found) SEQ so.write.string(from.isv,to.filer," (") so.write.int(from.isv,to.filer,p,0) so.write.string(from.isv,to.filer,",") so.write.int(from.isv,to.filer,cost[p],0) so.write.string(from.isv,to.filer,",") so.write.int(from.isv,to.filer,weight[p],0) so.write.string(from.isv,to.filer,",") so.write.real32(from.isv,to.filer,quotient[p],0,0) so.write.string(from.isv,to.filer,") ") BYTE key,result: so.getkey(from.isv,to.filer,key,result) IF (quotient[p] >= quotient[i]) SEQ q := p p := next[p] TRUE not.found := FALSE IF (p = head) SEQ next[i] := head head := i TRUE SEQ next[q] := i next[i] := p : PROC write.list() INT p: INT k: SEQ p := head so.write.string(from.isv,to.filer,"*Nlista = ") WHILE (p <> nil) SEQ so.write.string(from.isv,to.filer,"(") so.write.int(from.isv,to.filer,p,0) so.write.string(from.isv,to.filer,",") so.write.int(from.isv,to.filer,tmp.cost[p],0) so.write.string(from.isv,to.filer,",") so.write.int(from.isv,to.filer,tmp.weight[p],0) so.write.string(from.isv,to.filer,",") so.write.real32(from.isv,to.filer,quotient[p],0,0) so.write.string(from.isv,to.filer,") -> ") p := next[p] : [64]BYTE name: INT len: SEQ --so.write.string(from.isv,to.isv,"*NFichero de datos: ") --so.read.echo.line(from.isv,to.isv,len,name,result) --so.write.string(from.isv,to.isv,"*Nabriendo fichero ") --so.write.string(from.isv,to.isv,[name FROM 0 FOR len]) [name FROM 0 FOR 9] := "datos.dat" len := 9 open.file([name FROM 0 FOR len],fich) fread.int(fich,n) --so.write.string(from.isv,to.isv,"*Nn= ") --so.write.int(from.isv,to.isv,n,0) fread.int(fich,capacity) --so.write.string(from.isv,to.isv,"*Ncapacity= ") --so.write.int(from.isv,to.isv,capacity,0) --so.write.string(from.isv,to.isv,"*NCOST WEIGHT*N") i := 0 nil := -1 head := nil WHILE (i < n) SEQ fread.int(fich,cost[i]) fread.int(fich,weight[i]) so.write.int(from.isv,to.isv,cost[i],0) so.write.string(from.isv,to.isv," ") so.write.int(from.isv,to.isv,weight[i],0) so.write.string(from.isv,to.isv,"*N") i := i+1 so.close(from.isv,to.isv,INT32 fich,result) i := 0 WHILE (i < n) SEQ REAL32 cost.r, weight.r: SEQ quotient[i] := (REAL32 ROUND tmp.cost[i])/ (REAL32 ROUND tmp.weight[i]) insert() --write.list() i := i+1 p,i := head,0 WHILE (i < n) SEQ cost[i] := tmp.cost[p] weight[i] := tmp.weight[p] i, p := i+1, next[p] : INT n, M, sol,cont.queue: [MAXIMO]INT p, w: CHAN OF STREAM q.s, s.q: INT time1,time2: TIMER clock: PROC read.problem(CHAN OF INT in ,CHAN OF STREAM out,CHAN OF SP from.isv,to.isv) INT f: BYTE c,result: [MAXIMO]INT p,w: INT n, M: --CHAN OF SP from.isv,to.isv: SEQ --read.knapsack.problem(from.isv,to.isv,n,M,p,w) out ! problem; n::p; n::w; M sem ! 1 so.write.string(from.isv,to.isv,"Enviado") sem ! 1 in ? f so.exit(from.isv, to.isv, 0 (INT32)) : PROC sender(CHAN OF STREAM from.queue,to.queue,out) BOOL active: INT f.v, v: SEQ active := TRUE WHILE active SEQ to.queue ! signal from.queue ? CASE optimal; f.v; v SEQ out ! optimal; f.v; v --so.write.string(from.isv,to.isv,"Sending ") --so.write.int(from.isv,to.isv,f,0) signal SEQ active := FALSE finish out ! finish --so.write.string(from.isv,to.isv,"Termino sender") : PROC main.queue(CHAN OF STREAM in,CHAN OF STREAM from.sender,to.sender) BOOL active: INT f, t.p, t.w, front.queue, rear.queue, band.queue, M: [MAX.QUEUE]INT queue.f.v, queue.v: [MAXIMO]INT p,w: SEQ active := TRUE front.queue := 0 rear.queue := 0 band.queue := -1 from.sender ? CASE signal to.sender ! optimal; 0; 0 from.sender ? CASE signal to.sender ! finish cont.queue := 0 WHILE active ALT in ? CASE finish SEQ --sem ! 1 so.write.string(from.isv,to.isv,"*N") so.write.int(from.isv,to.isv,cont.queue,0) cont.queue := 0 --sem ! 1 band.queue := front.queue optimal; queue.f.v[front.queue]; queue.v[front.queue] SEQ sem ! 1 so.write.string(from.isv,to.isv,"*NQueue R=") so.write.int(from.isv,to.isv,queue.f.v[front.queue],0) so.write.string(from.isv,to.isv," ") so.write.int(from.isv,to.isv,queue.v[front.queue],0) sem ! 1 front.queue := (front.queue + 1) \ MAX.QUEUE cont.queue := cont.queue + 1 solution; f SEQ sol := f sem ! 1 so.write.string(from.isv,to.isv,"*N from queue solucion") sem ! 1 from.sender ? CASE signal to.sender ! signal active := FALSE ((front.queue <> rear.queue) OR (band.queue = rear.queue)) & from.sender ? CASE signal SEQ IF band.queue = rear.queue SEQ to.sender ! finish band.queue := -1 TRUE SEQ to.sender ! optimal; queue.f.v[rear.queue]; queue.v[rear.queue] so.write.string(from.isv,to.isv," OUT=") so.write.int(from.isv,to.isv,buffer[rear.queue],0) rear.queue := (rear.queue + 1) \ MAX.QUEUE TIMER timer: INT now: SEQ timer ? now timer ? AFTER now PLUS 1000000 : SEQ -- Leer el problema read.knapsack.problem(n,M,p,w) --out ! problem; 5::[3,5,7,7,8]; 5::[2,4,5,6,7]; 15 out ! problem; n::p; n::w; M clock ? time1 in ? CASE problem; n::p; n::w; M sem ! 1 so.write.string(from.isv,to.isv,"M =") so.write.int(from.isv,to.isv,M,0) sem ! 1 sem ! 1 so.write.string(from.isv,to.isv,"Q finish enviado") so.write.int(from.isv,to.isv,M,0) sem ! 1 PAR sender(q.s,s.q,out) main.queue(in,s.q,q.s) clock ? time2 BYTE result: BYTE c: SEQ --sem ! 1 so.write.string(from.isv,to.isv," Valor =") so.write.int(from.isv,to.isv,sol,0) so.write.string(from.isv,to.isv," Time =") so.write.int(from.isv,to.isv,time2 MINUS time1,0) so.write.string(from.isv,to.isv," Cont =") so.write.int(from.isv,to.isv,cont.queue,0) so.write.string(from.isv,to.isv,"*N") --sem ! 1 --sem ! 0 --so.getkey(from.isv,to.isv,c,result) so.exit(from.isv, to.isv, 0(INT32)) --sem ! 0 : VAL NUM.PROC IS 2: [10]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: PLACE ch[0] AT link1.out: PLACE ch[2] AT link3.in: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: knap.k(ch[0],ch[1],1,2) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: knap.k(ch[1],ch[2],2,2) VAL NUM.PROC IS 2: [10]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: PLACE ch[0] AT link1.out: PLACE ch[2] AT link3.in: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 CHAN OF STREAM x: PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: PAR knap.k(ch[0],x,1,4) knap.k(x,ch[1],2,4) PROCESSOR 2 T800 CHAN OF STREAM x: PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: PAR knap.k(ch[1],x,3,4) knap.k(x,ch[2],4,4) VAL NUM.PROC IS 2: [10]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: PLACE ch[0] AT link1.out: PLACE ch[2] AT link3.in: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 [2]CHAN OF STREAM x: PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: PAR knap.k(ch[0],x[0],1,6) knap.k(x[0],x[1],2,6) knap.k(x[1],ch[1],3,6) PROCESSOR 2 T800 [2]CHAN OF STREAM x: PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: PAR knap.k(ch[1],x[0],4,6) knap.k(x[0],x[1],5,6) knap.k(x[1],ch[2],6,6) VAL NUM.PROC IS 2: [10]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: PLACE ch[0] AT link1.out: PLACE ch[2] AT link3.in: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 [3]CHAN OF STREAM x: PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: PAR knap.k(ch[0],x[0],1,8) knap.k(x[0],x[1],2,8) knap.k(x[1],x[2],3,8) knap.k(x[2],ch[1],4,8) PROCESSOR 2 T800 [3]CHAN OF STREAM x: PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: PAR knap.k(ch[1],x[0],5,8) knap.k(x[0],x[1],6,8) knap.k(x[1],x[2],7,8) knap.k(x[2],ch[2],8,8) VAL NUM.PROC IS 10: [10]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: PLACE ch[0] AT link1.out: PLACE ch[2] AT link3.in: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 [4]CHAN OF STREAM x: PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: PAR knap.k(ch[0],x[0],1,NUM.PROC) knap.k(x[0],x[1],2,NUM.PROC) knap.k(x[1],x[2],3,NUM.PROC) knap.k(x[2],x[3],4,NUM.PROC) knap.k(x[3],ch[1],5,NUM.PROC) PROCESSOR 2 T800 [4]CHAN OF STREAM x: PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: PAR knap.k(ch[1],x[0],6,NUM.PROC) knap.k(x[0],x[1],7,NUM.PROC) knap.k(x[1],x[2],8,NUM.PROC) knap.k(x[2],x[3],9,NUM.PROC) knap.k(x[3],ch[2],10,NUM.PROC) VAL NUM.PROC IS 12: [10]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: PLACE ch[0] AT link1.out: PLACE ch[2] AT link3.in: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 [5]CHAN OF STREAM x: PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: PAR knap.k(ch[0],x[0],1,NUM.PROC) knap.k(x[0],x[1],2,NUM.PROC) knap.k(x[1],x[2],3,NUM.PROC) knap.k(x[2],x[3],4,NUM.PROC) knap.k(x[3],x[4],5,NUM.PROC) knap.k(x[4],ch[1],6,NUM.PROC) PROCESSOR 2 T800 [5]CHAN OF STREAM x: PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: PAR knap.k(ch[1],x[0],7,NUM.PROC) knap.k(x[0],x[1],8,NUM.PROC) knap.k(x[1],x[2],9,NUM.PROC) knap.k(x[2],x[3],10,NUM.PROC) knap.k(x[3],x[4],11,NUM.PROC) knap.k(x[4],ch[2],12,NUM.PROC) VAL NUM.TRANS IS 2: [NUM.TRANS + 1]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE ch[2] AT link3.in: PLACE ch[0] AT link1.out: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: knap.k(ch[0],ch[1],1,NUM.TRANS) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: knap.k(ch[1],ch[2],2,NUM.TRANS) VAL NUM.TRANS IS 4: [NUM.TRANS + 1]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE ch[2] AT link3.in: PLACE ch[0] AT link1.out: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: CHAN OF STREAM chx: PAR knap.1(ch[0],chx,1,NUM.TRANS) knap.k(chx,ch[1],2,NUM.TRANS) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: CHAN OF STREAM chx: PAR knap.k(ch[1],chx,3,NUM.TRANS) knap.k(chx,ch[2],4,NUM.TRANS) VAL NUM.TRANS IS 6: [NUM.TRANS + 1]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE ch[2] AT link3.in: PLACE ch[0] AT link1.out: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: [2]CHAN OF STREAM chx: PAR knap.1(ch[0],chx[0],1,NUM.TRANS) knap.k(chx[0],chx[1],2,NUM.TRANS) knap.k(chx[1],ch[1],3,NUM.TRANS) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: [2]CHAN OF STREAM chx: PAR knap.k(ch[1],chx[0],4,NUM.TRANS) knap.k(chx[0],chx[1],5,NUM.TRANS) knap.k(chx[1],ch[2],6,NUM.TRANS) VAL NUM.TRANS IS 8: [NUM.TRANS + 1]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE ch[2] AT link3.in: PLACE ch[0] AT link1.out: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: [3]CHAN OF STREAM chx: PAR knap.1(ch[0],chx[0],1,NUM.TRANS) knap.k(chx[0],chx[1],2,NUM.TRANS) knap.k(chx[1],chx[2],3,NUM.TRANS) knap.k(chx[2],ch[1],4,NUM.TRANS) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: [3]CHAN OF STREAM chx: PAR knap.k(ch[1],chx[0],5,NUM.TRANS) knap.k(chx[0],chx[1],6,NUM.TRANS) knap.k(chx[1],chx[2],7,NUM.TRANS) knap.k(chx[2],ch[2],8,NUM.TRANS) VAL NUM.TRANS IS 10: [NUM.TRANS + 1]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE ch[2] AT link3.in: PLACE ch[0] AT link1.out: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: [4]CHAN OF STREAM chx: PAR knap.1(ch[0],chx[0],1,NUM.TRANS) knap.k(chx[0],chx[1],2,NUM.TRANS) knap.k(chx[1],chx[2],3,NUM.TRANS) knap.k(chx[2],chx[3],4,NUM.TRANS) knap.k(chx[3],ch[1],5,NUM.TRANS) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: [4]CHAN OF STREAM chx: PAR knap.k(ch[1],chx[0],6,NUM.TRANS) knap.k(chx[0],chx[1],7,NUM.TRANS) knap.k(chx[1],chx[2],8,NUM.TRANS) knap.k(chx[2],chx[3],9,NUM.TRANS) knap.k(chx[3],ch[2],10,NUM.TRANS) VAL NUM.TRANS IS 12: [NUM.TRANS + 1]CHAN OF STREAM ch: PLACED PAR PROCESSOR 0 T800 CHAN OF SP from.isv,to.isv: PLACE ch[2] AT link3.in: PLACE ch[0] AT link1.out: PLACE from.isv AT link0.in: PLACE to.isv AT link0.out: queue(from.isv,to.isv,ch[2],ch[0]) PROCESSOR 1 T800 PLACE ch[0] AT link1.in: PLACE ch[1] AT link2.out: [5]CHAN OF STREAM chx: PAR knap.1(ch[0],chx[0],1,NUM.TRANS) knap.k(chx[0],chx[1],2,NUM.TRANS) knap.k(chx[1],chx[2],3,NUM.TRANS) knap.k(chx[2],chx[3],4,NUM.TRANS) knap.k(chx[3],chx[4],5,NUM.TRANS) knap.k(chx[4],ch[1],6,NUM.TRANS) PROCESSOR 2 T800 PLACE ch[1] AT link2.in: PLACE ch[2] AT link3.out: [5]CHAN OF STREAM chx: PAR knap.k(ch[1],chx[0],7,NUM.TRANS) knap.k(chx[0],chx[1],8,NUM.TRANS) knap.k(chx[1],chx[2],9,NUM.TRANS) knap.k(chx[2],chx[3],10,NUM.TRANS) knap.k(chx[3],chx[4],11,NUM.TRANS) knap.k(chx[4],ch[2],12,NUM.TRANS)