Architettura CAM 8
La CAM 8 viene definita partitioning cellular automata per sottolineare
il fatto che blocchi di celle vengono aggiornati in parallelo, mentre
all'interno di questi blocchi l'aggiornamento avviene in modo sequenziale.
I fattori che hanno portato a una realizzazione con pochi processori e molte
celle, sono imputabili al tipo di elaborazione richiesta: semplice, ma al tempo
stesso efficace, in grado di avere elevata velocità di trasferimento dati
e con architettura indefinitamente scalabile.
La CAM 8 realizza queste richieste, implementando il concetto
di materia programmabile.
Il blocco più piccolo della CAM 8 con il quale costruire la desiderata
configurazione hardware è il modulo.
Ogni modulo è responsabile del suo sector, questo è un insieme di
celle che lo stesso modulo ha il compito di aggiornare ogni volta un passo di
elaborazione venga richiesto.
Un sector ha 16 Mcells e ogni cella è composta da 16 bit.
Un modulo è costituito, oltre che dalla DRAM delle celle, anche da SRAM per
le look-up table, che nel seguito chiameremo per semplicità LUT,
e dal chip STEPchip, che è il vero nucleo elaboratore della macchina.
Per l'esecuzione corretta di tutte le funzioni lo STEPchip possiede dei registri
al suo interno, quali il registro kick o il registro scan, che sono
molto importanti e che risolvono elegantemente alcune necessità
di elaborazione altrimenti difficili da realizzare.
Le celle sono composte da pile di bit, abbiamo detto 16, e questi bit sono
organizzati in layers, cioè ogni bit di una cella vede i bits
ad uguale profondità delle altre celle: il primo bit della pila
di una cella è in relazione con tutti i primi bit delle celle della CAM 8,
formando il primo layer, e così per ogni posizione di profondità,
come in figura 1.

L'aggiornamento o update dei siti avviene tramite LUT:
- ogni sito viene valutato
- con il suo valore viene puntata la LUT
- all'indirizzo corrispondente nella LUT viene estratto il nuovo valore
- il nuovo valore viene memorizzato nel sito
Questo per l'aggiornamento. La LUT quindi è responsabile dell'applicazione
della regola e quindi verrà costruita in base a quest'ultima, considerando
ogni ingresso dei 2^16 possibili valori: ad ogni possibile ingresso viene
precalcolato il risultato e con l'insieme dei risultati viene redatta la tabella
di update.
La costruzione di questa tabella è compiuta da un host al quale la CAM 8
è collegata tramite il TBus, un bus progettato appositamente che verrà
affrontato più avanti nel paragrafo tbus.
Una volta costruita, questa tabella viene trasmessa alla macchina e da questa
memorizzata nella SRAM.
L'aggiornamento, e quindi la tabella, dovrà tenere conto dello stato dei
siti e del loro vicinato, come vuole la teoria degli automi cellulari.
Nella CAM 8 il vicinato non è direttamente visibile come si potrebbe
supporre, ma proprio in questo punto sta la forza di questa macchina.
Invero i siti sono rappresentati da uno stato a 16 bit ognuno dei quali
appartiene ad un diverso layer formando 16 layers estesi su tutto lo
spazio dei siti; questi layers possono scorrere uno rispetto all'altro.
Alla gestione di questi layers sono preposti gli STEPchips, uno per ogni layer.
Quindi, immaginando che lo stato di un sito possa essere rappresentato con un
unico bit, al momento dell'update si copia il layer, che contiene lo stato dei
siti, negli altri layers ed è quindi possibile rendere visibile ad ogni sito
il suo vicinato semplicemente facendo scorrere i layers uno rispetto all'altro,
della quantità e nella direzione opportuna, come mostrato in figura 2.
Questo punto verrà approfondito nel paragrafo kick.

