Tesi Robotica Analisi, progettazione e implementazione... | Page 145

i i “LP_Tesi” — 2013/10/17 — 18:27 — page 145 — #145 i 6.2. IMPLEMENTAZIONE i 145 Algoritmo 6.18 Regole per il Backtrack 1 2 3 4 5 6 7 8 (∗ conflict_free ="bt1,bt2,bt3" ∗) rule bt1 (step==2 && fromMaybe(?, resp.wget())==NORTH); size <=size−1; addr<=addr−size; divC<=row−1; modC<=col; fout .enq(DirAddr{dir:BLUE,col:col,row:row}); step<=1; endrule 9 10 11 12 13 14 15 16 rule bt2 (step==2 && fromMaybe(?, resp.wget())==NORTHWEST); size <=size−1; addr<=addr−size−1; divC<=row−1; modC<=col−1; fout .enq(DirAddr{dir:GREEN,col:col,row:row}); step<=1; endrule 17 18 19 20 21 22 23 rule bt3 (step==2 && fromMaybe(?, resp.wget())==WEST); addr<=addr−1; divC<=row; modC<=col−1; fout .enq(DirAddr{dir:RED,col:col,row:row}); step<=1; endrule la colonna del ciclo di clock precedente. Una volta che la richiesta di lettura è stata effettuata, al ciclo di clock successivo, una delle regole presenti in Alg:6.18 gestisce questo valore. Le regole devono essere definite conflict free perché il compilatore non è in grado di inferire la loro mutua esclusività. Ognuna delle regole gestisce uno dei tre casi possibili, l’unica differenza che può essere notata è l’aggiornamento dei registri divC e modC, nel caso di un NORTH il registro divC (indice di riga) deve essere decrementato mentre modC (indice di colonna) rimane invariato, nel caso di NORTHWEST entrambi devono essere decrementati perché il movimento è in diagonale, infine nel caso di WEST solo modC deve essere decrementato. Una volta che il Backtrack ha raggiunto l’estremità sinistra della matrice è necessario effettuare una fase di post tracking per raggiungere l’elemento di indice (0,0), a questo scopo sono state implementate le due regole presenti in Alg:6.19 e Alg:6.20 . Mentre postTrackDiag gestisce il caso in cui il Backtrack ha raggiunto il limite superiore sinistro della matrice, la regola postTrackNorth gestisce il caso in cui il Backtrack ha raggiunto uno qualsiasi degli altri elementi i i i i