Riassumendo, una cella della CAM 8 non vede direttamente lo stato di una cella
vicina, ma una sua copia direttamente nel suo spazio di stato.
Questo libera l'utilizzatore da vincoli di vicinato, rendendo possibile vedere
anche siti lontani e nel modo più veloce possibile, cioè semplicemente
incrementando un registro, senza nessun trasferimento dati.
Un'implementazione di regole come quella HPP è semplicissima: è
sufficiente assegnare ad ogni movimento possibile, cioè verso nord, sud,
est o ovest, un layer, e le particelle che sono su questi layers subiranno
questi spostamenti fino a quando non verrà verificata la presenza su due
layers differenti di due particelle, e la regola di update semplicemente
sposterà come dovuto le particelle da un layer a un altro, facendole
proseguire su cammini diversi.
Scan
Focalizziamo la nostra attenzione su un singolo modulo.
All'interno di questo modulo l'update dei posti avviene in modo sequenziale.
L'ordine nel quale viene compiuto l'update non è importante, poiché il
risultato è indipendente da esso.
L'ordine può essere modificato per produrre effetti di visualizzazione,
ad esempio un ingrandimento.
Il settore assegnato al modulo non è rigido, ma è possibile dividerlo in
sottosettori ciascuno dei quali usa la sua LUT per l'update.
Lo scan è però indivisibile e ininterrompibile: esso è quell'azione
che permette alla CAM 8 di considerare tutto il suo spazio di simulazione e di
compiere su di esso ogni operazione necessaria.
Questo viene svolto generando una sequenza di indirizzi di celle, autonomamente
compiuta e temporizzata dal modulo.
Funzionalmente lo scan è compiuto dallo scan index register SIR, un
contatore autoincrementante a 24 bit che genera gli indirizzi di cella, si
veda la figura 3.
Il SIR punta alla DRAM delle celle, estrae il contenuto, con il contenuto si
indirizza la SRAM della LUT, estraggo il nuovo stato dalla LUT e questo viene
memorizzato nella cella ancora puntata da SIR, che poi si autoincrementa
puntando alla cella successiva.

Un registro end of scan pointer indica quando lo scan è terminato,
permettendo così di limitare lo scan a una zona particolare.
Il SIR viene combinato con il registro scan index permuter in modo da
poter cambiare l'ordine di scan, vedere la figura 4, e con questo
generare il site address finale, cioè l'indirizzo di una particolare
cella memorizzata nella DRAM.

Ogni STEPchip ha quindi questi registri che compiono lo scan dei siti,
prendendosi cura di aggiornare uno dei 16 layers.
Lo scan comunque non serve solo durante l'aggiornamento, vedremo più avanti
che ogni volta voglia considerare la totalità delle celle per riscriverle,
inizializzarle, aggiornarle, visualizzarle il meccanismo di scan sarà
indispensabile.
Kicking
I vari layers hanno nella CAM 8 la capacità di scorrere uno rispetto
all'altro.
Questa caratteristica importante, che rende agile la programmazione, viene
chiamata kicking.
Il kicking viene eseguito tramite due registri: il registro offset e il
registro kick.
Ogni STEPchip ha questa coppia di registri e li utilizza per la gestione del
proprio layer.
Offset interviene sulla formazione del site address, indirizzo fisico
delle celle, mentre kick agisce su offset, rendendo semplice la gestione di
quest'ultimo.
Ogni volta che viene formato un site address per indirizzare la DRAM, ad
esempio durante uno scan, in ogni STEPchip l'offset viene sommato all'indirizzo
fornito e con questo nuovo valore si estrae il dato, come in figura 5.

Durante lo scan quindi ad ogni indirizzo viene sommato l'offset, e visto che
ogni STEPchip ha il suo offset posso agire con estrema libertà e
maneggevolezza: lo scorrere dei layer è implementato semplicemente cambiando
l'offset.
Ad ogni scan l'offset dovrà essere incrementato o diminuito in base allo
scorrimento voluto; questo sarebbe un compito gravoso se non fosse effettuato
dal registro kick, che automaticamente corregge il registro offset.

L'array delle celle può essere reso multidimensionale, agendo sul registro
Dimension Cut Mask, il quale contiene un 1 laddove una dimensione finisce
e ne comincia un'altra.

Con riferimento alla figura 7, l'ottavo bit è impostato
ad uno, così la prima dimensione viene individuata attraverso i primi otto
bits del site address.
L'effetto di questi tagli operati da Dimension Cut Mask è quello di
scorrelare due parti del site address in modo che possano essere autonomi
(vedere figura 8).

Non essendo lo spazio di celle infinito, bisogna gestire in qualche modo i bordi
dello spazio delle celle: uno shift delle celle ai bordi sarebbe indefinito se
non fornissi un metodo di controllo.
Lo STEPchip si occupa anche di questo e questa gestione prende il nome di
gluing, affrontata nel seguente paragrafo.
Gluing
Il discorso sul gluing è forse il più complicato per quanto
riguarda la CAM 8.
Restringendo l'attenzione a un singolo isolato settore, l'effetto di un kick
sarà uno shift circolare dei dati del settore.
Così, i siti che all'estrema sinistra del settore sono traslati all'esterno,
vengono successivamente inseriti all'estremità opposta dello stesso settore.
Immaginando uno spazio più ampio con molti settori, i siti che escono
da uno di questi, traslati all'esterno da un kick, vengono inseriti all'interno
del settore adiacente, secondo le connessioni volute.
La glue è proprio quel procedimento che permette di shiftare i dati da un
modulo a un altro, realizzando un grande nastro trasportatore.
Le connessioni sono completamente riprogrammabili attraverso dei registri
appositi per raggiungere ogni tipo di configurazione voluta, anche la più
contorta, come ad esempio uno spazio elicoidale.
Ingressi
La CAM 8 sarebbe limitata se tutto quello che potesse fare con le proprie celle
fosse usare il contenuto della DRAM per indirizzare la LUT.
Per esempio, come potrei inizializzare lo spazio con dei valori a mia scelta?
Il normale funzionamento della CAM 8 è l'update tramite LUT, ma sono state
previsti, proprio per venire incontro a esigenze disparate, altri tipi di
ingressi, in tutto quattro, che possono cambiare lo stato delle celle.
Ognuno di questi quattro ingressi può essere combinato con lo stato
antecedente della cella per calcolare il nuovo stato.
I possibili ingressi sono:
- Unglued data
- Host
- Flywheel
- LUT
Il primo tipo di ingresso entra in gioco quando non si vuole realizzare nessuna
connessione glued con altri moduli, i dati shiftati sono così riportati
allo stesso settore, e proprio per questo comportamento viene chiamato unglued.
Il secondo tipo, Host, viene utilizzato per trasferire dati dal computer
host, al quale i moduli CAM 8 sono collegati, agli stessi moduli, per modificare
tutto o in parte lo spazio dei siti.
Quando il computer host vuole scrivere direttamente nella DRAM, esso scrive
nello Scan IO Register, e la cella puntata dallo Scan Index Register viene
impostata al valore del SIOR.
In questa operazione viene tenuto conto anche dell'offset, per non perdere le
potenzialità del meccanismo di kick.
Il terzo tipo, Flywheel, permette ad un sistema di acquisizione di
inserire dati direttamente all'interno delle celle,
ad esempio una telecamera puo' riempire lo spazio dei siti con una immagine.
Infine, l'ultimo tipo, LUT, è l'ingresso normalmente usato: un update
compiuto attraverso regole memorizza nei siti questo tipo di dati.
Quindi, come si può notare, per ogni esigenza esiste un ingresso ottimizzato
per quel compito, e ciò rende l'acquisizione molto rapida.
Inoltre le sorgenti selezionate possono essere combinate con i dati Glued,
tramite una funzione booleana scelta tra 16 possibili.
Ogni STEPchip ha cinque registri Destination Select, che selezionano
uno dei quattro possibili ingressi, e cinque corrispondenti registri
Destination Map, che selezionano una delle 16 funzioni booleane per
combinare l'ingresso scelto con i dati glued, per produrre il nuovo valore per
la destinazione.
Destinazioni
Così come per gli ingressi, anche per le uscite sono state pensate soluzioni
ottimali per varie necessità.
Più che uscite bisogna parlare in queste caso di destinazioni,
il termine è certamente più appropriato, poiché in alcuni casi
non si ha una vera e propria uscita di informazioni verso l'esterno,
così come, a dire il vero, anche per l'ingresso LUT non si ha un vero
ingresso esterno, ma noi consideriamo le celle come la parte più
significativa del nostro esperimento, quindi possiamo riferirci ad esse quando
parliamo di ingressi e di uscite
Le destinazioni sono di cinque tipi:
- Lookup Table Address
- Flywheel Output
- Site Data
- Event Count
- Display
Il primo tipo, LUT address, è costruito combinando i singoli bit che ogni
STEPchip genera, che non sono altro che i bit che compongono lo stato della
cella, o per meglio dire i valori che una cella assume sui vari layer.
Infatti l'incaricato di gestire un singolo layer è proprio lo STEPchip,
ed esso, durante uno scan, attraversa tutte le posizioni ed estrae
il bit corrispondente all'indirizzo di scan e quest'ultimo combinato con gli
altri bits forniti dagli altri 15 STEPchip formano il LUT address a 16 bit
(vedere figura 8).
Il LUT adress servirà poi per puntare alla SRAM ed estrarre il nuovo stato
della cella in questione.
Il secondo tipo, Flywheel Output, è un meccanismo di uscita degli stati
delle celle che li rende disponibili a un dispositivo esterno.
Il terzo tipo, Site Data, è la normale destinazione delle elaborazioni:
i dati vengono scritti nelle celle tenendo conto degli offset.
Il quarto tipo, Event Count, è forse il più interessante, perché
permette di verificare alcune situazioni particolari automaticamente, senza
alcun bisogno di ulteriori elaborazioni.
Ogni STEPchip mantiene aggiornato un contatore di eventi, che può essere
visto come una destinazione, dove i dati non vengono scritti, ma contati.
L'ultimo tipo, Display, è il meccanismo col quale gli stati delle celle
vengono riportati al computer host, presumibilmente, ma non necessariamente,
per scopi di visualizzazione.
Così come il SIOR serviva all'host per scrivere
le celle direttamente, l'host può leggere il SIOR mentre il SIR scandisce
tutte le celle.
Conteggio degli eventi
Quando si svolgono delle simulazione la parte più importante del lavoro
è senz'altro l'interpretazione dei risultati.
I risultati di una elaborazione tramite automi cellulari saranno ovviamente
immagini o pattern visibili su uno schermo tramite un computer host.
Spesso però non basta avere una visione globale di quello che è
successo al nostro pattern iniziale.
La CAM 8 ha al suo interno una serie di registri che possono agevolare il lavoro
di interpretazione: essi sono in grado di contare il verificarsi di eventi,
decisi dallo sperimentatore, con ampia possibilità di scelta.
Ognuno dei 16 layer della CAM 8 conta il numero di volte che una specificata
funzione booleana tra due sorgenti interne viene verificata.
Una sorgente è il sito, mentre la seconda è determinata dal registro
Event Source, il quale è composto da due sottoregistri: Event
Source.Select ed Event Source.Map.
Il primo ovviamente sceglie il secondo ingresso tra questi quattro tipi:
- unglued
- host
- flywheel input
- lut output
di cui abbiamo già affrontato i significati.
Il secondo sottoregistro è impiegato per specificare la desiderata funzione
logica impostato attraverso comandi specifici che vengono affrontati
nel CAMForth.
Tbus
L'attività dei moduli CAM 8 è governata e controllata da un computer
host.
Questo è una Sun SPARCstation, la quale ha un bus esterno ad alte
prestazioni chiamato SBus.
Ogni controllo sui moduli è mediato dallo STEP controller, una scheda
fisicamente connessa sull'SBus .
Lo STEP controller a sua volte invia i comandi ai moduli tramite il TBus, un
bus proprietario tree-like appositamente ideato per questo scopo.
Guardando la figura 9 si nota che lo STEP controller è
la radice dell'albero, mentre i moduli sono le foglie.

Il TBus può essere realizzato bilanciato o sbilanciato.
Nel caso di bus bilanciato siamo sicuri che i comandi arrivano ai moduli in
perfetta sincronia, quindi non è necessario occuparsi di tali problemi.
Invece nell'albero sbilanciato ad alcuni moduli i comandi arriveranno prima
che ad altri, quindi dovremo inserire dei ritardi di esecuzione calibrati nei
moduli vicini alla radice.
L'inserimento dei ritardi avviene tramite registri degli STEPchips chiamati
Hardware Environment Register, per maggiori dettagli vedere
la documentazione STEP1.