UNIVERSITA DEGLI STUDI DI FIRENZE Facolta di Ingegneria - Dipartimento di Sistemi e informatica Tesi di laurea in Ingegneria Elettronica Verifica di Strutture a Bus con Modular Time Petri Nets Candidato Marco Lusini Relatori Prof. Giacomo Bucci Prof. Alberto Del Bimbo Correlatore Ing. Enrico Vicario Anno Accademico 1996{1997 A mio nonno Oris. Firenze, 14 luglio 1995 Indice 1 Introduzione 2 Modular Time Petri Net 2.1 Time Petri Net . . . . . . . . . . 2.1.1 Descrizione formale . . . . 2.1.2 Un esempio . . . . . . . . 2.2 Communicating Time Petri Net . 2.2.1 Descrizione formale . . . . 2.2.2 Required Interface . . . . 2.2.3 Provided Interface . . . . 2.2.4 Un esempio . . . . . . . . 2.3 Modular Time Petri Net . . . . . 2.3.1 Descrizione formale . . . . 2.3.2 Un esempio . . . . . . . . 3 Analisi di MTPN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 Classi di stati e Domini di esecuzione . . . . . . . . 3.2 Costruzione del grafo degli stati . . . . . . . . . . . 3.2.1 Dominio ristretto . . . . . . . . . . . . . . . 3.2.2 Algoritmo di costruzione . . . . . . . . . . . 3.3 Integrazione dei gra . . . . . . . . . . . . . . . . . 3.3.1 Calcolo dello stato successore . . . . . . . . 3.3.2 Calcolo del dominio di esecuzione . . . . . . 3.3.3 Errori di integrazione . . . . . . . . . . . . 3.3.4 Veri ca delle interfacce attese . . . . . . . . 3.4 Analisi temporale . . . . . . . . . . . . . . . . . . . 3.4.1 Traccia di esecuzione . . . . . . . . . . . . . 3.4.2 Algoritmo di stima a stato singolo . . . . . 3.4.3 Algoritmo di stima a stato globale . . . . . 3.5 Costruzione di interfacce oerte . . . . . . . . . . . 3.5.1 Enumerazione automatica di tracce . . . . . 3.5.2 Algoritmo per il calcolo di interfacce oerte 3.6 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 4 4 5 7 8 9 11 13 15 18 19 22 24 24 25 25 25 26 26 27 27 28 28 29 29 30 31 32 33 34 4 Modellazione di Bus con MTPN 4.1 I Bus nei sistemi a microprocessore . . . . . . . . . . . . . 4.1.1 Speci ca del protocollo di un bus . . . . . . . . . . 4.2 Modellazione dei componenti di un bus . . . . . . . . . . . 4.2.1 Segnali di controllo per il trasferimento dati . . . . 4.2.2 Segnali di controllo per l' accesso al bus . . . . . . 4.2.3 Segnali di interruzione . . . . . . . . . . . . . . . . 4.2.4 Segnali ausiliari . . . . . . . . . . . . . . . . . . . . 4.3 Un' esempio: il bus VME . . . . . . . . . . . . . . . . . . 4.3.1 Descrizione dei segnali del bus VME . . . . . . . . 4.3.2 Funzionamento del bus VME . . . . . . . . . . . . 4.3.3 Il protocollo per il trasferimento dati nel bus VME 4.3.4 Il protocollo per l' arbitraggio nel bus VME . . . . 5 Sistema software 5.1 Le classi implementate . . . . . . . 5.1.1 Classi base . . . . . . . . . 5.1.2 Classi dei gra degli stati . 5.1.3 Classi di analisi . . . . . . . 5.2 Documentazione delle Classi . . . . 5.3 Un esempio d' uso . . . . . . . . . 5.3.1 Listato di testpgSTRS.cpp 5.3.2 Listato di testigBUS.cpp . Conclusioni Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 43 45 45 49 54 54 58 58 60 61 65 . . . . . . . . . . . . . . . . . . . . . . . . . 70 . 70 . 71 . 72 . 72 . 103 . 103 . 108 70 117 118 iii Elenco delle gure 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 Il modello TPN di un protocollo stop and wait . . . . . Rappresentazione modulare del protocollo di Stenning . Il modulo source del protocollo di Stenning . . . . . . . Il modulo TX del protocollo di Stenning . . . . . . . . . Il modulo RX del protocollo di Stenning . . . . . . . . . Il modulo sink del protocollo di Stenning . . . . . . . . . Modello di due processi in competizione per una risorsa Modello del monitor della risorsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 15 15 16 17 18 22 22 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 Algoritmo di generazione del grafo degli stati . . . . . . . . . . Algoritmo di stima a stato singolo . . . . . . . . . . . . . . . . Algoritmo di stima a stato globale . . . . . . . . . . . . . . . . Algoritmo di enumerazione automatica delle tracce . . . . . . . Algoritmo di calcolo delle interfacce oerte . . . . . . . . . . . Grafo del modello del protocollo stop and wait . . . . . . . . . Grafo del modello della sorgente nel protocollo di Stenning . . Grafo del modello della destinazione nel protocollo di Stenning Grafo del modello del trasmettitore nel protocollo di Stenning . Grafo del modello del ricevitore nel protocollo di Stenning . . . Grafo dell' integrazione tra source e TX . . . . . . . . . . . . . Grafo dell' integrazione tra RX e sink . . . . . . . . . . . . . . Grafo del modello del protocollo di Stenning . . . . . . . . . . . . . . . . . . . . . . . . 26 30 32 33 34 35 36 36 37 38 39 40 41 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 Trasferimento di dati sincrono . . . . . . . . . . . . . . . . . . . Modello di un trasferimento di dati sincrono . . . . . . . . . . . Trasferimento di dati asincrono . . . . . . . . . . . . . . . . . . Modello di un trasferimento di dati asincrono non-interlocking . Modello di un trasferimento di dati asincrono half-interlocking . Modello di un trasferimento di dati asincrono fully-interlocking Trasferimento di dati semisincrono . . . . . . . . . . . . . . . . Modello di un trasferimento di dati semisincrono . . . . . . . . Arbitraggio seriale del bus con due linee . . . . . . . . . . . . . Modello di accesso al bus seriale a due linee . . . . . . . . . . . Arbitraggio seriale del bus con tre linee . . . . . . . . . . . . . Modello di accesso al bus seriale a tre linee . . . . . . . . . . . Arbitraggio del bus tramite richieste indipendenti . . . . . . . . Modello di accesso al bus tramite richieste indipendenti . . . . . . . . . . . . . . . . . . 46 46 47 47 48 48 49 50 50 52 53 53 54 55 iv . . . . . . . . . . . . . . . . . . . . . . . . 4.15 4.16 4.17 4.18 4.19 4.20 4.21 4.22 4.23 4.24 4.25 4.26 Interruzioni tramite richieste indipendenti . . . . . . . . . . . . . Modello di interruzioni tramite richieste indipendenti . . . . . . . Interruzioni vettorizzate . . . . . . . . . . . . . . . . . . . . . . . Modello di interruzioni vettorizzate . . . . . . . . . . . . . . . . . Modello di lettura di un byte nel bus VME . . . . . . . . . . . . Modello del modulo di controllo del trasferimento dati su bus VME Modello del modulo master nel trasferimento dati su bus VME . Modello del modulo slave nel trasferimento dati su bus VME . . Modello dell' arbitraggio del bus VME . . . . . . . . . . . . . . . Modello del modulo di controllo dell' arbitraggio del bus VME . Modello del modulo master nell' arbitraggio del bus VME . . . . Modello parziale del modulo arbitro del bus VME . . . . . . . . 56 56 56 57 61 62 63 64 65 66 67 68 5.1 Grafo delle classi . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 v Capitolo 1 Introduzione Un sistema su bus si compone di un insieme di moduli che scambiano informazione su una struttura di comunicazione condivisa18]. E' tipicamente un sistema complesso tramite cui avvengono trasferimenti di dati, sincronizzazioni, interruzioni, e contese per il controllo della struttura. Non esistendo una sequenza pre ssata di eventi, ne una pre-ordinata sequenzializzazione delle azioni compiute nei singoli moduli, la composizione di tutte queste attivita risulta in un comportamento sequenziale di cui non e possibile avere una percezione esaustiva al momento della progettazione, e di cui e dicile eseguire una analisi nella fase di validazione del progetto. La simulazione e il modo comune con cui viene arontato il problema. Per simulazione e possibile compiere una fase di testing nella quale il comportamento del sistema e osservato in corrispondenza di appropriate sequenze di ingressi. Tuttavia, per eetto della molteplicita di cammini dovuti alle inerenti caratteristiche di parallelismo e concorrenza, questo approccio risulta estremamente oneroso, e, in ogni caso, non permette l' accertamento esaustivo della correttezza ma solo l' identi cazione di errori che occorrono sui cammini di esecuzione piu comuni1]. Nell' intento di permettere una veri ca di tipo esaustivo e stato proposto l' impiego di tecniche di analisi formale prese a prestito dall' area dell' ingegneria del software. Una area in cui tali tecniche sono state applicate con successo e quella dei cosiddetti sistemi speed-independent, ovvero quei sistemi nei quali il corretto funzionamento deve essere garantito in maniera indipendente dalle temporizzazioni dei singoli componenti. Questa assunzione si applica a tutti quei sistemi dove le sincronizzazioni tra i moduli passano sempre attraverso un handshaking esplicito, senza mai fare assunzioni sul tempo impiegato dai moduli per trasmettere e ricevere dati. Un esempio classico in questo senso sono le self-timed queues proposte per la realizzazione di architetture parallele dataow40]. In un sistema speed-independent, per la validazione del progetto e suciente analizzare gli ordinamenti qualitativi che esistono nell' insieme delle possibili esecuzioni del sistema, analizzando le possibili sequenzializzazioni tra eventi senza considerare quantitativamente il tempo che intercorre tra essi. Tra le varie tecniche proposte per questo tipo di analisi, un ruolo di prima rilevanza e 1 CAPITOLO 1. INTRODUZIONE quello delle cosiddette tecniche di model checking, sia per la maturita acquisita che per la applicabilita a casi di complessita realistica. Brevemente, l' approccio puo essere descritto in tre passi: il sistema sottoposto a veri ca viene rappresentato nella forma di un modello a stati16]23] i requisiti di correttezza sono espressi nella forma di predicati di Logica Temporale combinando espressioni logiche Booleane classiche con operatori di sequenzializzazione temporale8] un algoritmo, detto di model checking, veri ca in maniera automatica se le asserzioni di Logica Temporale sono soddisfatte dal Diagramma di Transizione15]. Nell' ultimo decennio, questo approccio ha raggiunto una sostanziale maturita attraverso lo sviluppo di: (a) notazioni e tecniche di analisi di raggiungibilita in grado di rappresentare un sistema attraverso un modello a stati (b) Logiche Temporali adatte ai diversi contesti di applicazione e (c) algoritmi di modelchecking in grado di analizzare in modo eciente sistemi no all' ordine dei 107 stati e oltre21]. Purtroppo, un tale approccio non risulta applicabile all' analisi dei cosiddetti sistemi tempo-dipendenti, nei quali la correttezza del funzionamento dipende in modo esplicito dalle temporizzazioni dei suoi componenti. Questo e il caso di una vasta maggioranza dei sistemi a bus. In tali sistemi, assunzioni sulle temporizzazioni dei moduli sono comunemente considerate con il ne di sempli care l' handshaking tra i componenti e ottimizzare la prestazione del sistema18]. Per l' analisi di sistemi tempo-dipendenti e stata proposta l' opportunita di de nire tecniche di model checking in grado di tenere conto non solo della sequenzializzazione qualitativa che interviene tra le azioni del sistema, ma anche del tempo quantitativo che intercorre tra esse. In questo intento, sono state proposte in letteratura diverse Logiche Temporali real-time con vincoli quantitativi sul tempo tra gli eventi20], notazioni capaci di esprimere modelli a stati con vincoli temporali quantitativi20]6], e tecniche di analisi di raggiungibilita in grado di generare lo spazio degli stati temporizzati di un sistema. In questo ambito, due tecniche di maggiore rilevanza sono state proposte per l' enumerazione dello spazio degli stati di modelli espressi come macchine a stati temporizzate6]4] o come Time Petri Nets32]31]. In particolare, usando modelli Time Petri Nets, la sincronizzazione fra le azioni e espressa in funzione di un insieme di pre e post-condizioni che sono associate separatamente con le singole azioni del sistema, e i vincoli di temporizzazione sono espressi nella forma di tempi minimi e massimi che intercorrono tra l' istante in cui una azione e abilitata e quello in cui l' azione viene eseguita. Questo facilita la progettazione del modello permettendone una rappresentazione compatta che modella direttamente le condizioni di concorrenza e parallelismo senza richiedere l' enumerazione esplicita degli stati globali del sistema. 2 CAPITOLO 1. INTRODUZIONE Per l' analisi di raggiungibilita di modelli Time Petri Net e stata proposta una tecnica esaustiva che enumera classi di stati, ciascuna delle quali colleziona una in nita densa di stati con diverse temporizzazioni9]. Tale tecnica e stata estesa in senso composizionale in 45]13] per permettere l' analisi di sistemi modulari complessi. Il modello modulare proposto in 13] considera la modellazione di sistemi software dove la comunicazione si basa su meccanismi di message passing. Questo non basta per la modellazione di sistemi hardware dove la comunicazione segue una semantica diversa: un modulo genera un segnale e gli altri lo condividono in lettura. Abbiamo quindi esteso la semantica del modello in modo da aderire ai requisiti espressivi incontrati nella modellazione di architetture a bus, fornendo al modello la possibilita di comunicare tramite segnali accessibili da piu moduli, ed allo stesso tempo mantenendo inalterate le possibilita di analisi esaustiva esposte in 13]. Abbiamo implementato le tecniche di analisi del modello esteso in un sistema software, realizzando cos un nucleo di analisi che permette la generazione composizionale dello spazio degli stati e la valutazione di pro li di temporizzazione per le possibili sequenze di esecuzione del modello. A veri ca dell' espressivita del modello esteso abbiamo provato la sua capacita espressiva nella modellazione dei meccanismi basilari incontrati nella progettazione di bus per microcomputer e come caso concreto di applicazione e stato modellato ed analizzato il bus VME di Motorola. Organizzazione del lavoro Nel capitolo 2 vengono introdotte le Modular Time Petri Net come evoluzione delle Time Petri Net e delle Communicating Time Petri Net. Per ciascuna di tali classi di reti viene fornita una descrizione formale e viene discusso un semplice esempio. Nel capitolo 3 le tecniche proposte in 9] e 13] sono estese in modo da permettere l' analisi di modelli Modular Time Petri Net. Per ciascuna tecnica viene fornito un algoritmo di implementazione. La descrizione e esempli cata attraverso l' analisi delle reti del capitolo 2. Nel capitolo 4 le Modular Time Petri Net sono applicate alla modellazione di tutti i meccanismi di comunicazione e sincronizzazione che concorrono al funzionamento di una generica architettura a bus per microcomputer. Questo permette di veri care l' adeguatezza della espressivita del modello proposto. Come caso di studio concreto viene considerato il bus VME di Motorola. Di questo viene fornita una descrizione generale ed un modello Modular Time Petri Net dei meccanismi di arbitraggio e di trasferimento dati. Nel capitolo 5 vengono illustrati i principi di organizzazione del sistema software che implementa le tecniche di analisi descritte, e viene fornita una documentazione estensiva delle classi che lo compongono. 3 Capitolo 2 Modular Time Petri Net 2.1 Time Petri Net Le reti di Petri3]33]36] permettono di modellare attivita concorrenti e parallele, rappresentandole sotto forma di un insieme di regole di pre e post condizioni. Una rete di Petri (Petri Net) e un grafo orientato composto da due tipi di nodi: le piazze (place) e le transizioni (transition). Transizioni e piazze sono collegate da archi che possono essere di due tipi: Arco di pre-condizione: collega una piazza ad una transizione. La piazza e detta di ingresso per la transizione. Arco di post-condizione: collega una transizione ad una piazza. La piazza e detta di uscita per la transizione. Una piazza e un accumulatore di gettoni (token), gettoni che servono ad abilitare l' esecuzione delle transizioni e che sono spostati proprio da tali esecuzioni. Una transizione e abilitata (enabled) se tutte le sue piazze di ingresso contengono almeno un gettone e nessuna delle sue piazze di inibizione contiene dei gettoni. Una transizione abilitata puo eseguire (re) e nell' esecuzione rimuove un gettone da ogni piazza di ingresso e ne aggiunge uno ad ogni piazza di uscita. Dopo una esecuzione, le transizioni abilitate possono essere persistenti (persistent) o appena abilitate (newly enabled), a seconda che siano rimaste sempre abilitate durante le fasi di rimozione ed aggiunta di gettoni, oppure siano state abilitate durante una di queste fasi1 . Per permettere di esprimere relazioni di priorita tra le transizioni del modello, si estende il modello originale con l' aggiunta di un terzo tipo di arco33]: Arco di inibizione: collega una piazza ad una transizione. La piazza e detta di inibizione per la transizione. Una rete di Petri consente di modellare molto bene processi con vincoli di sincronizzazione e mutua esclusione, ma non considera in alcun modo il tempo. Tutto quello che il modello dice di una transizione in un certo stato e che prima 1 Una transizione che dopo la propria esecuzione e ancora abilitata viene considerate appena abilitata. 4 CAPITOLO 2. MODULAR TIME PETRI NET o poi esegue oppure che non esegue mai, senza dare indicazioni precise sull' eettivo tempo all' esecuzione (time to re) della transizione. Per aggiungere espressivita al modello e renderlo capace di catturare vincoli sui tempi massimi e minimi di esecuzione, sono state introdotte le Time Petri Net (TPN). Queste aggiungono al modello base dei vincoli sul tempo di esecuzione delle transizioni una volta che queste sono innescate, imponendo che una transizione non possa eseguire prima che sia passato un tempo minimo eft (earliest ring time) da quando e stata abilitata e che non possa rimanere abilitata per piu di un tempo massimo lft (latest ring time) senza eseguire. Alla coppia di tempi eft,lft] viene dato il nome di intervallo di esecuzione (ring interval). Per tenere in conto questi vincoli, lo stato di una TPN associa ad ogni transizione una coppia di variabili di stato, l' intervallo di esecuzione dinamico, ed una coppia di costanti, l' intervallo di esecuzione statico. L' intervallo di esecuzione dinamico viene resettato al valore dell' intervallo statico ogni volta che la transizione viene abilitata e viene poi ridotto al passare del tempo. In ogni istante l' intervallo di esecuzione dinamico rappresenta il minimo ed il massimo del tempo all' esecuzione della transizione. 2.1.1 Descrizione formale Sintassi Una Time Petri Net e una 4-tupla TPN =< P T A FI s > dove: P e l' insieme delle piazze della rete. T e l' insieme delle transizioni della rete. A e l' insieme degli archi di pre-condizione, post-condizione ed inibitori: A (P T ) (T P ) FI s e la relazione che associa ad ogni transizione il suo intervallo di esecuzione statico EFT s ,LFT s]: FI s : T ! R+ (R+ f1g) Semantica Il comportamento dinamico di una TPN e rispecchiato nei cambiamenti che avvengono nello stato della rete al passare del tempo ed all' esecuzione delle transizioni. Lo stato della rete e una una coppia S =< M FI d > dove: 5 CAPITOLO 2. MODULAR TIME PETRI NET M e la funzione marcamento (marking) che associa ad ogni piazza il numero (non negativo )di gettoni che contiene: M : P ! N+ FI d e la relazione che associa ad ogni transizione il suo intervallo di esecuzione dinamico EFT d ,LFT d ]: FI s : T ! R+ (R+ f1g) La rete si evolve nel tempo in accordo con le seguenti regole che stabiliscono quali sono le transizioni eseguibili e quali sono i cambiamenti che l' esecuzione di una transizione comporta nello stato S : Eseguibilita: una transizione t0 e abilitata se tutte le sue piazze di ingresso contengono almeno un gettone e nessuna delle sue piazze di inibizione contiene dei gettoni. Una transizione t0 abilitata e eseguibile se il suo EFT d e minore del LFT d di ogni altra transizione nello stato S . Progresso: qualunque transizione t0 eseguibile nello stato S puo eseguire con un tempo di esecuzione (t0 ) che deve essere maggiore dell' EFT d di t0 stessa e deve essere minore del LFT d di qualunque altra transizione abilitata. Esecuzione: quando la transizione t0 esegue, si deve calcolare il nuovo stato della rete, il che comporta calcolare il nuovo marcamento delle piazze ed aggiornare gli intervalli dinamici di esecuzione. Quest' ultima operazione avviene in maniera diversa per le transizioni persistenti e per quelle appena abilitate: 1. si rimuove un gettone da tutte le piazze di ingresso per t0 . 2. si aggiunge un gettone a tutte le piazze di uscita per t0 . 3. per ogni transizione appena abilitata si resetta l' intervallo di esecuzione dinamico al suo valore statico: EFT d := EFT s LFT d := LFT s 0 0 4. per ogni transizione persistente si trasla a sinistra l' intervallo di esecuzione del valore del tempo all' esecuzione (t0 ) con cui esegue t0 : EFT d := maxf0 EFT d ; (t0 )g LFT d := maxf0 LFT d ; (t0 )g 0 0 Tutti i passi sopra elencati sono eseguiti in maniera atomica. 6 CAPITOLO 2. MODULAR TIME PETRI NET t6 2 4] t0 2 4] P0 t1 16 16] P1 t2 0 0] t7 P2 t3 2 4] P4 P3 t5 2 4] P5 t4 2 4] 0 0] P6 P7 t8 1 2] Figura 2.1. Il modello TPN di un protocollo stop and wait 2.1.2 Un esempio Come esempio supponiamo di voler modellare un semplice protocollo di comunicazione stop and wait, in cui un trasmettitore ed un ricevitore comunicano attraverso due canali monodirezionali non adabili: il trasmettitore manda un pacchetto ed aspetta l' acknowledgement dal ricevitore, usando un timeout per evitare le situazioni di blocco. Il modello realizzato con le TPN si puo vedere in gura 2.1, in cui si distinguono i 4 elementi modellati: il trasmettitore sulla sinistra ed il ricevitore sulla destra, uniti dai 2 canali. Inizialmente il trasmettitore ha un gettone nella piazza P0 . Dopo un periodo compreso tra 2 e 4 unita di tempo, il trasmettitore manda un pacchetto sul canale (l' esecuzione della transizione t0 mette un gettone nella piazza P2 ) e si mette in attesa della risposta (t0 mette un gettone anche nella piazza P1 ). Quando arriva la risposta (un gettone nella piazza P3 ), il trasmettitore preleva il pacchetto di risposta e ritorna nella condizione iniziale, pronto ad iniziare una nuova trasmissione (l' esecuzione di t2 consuma i gettoni in P3 ed in P1 ). Se la risposta non arriva entro 16 unita di tempo, scatta il timeout ed il trasmettitore ritorna comunque alla condizione iniziale (la transizione t1 scatta esattamente dopo 16 unita di tempo dall' esecuzione di t0 ). I due canali di trasmissione sono modellati allo stesso modo, con due piazze e due transizioni. L' arrivo di un gettone in P2 (P5 ), rappresenta la richiesta di trasmettere un pacchetto, pacchetto che puo essere correttamente trasmesso nella piazza P4 (P3 ) con l' esecuzione di t3 (t5 ) oppure perduto attraverso t6 (t4 ). Il ricevitore inizialmente attende un pacchetto (ovvero un gettone nella piazza P4 ) ed il suo arrivo fa scattare la transizione t7 che preleva il pacchetto e lo mette a disposizione del ricevitore (il gettone e ora nella piazza P7 ) che, dopo un tempo di elaborazione compreso tra 1 e 2 unita di tempo, trasmette l' acknowledgement e ritorna nella condizione iniziale di attesa di un pacchetto (l' esecuzione di t8 mette un gettone nelle piazze P5 e P6 ). 7 CAPITOLO 2. MODULAR TIME PETRI NET 2.2 Communicating Time Petri Net Il principale limite all' uso delle Time Petri Net nella modellazione e veri ca di sistemi sta nella necessita di modellare tutto il sistema con un unica rete, senza cioe poter ricorrere a meccanismi di strutturazione che permettano di scomporre il problema in modelli piu piccoli da veri care singolarmente per poi comporre il risultato di tali veri che. Ad esempio, nel caso del protocollo stop and wait di gura 2.1, si distinguono chiaramente almeno due sottosistemi indipendenti: il trasmettitore sulla sinistra ed il ricevitore sulla destra. Le TPN obbligano ad unire queste due entita concettualmente distinte in un unico modello quando invece il poter analizzare indipendentemente il trasmettitore dal ricevitore faciliterebbe il lavoro di analisi e veri ca, riducendo l' ampiezza del sistema da studiare. Oltre alla dicolta di modellare grossi sistemi con un' unica rete, le TPN obbligano ad eettuare l' analisi in un unico passo, richiedendo cos anche notevoli capacita di calcolo, dato che la complessita dell' analisi da fare cresce con la complessita delle reti da analizzare. Inoltre l' impossibilita di modellare separatamente i singoli moduli di un sistema obbliga a ripetere l' intera fase di validazione di tutto il modello ogni volta che si modi ca una sua parte. Le Communicating Time Petri Net (CmTPN)13] si propongono di superare tale limitazione sia ampliando il modello delle Time Petri Net con meccanismi per il supporto di comunicazioni tra diverse reti, sia fornendo i necessari strumenti per l' analisi separata e la successiva composizione. Le CmTPN aggiungono alle normali TPN un meccanismo di comunicazione tramite scambio di messaggi (message passing) tra porte di lettura e scrittura (reading e writing port). Tali porte sono associate a piazze e transizioni, che assumono il nome di piazze di lettura (reading place) e transizioni di scrittura (writing transition), tramite dei legami di comunicazione (communication link). Le porte di reti diverse possono essere unite da canali (channel) per modellare sistemi composti da piu CmTPN collegati insieme. Nel sistema composto, i canali ed i legami stabiliscono un collegamento tra transizioni di scrittura e piazze di lettura di reti diverse, cos che quando scatta una transizione di scrittura, essa aggiunge un gettone a tutte le piazze di lettura a cui e connessa, come se transizione e piazza fossero normalmente collegate da un arco di post-condizione in una normale rete. Ai ni pratici, una CmTPN che usa un porta di lettura puo essere pensata come una normale TPN cui sia stata \prestata" una transizione da parte di un altro modulo, ovvero che tale modulo acconsenta ad esportare una sua transizione per permetterle di depositare gettoni in piazze che non sono interne al modulo stesso. Si parlera cosi di transizioni master riferendosi alle transizioni vere che sono esportate da un modulo, e di transizioni slave per le transizioni di lettura che ad esse sono collegate con un canale. Le CmTPN forniscono uno strumento molto potente per modellare sistemi di tipo event-driven, o che a tale forma possano essere ricondotti, come ad esempio sistemi software ad elevato parallelismo che interagiscano tra di loro tramite meccanismi di inter process communcation, reti di comunicazione, canali di trasmissione, ecc. Su questi modelli, le CmTPN possono veri care la presenza 8 CAPITOLO 2. MODULAR TIME PETRI NET di deadlock, la violazione di temporizzazioni ed altre condizioni legate allo stato del sistema in tempi ben precisi. 2.2.1 Descrizione formale Sintassi Una Communicating Time Petri Net e una 6-tupla CmTPN =< P T A FI s Port Link > dove: P e l' insieme delle piazze della rete. T e l' insieme delle transizioni della rete. A e l' insieme degli archi di pre-condizione, post-condizione ed inibitori: A (P T ) (T P ) FI s e la relazione che associa ad ogni transizione il suo intervallo di esecuzione statico EFT s ,LFT s]: FI s : T ! R+ (R+ f1g) Port e l' insieme delle porte di comunicazione, ulteriormente diviso in porte di lettura e scrittura: Port = Portin Portout Portin \ Portout = Link e la relazione che associa le piazze di lettura e le transizioni di scrittura con le relative porte di comunicazione: Link (P Portin) (T Portout ) Le porte di lettura e scrittura di moduli diversi possono essere connesse attraverso canali singoli per formare una CmTPN composta. Se nella composizione sono rimaste libere delle porte, queste costituiscono le porte di comunicazione del sistema composto, che possono essere usate per continuare l' integrazione a livelli successivi, includendo la rete composta in una nuova composizione di modelli. Semantica Il comportamento dinamico delle CmTPN e praticamente quello delle Time Petri Net, con le dovute modi che necessarie a speci care il comportamento in modelli composti. Lo stato di una singola CmTPN e una una coppia s =< M FI d > dove: 9 CAPITOLO 2. MODULAR TIME PETRI NET M e la funzione marcamento (marking) che associa ad ogni piazza il numero (non negativo )di gettoni che contiene: M : P ! N+ FI d e la relazione che associa ad ogni transizione il suo intervallo di esecuzione dinamico EFT d ,LFT d ]: FI d : T ! R+ (R+ f1g) Lo stato globale S della rete composta e il prodotto degli stati individuali delle singole CmTPN che compongono la rete. La rete globale si evolve nel tempo in accordo con le seguenti regole che stabiliscono quali sono le transizioni eseguibili e quali sono i cambiamenti che l' esecuzione di una transizione comporta nello stato S : Eseguibilita: una transizione t0 appartenente ad un qualsiasi modulo N0 e abilitata se tutte le sue piazze di ingresso contengono almeno un gettone e nessuna delle sue piazze di inibizione contiene dei gettoni. Una transizione t0 abilitata e eseguibile se il suo EFT d e minore del LFT d di ogni altra transizione nello stato globale S . Progresso: qualunque transizione t0 eseguibile nello stato S puo eseguire con un tempo di esecuzione (t0 ) che deve essere maggiore dell' EFT d di t0 stessa e deve essere minore del LFT d di qualunque altra transizione abilitata in tutti i moduli del sistema. Esecuzione: quando la transizione t0 del modulo N0 esegue, si calcola il nuovo stato della rete con i seguenti passi (atomici): 1. si rimuove un gettone da tutte le piazze di ingresso per t0 . 2. si aggiunge un gettone a tutte le piazze di uscita per t0 . 3. si aggiunge un gettone a tutte le piazze di uscita per t0 . 4. per ogni porta di scrittura out legata a t0 e collegata attraverso un canale ad una porta di lettura in di un modulo Nin nel sistema, si aggiunge un gettone a tutte le piazze di Nin legate a in. 5. per ogni transizione appena abilitata si resetta l' intervallo di esecuzione dinamico al suo valore statico: EFT d := EFT s LFT d := LFT s 0 0 6. per ogni transizione persistente si trasla a sinistra l' intervallo di esecuzione del valore del tempo all' esecuzione (t0 ) con cui esegue t0 : EFT d := maxf0 EFT d ; (t0 )g LFT d := maxf0 LFT d ; (t0 )g 0 0 10 CAPITOLO 2. MODULAR TIME PETRI NET 2.2.2 Required Interface Una porta di lettura di un modulo collegata ad una transizione di scrittura di un altro modulo tramite un canale, puo essere vista come una transizione asservita alla transizione di scrittura. Il comportamento di queste transizioni slave e perfettamente de nito durante l' esecuzione del sistema composto, in cui ogni transizione slave si comporta esattamente come la transizione master cui e collegata, mentre cio non e vero durante l' analisi del singolo modulo. Un primo approccio per analizzare un modulo singolarmente, consiste nell' analizzarlo mentre e inserito nell' intero sistema composto, che e il suo ambiente naturale, ma questo metodo risulta molto pesante e inoltre impedisce di usare tecniche di validazione incrementale e di riusabilita delle analisi svolte. Per consentire una maggiore essibilita e riusabilita dell' analisi, ed allo stesso tempo permettere di eseguire l' analisi dei singoli moduli in maniera completamente indipendente l' uno dall' altro, si puo dare una speci ca incompleta dell' ambiente in cui il modulo si trova, codi cando in una interfaccia attesa (Required Interface) la risposta dell' ambiente (in termini di esecuzione delle transizioni slave2 ) all' evoluzione del modulo. Si puo infatti pensare che l' esecuzione di alcune transizioni (tipicamente quelle esportate, ma non solo) provochi, dopo un certo intervallo di tempo, delle reazioni nell' ambiente esterno, reazioni che si manifestano con l' arrivo di un gettone da un canale di comunicazione, ovvero con l' esecuzione di una transizione slave. La speci ca di una interfaccia attesa quindi consiste nell' aumentare la CmTPN con delle transizioni slave e de nire come cambiano i loro intervalli di esecuzione all' eseguire di altre transizioni della rete stessa. Conviene sottolineare come una interfaccia attesa non de nisca i vincoli rispettati dal modulo, ma piuttosto i vincoli che il modulo si aspetta siano soddisfatti dall' ambiente esterno. In questa modo si possono applicare in maniera semplice le tecniche di analisi sviluppate per le Time Petri Net9] anche alle CmTPN, con alcune semplici modi che alla sintassi ed alla semantica de nite nella sezione 2.1.1. Sintassi Una interfaccia attesa e una tripla: Required Interface =< T in Ain FIris > dove: T in e l' insieme di transizioni di lettura associate alle porte di lettura del modulo. Ain e l' insieme di archi di post-condizione che collegano ogni transizione di lettura tin alla piazza di lettura collegata alla porta in. 2 Il termine slave e qui usato impropriamente, poiche si puo parlare di transizioni slave solo quando queste siano eettivamente asservite ad una transizione master tramite un canale. 11 CAPITOLO 2. MODULAR TIME PETRI NET Fris associa ogni transizione di lettura tin con un insieme di intervalli di esecuzione statici attesi, ognuno associato ad un' altra transizione (reale od aggiunta) del modulo o con l' evento init che corrisponde all' inizio di una esecuzione: Bri T in (T T in) FIris : Bri finitg ! (R+ f1g) (R+ f1g) Si noti come l' EFTs di una transizione di lettura possa essere 1. Questo, di fatto, impedisce alla transizione di eseguire, poiche prima della sua esecuzione deve passare un tempo in nito. Conviene allora, per sempli care la lettura dei risultati dell' analisi, considerare tali transizioni disabilitate a tutti gli eetti. Semantica Il comportamento dinamico di una interfaccia attesa e de nito solo in unione al modulo cui fornisce un ambiente di evoluzione. Lo stato del sistema chiuso formato dal modulo e da una sua interfaccia attesa e una tripla S =< M FI d FIrid > dove M e la funzione marcamento (marking) che associa ad ogni piazza il numero (non negativo) di gettoni che contiene: M : P ! N+ FI d associa ad ogni transizione il suo intervallo di esecuzione dinamico EFT d ,LFT d ]: FI d : T ! R+ (R+ f1g) FIrid associa ad ogni transizione di lettura un intervallo di esecuzione dinamico atteso EFTrid ,LFTrid ]: FIrid : T in ! (R+ f1g) (R+ f1g) L' evoluzione della composizione del modulo con una interfaccia attesa avviene fondamentalmente con le stesse regole di esecuzione date per una TPN nella sezione 2.1.1, aumentando l' insieme delle transizioni da T a T T in . L' unica dierenza consiste nell' aggiunta di alcune regole per assegnare alle transizioni di lettura il giusto intervallo di esecuzione: Inizializzazione: gli intervalli dinamici di tutte le transizioni di lettura tin sono inizialmente assegnati al valore statico FIris (tin init). Esecuzione: si aggiunge il seguente passo: 12 CAPITOLO 2. MODULAR TIME PETRI NET 6. per ogni transizione di lettura tin, se < tin t0 >2 Bri , tin si considera appena abilitata e si resetta il suo intervallo di esecuzione dinamico al valore de nito nell' interfaccia attesa: EFTrid := EFTris (tin t0 ) LFTrid := LFTris (tin t0 ) 0 0 altrimenti tin e persistente ed il suo intervallo di esecuzione viene traslato normalmente di (t0 ): EFTrid := maxf0 EFTrid ; (t0 )g LFTrid := maxf0 LFTrid ; (t0 )g 0 0 Come per le transizioni normali, l' intervallo dinamico di esecuzione di una transizione di lettura tin de nisce il minimo ed il massimo tempo che ci si aspetta che trascorra prima della prossima esecuzione di tin . Poiche tale tempo viene ride nito all' esecuzione di certe transizioni, gli intervalli statici delle interfaccia attesa esprimono dei vincoli sul tempo che trascorre dall' esecuzione di queste transizioni all arrivo di un gettone dall' ambiente. Questo tipo di vincoli permette di esprimere le interfacce attese in termini di vincoli temporali stimolo/risposta, adattandosi bene al tipo di speci che dei sistemi tempo-reali. 2.2.3 Provided Interface Se le CmTPN unite alle interfacce attese forniscono un buon metodo per validare sistemi complessi in maniera modulare ed incrementale, esse non prevedono alcun meccanismo per nascondere la complessita dei moduli analizzati e ridurre quindi le risorse impiegate nell' analisi del sistema composto. Per ridurre l' eccesso di informazioni prodotte nell' analisi di un modulo completo di tutti i suoi dettagli interni, si puo cercare di nascondere le transizioni locali al modulo, fornendo del modulo stesso un modello sempli cato in cui compaiano solo le transizioni osservabili, ovvero quelle transizioni che servono all' integrazione del modulo nel sistema composto. Di queste transizioni si fornisce l' intervallo di tempo che passa dall' esecuzione di una qualsiasi altra transizione osservabile alla sua esecuzione. Il modello ridotto deve essere compatibile con il modulo originale, nel senso che deve permettere tutte le esecuzioni permesse dal modulo originale. A questo modello ridotto si da il nome di interfaccia oerta (provided interface), poiche ore dei vincoli temporali che il modulo assicura di rispettare. Sintassi Una interfaccia oerta e una coppia: Provided Interface =< T obs FIpis > dove: 13 CAPITOLO 2. MODULAR TIME PETRI NET T obs e l' insieme delle transizioni osservabili, composto sia da transizioni normali che di lettura, con l' aggiunta dell' evento init che corrisponde all' inizio dell' esecuzione: T obs T T in finitg Fpis associa ogni coppia di transizioni osservabili con un intervallo di esecuzione statico oerto: Bpi = T obs (T obs ; finitg) FIpis : Bpi ! (R+ f1g) (R+ f1g) Semantica Lo stato di una interfaccia oerta e: S =< FIpid > in cui FIpid associa ogni elemento di T obs ad un intervallo di esecuzione dinamico: FIpid : T obs ! (R+ f1g) (R+ f1g) Nell' esecuzione di una interfaccia oerta, le transizioni sono sempre appena abilitate salvo il caso in cui l' intervallo dinamico sia posto a 1 1], nel qual caso la transizione si considera disabilitata. L' esecuzione di una interfaccia oerta avviene tramite regole molto semplicate rispetto alle TPN, non dovendo piu considerare le piazze: Inizializzazione: gli intervalli dinamici di tutte le transizioni osservabili to sono inizialmente assegnati al valore statico FIpis (to init). Eseguibilita: una transizione osservabile to e abilitata se il suo EFTpid e minore di 1. Una transizione to abilitata e eseguibile se il suo EFTpid e minore del LFTpid di ogni altra transizione nello stato S . Progresso: qualunque transizione to eseguibile nello stato S puo eseguire con un tempo di esecuzione (to ) che deve essere maggiore dell' EFTpid di to stessa e deve essere minore del LFTpid di qualunque altra transizione abilitata. Esecuzione: quando la transizione osservabile tf esegue, si resettano gli intervalli di esecuzione dinamici di ogni altra transizione osservabile to : EFTpid := EFTpis (to tf ) LFTpid := LFTpis (to tf ) 0 0 14 CAPITOLO 2. MODULAR TIME PETRI NET ready source data ready - data ack ready ack TX - pkt pkt RX data ready sink - data Figura 2.2. Rappresentazione modulare del protocollo di Stenning 2.2.4 Un esempio Come esempio consideriamo ancora un protocollo di comunicazione, il cosiddetto protocollo di Stenning38], che viene spesso usato come esempio per nuovi metodi di speci ca e validazione. Questo protocollo considera un sistema modulare, rappresentato in gura 2.2, composto da una sorgente (source) ed una destinazione (sink) che realizzano un canale adabile attraverso un trasmettitore (TX) ed un ricevitore (RX) collegati da un mezzo inadabile. Per ogni singolo modulo dovremo dare sia la descrizione interna come rete di Petri, sia la descrizione dell' ambiente che tale modulo si aspetta per funzionare correttamente attraverso una interfaccia attesa. Il modulo source P0 t0 P1 2 4] P2 t1 0 1] i20 Figura 2.3. Il modulo source del protocollo di Stenning Facendo riferimento alla rete di gura 2.3, il modulo sorgente trasmette i dati attraverso la transizione t1 , ed attende che il trasmettitore sia libero attraverso la transizione importata i20 . La presenza di un gettone in P0 signi ca che il modulo sta producendo un dato da trasmettere. L' esecuzione di t0 modella la produzione del dato, dopo di che il modulo attende che il trasmettitore sia pronto (ovvero che l' esecuzione di i20 metta un gettone in P2 ) e trasmette il dato con l' esecuzione di t1 . L' interfaccia attesa di tabella 2.1 dichiara che il modulo sorgente si aspetta che un messaggio ready (i20 ) debba sempre arrivare dopo la trasmissione di data (t1 ) e che non possano arrivare due ready di la senza un data in mezzo. 15 CAPITOLO 2. MODULAR TIME PETRI NET init i20 1 1 1 1 i20 t1 0 1 Tabella 2.1. L' interfaccia attesa del modulo source Il modulo TX t7 t8 3 6] P8 3 6] P3 1 2] t3 i31 P6 P6 t4 P4 t5 1 2] t6 P7 0 1] 16 16] i30 Figura 2.4. Il modulo TX del protocollo di Stenning In gura 2.4 vediamo il modulo trasmettitore, il piu complicato dei moduli del sistema, che trasmette i pacchetti attraverso t7 , segnala la disponibilita a trasmettere con t6 , riceve i dati da i31 e gli acknowledgement da i30 . Un gettone in P6 signi ca che il modulo aspetta dei dati da trasmettere in tale condizione l' arrivo di un gettone in P3 permette l' esecuzione di t3 , che pone un gettone in P8 e in P4 . Il gettone in P8 modella la presenza di un pacchetto in transito nel mezzo inadabile che il modulo usa per comunicare: il suo arrivo a destinazione e modellato dall' esecuzione di t7 , mentre la perdita dall' esecuzione di t8 (in entrambi i casi la comunicazione dura un intervallo di tempo compreso in 3 6]). Il gettone in P4 modella una condizione di attesa che e terminata o dall' arrivo dell' acknowledgement (l' esecuzione di i30 che mette un gettone in P7 ) o dallo scadere di un timeout dopo 16 unita di tempo (l' esecuzione di t5 ). Si noti come lo scadere del timeout rilancia la trasmissione del dato attraverso l' esecuzione di t4 e come il timeout stesso sia inibito dall' arrivo dell' acknowledgement. L' interfaccia attesa per il modulo di trasmissione, mostrata in tabella 2.2, speci ca che un messaggio data (i31 ) deve sempre arrivare dopo un messaggio ready (t6 ), che non possono arrivare due data di la senza un ready in mezzo, che un messaggio ack (i30 ) puo venire solo dopo la trasmissione di un pkt (t7 ) e mai immediatamente dopo un ack (i30 ) od un timeout (t5 ). 16 CAPITOLO 2. MODULAR TIME PETRI NET i30 i31 init i30 t5 1 1 1 1 1 1 0 1 | | t7 0 1 | i31 t6 | 1 1 | 0 1 Tabella 2.2. L' interfaccia attesa del modulo TX Il modulo RX t9 i40 P10 0 0] P9 t10 P11 1 3] 3 6] t11 i41 t12 3 6] Figura 2.5. Il modulo RX del protocollo di Stenning Il modulo ricevitore e illustrato in gura 2.5. I dati sono trasmessi tramite t10 , t12 trasmette gli acknowledgement, mentre le transizioni importate i41 e i40 ricevono rispettivamente i pacchetti e la disponibilita del modulo destinazione a ricevere dati. Quando arriva un pacchetto dal mezzo inadabile (l' esecuzione di i41 deposita un gettone in P9 ), la destinazione puo essere occupata o meno: nel primo caso la transizione t9 scarta il pacchetto arrivato, nel secondo un gettone in P10 blocca t9 e permette a t10 di trasmettere il dato. L' esecuzione di t10 trasmette anche il pacchetto di acknowledgement al modulo trasmettitore, trasmissione che viene come al solito modellata con la piazza P11 e le due transizioni t12 e t11 per l' arrivo e la perdita del pacchetto stesso. L' interfaccia attesa del modulo ricevitore e mostrata in tabella 2.3 ed aerma che un messaggio ready (i40 ) puo venire solo dopo la trasmissione di un data (t10 ) e che non si possono avere due ready di la senza un data in mezzo inoltre un messaggio pkt puo arrivare in qualunque momento dopo la trasmissione di un ack (i12 ), ma tra due pkt di la devono passare almeno 10 unita di tempo. i40 i41 init i40 1 1 1 1 0 1 | t10 i41 t12 0 1 | | | 10 1 0 1 Tabella 2.3. L' interfaccia attesa del modulo RX 17 CAPITOLO 2. MODULAR TIME PETRI NET Il modulo sink P13 t14 0 0] P14 P12 t13 0 1] i50 Figura 2.6. Il modulo sink del protocollo di Stenning Il modello di gura 2.6 e il modulo destinazione, simile al modulo sorgente salvo per le condizioni iniziali delle piazze. Il modulo riceve i dati da i50 e trasmette la propria disponibilita con t14 . Il modulo destinazione aspetta l' arrivo di un dato dalla transizione i50 , lo consuma tramite la transizione t13 in un intervallo di tempo 0 1], segnala la disponibilita a ricevere nuovi pacchetti tramite t14 e torna nella condizione iniziale. L' interfaccia attesa del modulo destinazione, mostrata in tabella 2.4, e analoga all' attesa degli altri moduli che scambiano data e ready: un messaggio data (i50 ) puo arrivare solo dopo un ready (t14 ) e non possono arrivare due data di la senza un ready in mezzo. init i50 0 1 i50 1 1 t14 0 1 Tabella 2.4. L' interfaccia attesa del modulo sink 2.3 Modular Time Petri Net Le CmTPN sono strumenti molto potenti nell' analisi di sistemi in cui gli scambi tra i sottosistemi componenti avvengono con comunicazioni di tipo messagepassing. La possibilita delle CmTPN di veri care vincoli di temporizzazione rende molto appetibile il loro uso anche nella veri ca di sistemi digitali, in cui il rispetto delle temporizzazioni e spesso cruciale, ma tale uso e complicato dal dover arontare un problema in cui le comunicazioni sono tipicamente basate sulla lettura di segnali da parte dei vari sottosistemi con una metodologia fondamentalmente message passing. Sebbene la lettura di segnali presenti in un modulo possa essere modellata con una serie di porte, piazze e transizioni opportune, il loro uso sistematico risulta troppo pesante per poter essere applicato nella pratica. Per risolvere tali problemi, viene proposta ora una variante originale delle CmTPN, chiamata Modular Time Petri Net, in cui si estende l' idea delle transizioni esportate anche alle piazze, fornendo gli opportuni meccanismi per 18 CAPITOLO 2. MODULAR TIME PETRI NET garantire la sincronizzazione tra le piazze slave e quelle master. Le aggiunte alla struttura delle CmTPN devono essere il meno intrusive possibile, per poter usare le tecniche di analisi sviluppate per esse senza modi che troppo pesanti. L' idea alla base delle MTPN e che una rete che modella un sottosistema possa importare dalle altre reti del sistema tanto delle piazze che delle transizioni, piazze e transizioni che, nel sistema composto, si comportano esattamente come le corrispettive piazze e transizioni esportate. Ovviamente per le transizioni importate valgono le stesse considerazioni che hanno portato all' introduzione delle interfacce attese per riprodurre il comportamento delle transizioni esportate anche in assenza del modulo cui appartengono. Per le piazze si ripete il problema di come assicurare un comportamento \plausibile" alle piazze importate senza dover considerare nell' analisi del modulo anche le reti cui esso si interfaccia. Inoltre, poiche le piazze importate non appartengono veramente al modulo in esame, ma gli sono prestate, esse dovranno essere a sola lettura, cioe non si potra consentire alle transizioni di un modulo di togliere o aggiungere gettoni alle piazze che importa. Il problema della sincronizzazione tra piazze master e piazze slave puo essere risolto creando tra esse un canale di comunicazione tramite cui la piazza master comunica alla piazza slave di aggiungere o togliere un gettone quando necessario. Un' ulteriore analisi del meccanismo con cui le due piazze restano sincronizzate, mostra che la piazza slave deve togliere un gettone ogni volta che nella rete di origine esegue una transizione che e di uscita per la piazza master, mentre deve aggiungerlo ogni volta che esegue una transizione di ingresso per la piazza master. Questo suggerisce di aggiungere, nel modulo in esame, due transizioni, una di incremento (up transition) ed una di decremento (down transition), collegate alla piazza slave tramite archi di post e pre condizione, ed alla rete di origine tramite collegamenti molti a uno con tutte le transizioni di uscita ed ingresso della piazza master. Poiche il nostro scopo e usare le MTPN per l' analisi di sistemi digitali, sarebbe utile prevedere un meccanismo per poter esprimere facilmente relazioni logiche tra segnali (ovvero tra piazze) senza dover simulare le porte logiche con piazze e transizioni. Un metodo per estendere le reti di Petri in tale direzione e quello di dotare le transizioni di funzioni di abilitazione, che riprendono e potenziano il meccanismo degli archi inibitori. Le funzioni di abilitazione sono delle funzioni che, associate ad una transizione, la abilitano o meno a seconda dello stato attuale della rete. 2.3.1 Descrizione formale Sintassi Una Modular Time Petri Net e una 6-tupla MTPN =< P^ T^ A AF FI s > dove: P^ e l' insieme delle piazze della rete, divise tra piazze originali ed impor19 CAPITOLO 2. MODULAR TIME PETRI NET tate: P^ = P P i T^ e l' insieme delle transizioni della rete, divise tra transizioni originali, importate, di incremento e di decremento: T^ = T T i T up T down Per comodita si de nisce anche l' insieme T" delle transizioni di interfaccia: T" = T i T up T down A e l' insieme degli archi di pre-condizione, post-condizione ed inibitori: A (P^ T^) (T^ P^ ) AF associa alle transizioni la propria funzione di abilitazione AF : T^ ! F dove F e l' insieme delle funzioni di abilitazione af : af : M ! ftrue falseg con M funzione marcamento (vedi oltre) FI s e la relazione che associa ad ogni transizione il suo intervallo di esecuzione statico EFT s ,LFT s]: FI s : T ! R+ (R+ f1g) Semantica Il comportamento dinamico di una MTPN e de nito solo se la rete evolve in un ambiente chiuso, cioe se e inserita nel sistema completo o se e corredata dalle necessarie interfacce attesa < T" FIris >. Lo stato della rete e una una coppia S =< M FI d > dove: M e la funzione marcamento (marking) che associa ad ogni piazza il numero (non negativo) di gettoni che contiene: M : P^ ! N+ FI d e la relazione che associa ad ogni transizione il suo intervallo di esecuzione dinamico EFT d ,LFT d ]: FI s : T^ ! (R+ f1g) (R+ f1g) 20 CAPITOLO 2. MODULAR TIME PETRI NET Al solito le regole che determinano il comportamento della rete tengono conto sia della rete che del comportamento delle interfacce attese: Inizializzazione: gli intervalli dinamici di tutte le transizioni di interfaccia ti in T" sono inizialmente assegnati al valore statico FIris (ti init). Eseguibilita: una transizione t0 e abilitata se tutte le sue piazze di ingresso contengono almeno un gettone, nessuna delle sue piazze di inibizione contiene dei gettoni, il suo EFT d e minore di 1 e la sua eventuale funzione di abilitazione ritorna true. Una transizione t0 abilitata e eseguibile se il suo EFT d e minore del LFT d di ogni altra transizione nello stato S . Progresso: qualunque transizione t0 eseguibile nello stato S puo eseguire con un tempo di esecuzione (t0 ) che deve essere maggiore dell' EFT d di t0 stessa e deve essere minore del LFT d di qualunque altra transizione abilitata. Esecuzione: quando la transizione t0 esegue, si deve calcolare il nuovo stato della rete, il che comporta calcolare il nuovo marcamento delle piazze ed aggiornare gli intervalli dinamici di esecuzione: 1. si rimuove un gettone da tutte le piazze di ingresso per t0 contenute in P . 2. se t0 2 T down , si toglie un gettone dalla sua piazza di interfaccia. 3. si aggiunge un gettone a tutte le piazze di uscita per t0 contenute in P. 4. se t0 2 T up, si aggiunge un gettone alla sua piazza di interfaccia. 5. per ogni transizione di interfaccia ti 2 T" tale che < ti t0 > appartiene al dominio di FIris , si resetta il suo intervallo di esecuzione dinamico al valore de nito nell' interfaccia attesa: EFT d := EFTris (ti t0 ) LFT d := LFTris (ti t0 ) 0 0 6. per ogni transizione appena abilitata in T si resetta l' intervallo di esecuzione dinamico al suo valore statico: EFT d := EFT s LFT d := LFT s 0 0 7. per ogni transizione persistente in T^ si trasla a sinistra l' intervallo di esecuzione del valore del tempo all' esecuzione (t0 ) con cui esegue t0 : EFT d := maxf0 EFT d ; (t0 )g LFT d := maxf0 LFT d ; (t0 )g 0 0 21 CAPITOLO 2. MODULAR TIME PETRI NET 2.3.2 Un esempio Come semplice esempio di una MTPN consideriamo il caso di un sistema software in cui due processi concorrenti competano per l' accesso ad una risorsa e supponiamo di dover segnalare quando questa risorsa viene acquisita da uno dei due processi (ad esempio per fare un log degli accessi o per fare il debugging del sistema). t2 t3 1 2] 1 3] P1 P2 P0 t0 t1 1 3] 2 4] Figura 2.7. Modello di due processi in competizione per una risorsa La rete di gura 2.7 modella il sistema composto dai due processi e dalla risorsa: un gettone nella piazza P0 signi ca che la risorsa e libera, ed uno dei due processi (modellati rispettivamente da t0 , P1 , t2 e da t1 , P2 , t3 ) puo acquisirla. Dopo che un processo ha acquisito la risorsa (ad esempio con l' esecuzione di t0 ), il processo eettua l' elaborazione che ha richiesto la risorsa ed in ne, dopo un intervallo di tempo variabile, la libera (la transizione t2 modella l' attesa per l' elaborazione, che puo durare tra 1 e 2 unita di tempo). d0 P0 u0 t4 0 0] P3 P4 t5 6 6] Figura 2.8. Modello del monitor della risorsa Per segnalare l' acquisizione della risorsa, si usa la rete di gura 2.8, in cui si fa uso di una piazza importata (P0 ) e delle sue transizioni di incremento e decremento (u0 e d0 ). All' inizio la presenza di un gettone in P0 impedisce a t4 di scattare. Appena uno dei due processi acquisisce la risorsa svuotando P0 , t4 inizia il ciclo di segnalazione dell' uso della risorsa, ciclo la cui durata e stabilita dall' intervallo di esecuzione di t5 . 22 CAPITOLO 2. MODULAR TIME PETRI NET La tabella 2.5 mostra che il modulo si attende che la risorsa subisca solo decrementi seguiti, prima o poi, da decrementi, cioe che non ci possano mai essere due gettoni nella piazza importata. u0 d0 init u0 d0 1 1 1 1 0 1 0 1 0 1 1 1 Tabella 2.5. L' interfaccia attesa del monitor Si noti inoltre che, nel collegamento dei due moduli, le transizioni master per d0 sono t0 e t1 , mentre le transizioni master per u0 sono t2 e t3 . 23 Capitolo 3 Analisi di MTPN Lo scopo delle analisi che intendiamo fare sulle MTPN e la costruzione del cosiddetto grafo di raggiungibilita, in cui si raccolgono tutti gli stati possibili per il sistema e si speci cano le modalita del passaggio da uno stato all' altro. Il problema principale di questo tipo di analisi e che in una MTPN lo stato dipende anche dagli intervalli dinamici di esecuzione, che possono assumere in niti valori in un intervallo denso, generando quindi una in nita di stati. Poiche le MTPN sono un' estensione delle TPN, il problema si puo risolvere usando tecniche di enumerazione degli stati di raggiungibilita gia sviluppate9]13], che permettono di raccogliere un numero possibilmente in nito di stati in una classi di stati e di costruire il grafo di tali classi. 3.1 Classi di stati e Domini di esecuzione Lo stato di una MTPN e costituito dal marcamento delle piazze e dagli intervalli dinamici di esecuzione (cfr. sezione 2.3.1). Una classe di stati S per la rete e una coppia < M D >, dove M e il marcamento delle piazze della rete e D e un dominio di esecuzione (ring domain), ovvero un sistema di disequazioni lineari che esprime i vincoli sui tempi all' esecuzione delle transizioni abilitate nello stato. Tale sistema e espresso nella forma normale46] ( D = aai ij (ti ) (ti ) ; (tj ) bi bij 8ti tj 2 T (M ) ti = 6 tj dove T (M ) e l' insieme delle transizioni t abilitate dal marcamento M . ai e bi sono il minimo ed il massimo valore di (ti ) per cui esistono soluzioni del sistema D. aij e bij sono il minimo ed il massimo valore della dierenza (ti ) ; (tj ) per cui esistono soluzioni del sistema D. 24 CAPITOLO 3. ANALISI DI MTPN Esistono metodi46] che permettono di ridurre i vincoli di un qualsiasi dominio di esecuzione in forma canonica, forma che si dimostra esistere sempre ed essere unica. Uno stato s di una rete e raccolto nella classe di stati S se s e S hanno lo stesso marcamento M e qualunque insieme di tempi all' esecuzione compatibile con gli intervalli dinamici di esecuzione di s soddisfa il dominio di esecuzione di S . Naturalmente possono esistere soluzioni a D che non sono compatibili con gli intervalli dinamici di un particolare stato della classe, poiche il dominio di esecuzione rappresenta il vincolo piu forte soddisfatto da tutti gli stati della classe. 3.2 Costruzione del grafo degli stati La costruzione del grafo di raggiungibilita degli stati avviene con un algoritmo di scansione a ventaglio (breadth rst), con cui si costruiscono tutti i possibili stati successivi allo stato iniziale, eliminando i duplicati e collegandoli tramite archi marcati dalla transizione che ha portato da uno stato all' altro. 3.2.1 Dominio ristretto Il meccanismo fondamentale della costruzione del grafo e il calcolo della classe di stati Sc cui si arriva da una classe Sp attraverso l' esecuzione di una transizione t0 . Naturalmente t0 dovra essere abilitata in Sp, ma questo non basta a garantire che t0 sia anche eseguibile in Sp, poiche potrebbe esistere una transizione abilitata t1 il cui LFT d sia minore dell' EFT d di t0 , impedendo cos a t0 di eseguire nche non abbia eseguito t1 . Se t0 e anche eseguibile, si puo aggiungere al dominio Dp di Sp il vincolo che t0 esegua prima di tutte le altre transizioni abilitate, ottenendo quello che si chiama un dominio di esecuzione ristretto ( p t0 Dp = D 0 (t ) ; (t ) 8t 2 T (M ) 0 i i p Tale dominio ristretto si usa poi per costruire i vincoli sulle transizioni che sono persistenti in Sc e che quindi dipendono dalla storia del sistema. I vincoli sulle transizioni appena abilitate si costruiscono invece a partire dagli intervalli statici delle transizioni, poiche a tale valore vengono resettati gli intervalli dinamici di queste transizioni. Alla nuova classe Sc manca ora solo il marcamento, che puo essere facilmente ricavato dal marcamento i Sp con le regole di esecuzione di una MTPN. 3.2.2 Algoritmo di costruzione In 13] sono forniti in dettaglio i metodi per decidere l' eseguibilita di una transizione abilitata e calcolare il successore direttamente in forma normale, insieme con la dimostrazione della loro correttezza. Usando questi metodi, si ottiene l' algoritmo di generazione del grafo riportato in gura 3.1. 25 CAPITOLO 3. ANALISI DI MTPN 1. riduci il dominio di esecuzione della classe radice Sroot in forma normale 2. sia Sroot l' unico elemento del' insieme delle classi da analizzare 3. nche non e vuoto 3.1. sia Sp il primo elemento di 3.2. per ogni transizione t0 abilitata in Sp 3.2.1. se t0 e eseguibile in Sp 3.2.1.1. costruisci Sc da Sp attraverso t0 3.2.1.2. se esiste nel grafo un nodo Sc eguale a Sc 3.2.1.2.1. collega Sc a Sp attraverso t0 3.2.1.3. altrimenti 3.2.1.3.1. collega Sc a Sp attraverso t0 3.2.1.3.2. aggiungi Sc a 3.3. togli Sp da 0 0 Figura 3.1. Algoritmo di generazione del grafo degli stati 3.3 Integrazione dei gra Una volta completata l' analisi dei singoli moduli di un sistema composto, e necessario comporre i gra semplici per avere delle informazioni sull' intero sistema, ottenendo un nuovo grafo che descrive lo stato del sistema complesso in funzione dello stato dei suoi moduli. Abbiamo visto nella sezione 2.2.1 che lo stato di un sistema composto si puo esprimere con l' insieme degli stati dei singoli moduli. In maniera analoga si puo de nire una classe di stati S per il grafo risultante dall' integrazione di N moduli come una coppia < S D > dove S e il vettore delle classi di stati Si dei singoli moduli e D e il dominio di esecuzione per le transizioni dell' intero sistema. Si noti che in D non compaiono le transizioni slave, cioe quelle transizioni che nel sistema composto sono collegate tramite un canale ad un master. Infatti le transizioni slave scompaiono nel sistema integrato, dove eseguono in sincrono con i rispettivi master, poiche non devono piu svolgere il loro compito di chiudere la rappresentazione del sistema. Le informazioni presenti nei singoli gra relative alle transizioni slave vengono usate nella costruzione del grafo integrato solo per veri care la coerenza dei vincoli espressi dalle interfacce attese con l' ambiente in cui il modulo viene inserito. L' algoritmo di costruzione per il grafo integrato e lo stesso usato nella costruzione dei gra dei singoli moduli, con l' unica importante dierenza che cambia il modo di costruire i singoli nodi. Serve cioe un metodo per costruire il successore Sc della classe Sp dovuto all' esecuzione della transizione t0 . 3.3.1 Calcolo dello stato successore Per costruire il nuovo vettore degli stati Sc si indica con Spi lo stato di Sp del modulo cui appartiene t0 e con Spj lo stato del modulo cui appartiene ts . Si devono distinguere due casi diversi a seconda che t0 sia o meno collegata ad una transizione slave ts : 26 CAPITOLO 3. ANALISI DI MTPN t0 non master: in questo caso l' esecuzione di t0 inuenza solo il modulo cui appartiene t0 , e quindi Sc e identico a Sp salvo che al posto di Spi si pone Sci , successore di Spi attraverso t0 . t0 master di ts: adesso l' esecuzione di t0 inuenza sia il modulo cui appartiene t0 che quello cui appartiene ts, dato che le due transizioni eseguono contemporaneamente. Il nuovo stato Sc e uguale a Sp salvo che al posto di Spi si pone Sci , successore di Spi attraverso t0 , ed al posto di Spj si pone Scj , successore di Spj attraverso ts . 3.3.2 Calcolo del dominio di esecuzione Il calcolo del dominio di esecuzione dello stato Sc si eettua, in maniera analoga a quanto fatto per i singoli moduli, in maniera diversa per le transizioni persistenti rispetto a quelle appena abilitate, tenendo conto che sono persistenti tutte le transizioni appartenenti a stati persistenti, cioe a stati di Sp che non sono cambiati nel passare a Sc , e che sono appena abilitate solo le transizioni che sono appena abilitate negli stati che sono cambiati nel passaggio da Sp a Sc (ovvero sono appena abilitate le transizioni che sono appena abilitate in Sci ed eventualmente Scj e sono persistenti tutte le altre). Per le transizioni persistenti, i vincoli si calcolano a partire dal dominio ristretto Dpt0 ottenuto imponendo a Dp l' esecuzione di t0 prima di tutte le altre transizioni, mentre i vincoli sulle transizioni appena abilitate si copiano dai corrispondenti vincoli nei gra dei singoli moduli. 3.3.3 Errori di integrazione Nel calcolo del nuovo stato si possono veri care due errori di integrazione, entrambi fatali, dovuti a degli errori nella speci ca delle interfacce attese: late arrival: si ha un arrivo in ritardo se nel grafo cui appartiene t0 essa non e un arco di uscita per Spi , cioe se non esiste alcun Sci . Questo errore si veri ca quando una transizione slave ts consuma il suo LFT d prima dell' esecuzione della sua transizione master. unexpected arrival: si ha un arrivo inatteso se nel grafo cui appartiene ts essa non e un arco di uscita per Spj , cioe se non esiste alcun Scj . Questo errore si veri ca quando una transizione master esegue prima che la sua transizione slave abbia consumato il suo EFT d . Poiche il processo di costruzione dei gra puo essere abbastanza pesante, quando si incontrano tali errori, di per se fatali, conviene comunque cercare di proseguire l' integrazione del sistema per andare a cercare altri eventuali errori, tenendo presente che il grafo risultante non e totalmente corretto e quindi puo non rappresentare correttamente il sistema completo. Una strada per continuare l' integrazione e quella di introdurre degli opportuni stati di errore al posto degli stati che non si sono potuti calcolare e proseguire la costruzione normalmente. Naturalmente tali stati di errore dovranno essere stati terminali, cioe senza successori. Se non si veri cano errori fatali, si dimostra13] che il grafo ottenuto 27 CAPITOLO 3. ANALISI DI MTPN e corretto, ovvero che e lo stesso grafo che si otterrebbe integrando i gra dei singoli moduli ottenuti senza i limiti imposti dalle interfacce attese. 3.3.4 Verica delle interfacce attese Anche se l' algoritmo di integrazione giunge a termine senza errori e quindi produce un grafo corretto, non e detto che i singoli moduli soddis no completamente le interfacce attese. Infatti l' assenza di violazioni delle interfacce oerte e una condizione suciente ma non necessaria per la corretta conclusione del processo di integrazione. La violazione (non fatale) delle interfacce attese puo essere scoperta durante l' integrazione dei gra dei moduli, prendendo in considerazione anche i vincoli sulle transizioni slave e controllando se tali vincoli cambiano il dominio di esecuzione globale calcolato in loro assenza44]. Come accennato, per rilevare violazioni alle interfacce attese e necessario conservare nei domini di esecuzione dei nodi del grafo integrato anche i vincoli che coinvolgono transizioni slave ed aggiungere un passo all' algoritmo di costruzione del successore. Infatti in un primo tempo e necessario calcolare il dominio ristretto Dpt0 considerando solo le transizioni non slave durante la restrizione e la successiva normalizzazione. In seguito si restringe solo i vincoli relativi a transizioni slave, si aggiunge le condizioni che transizioni master e rispettivi slave eseguano contemporaneamente e si rinormalizza il dominio senza pero modi care i coecienti delle transizioni non slave. Se il dominio risultante non e in forma normale, si e veri cata una violazione delle interfacce attese: l' integrazione produce comunque un risultato corretto, ma i singoli moduli sono stati analizzati con ipotesi (ovvero le interfacce attese) non coerenti tra loro. Questo metodo basa il suo funzionamento sul fatto che nel processo di normalizzazione di un dominio, i vincoli piu stringenti si propagano anche ai vincoli correlati e quindi se il dominio risultante non e piu normale, alcuni vincoli sulle transizioni slave, propagati ai vincoli sui master, li renderebbero piu stringenti, segnalando una possibile violazione delle interfacce attese delle transizioni implicate. 3.4 Analisi temporale Una volta ottenuto il grafo di raggiungibilita per un sistema (si esso un semplice modulo o l' integrazione di piu moduli), si possono da esso ricavare numerose informazioni: con una semplice ispezione si possono rilevare gli eventuali stati terminali (corrispondenti ai deadlock del sistema) e ricavare alcune semplici proprieta di temporizzazione (timeliness). Il grafo permette anche di ricavare informazioni sulla durata massima e minima di una traccia di esecuzione, permettendo di veri care tutte le temporizzazioni del sistema. Per ricavare la durata di una traccia esistono due approcci diversi dal punto di vista della complessita e della qualita dei risultati43]. Il primo, detto algoritmo di stima a stato singolo, calcola i limiti all' esecuzione della traccia considerando separatamente i domini di esecuzione visitati lungo la traccia stessa questa stima 28 CAPITOLO 3. ANALISI DI MTPN si calcola con complessita lineare rispetto al numero di transizioni della traccia, ma non assicura vincoli minimi. L' altro algoritmo, detto di stima a stato globale, considera in un unico sistema di disequazioni tutti i vincoli incontrati nell' esecuzione della traccia, garantendo limiti ottimi a prezzo di una maggiore complessita computazionale. 3.4.1 Traccia di esecuzione Prima di descrivere in dettaglio i due algoritmi conviene introdurre la notazione usata per descrivere una traccia T : N e il numero di transizioni eseguite nella traccia. S n e l' n-esimo stato incontrato nell' esecuzione della traccia. Con questa notazione S 0 e lo stato di partenza della traccia e S N lo stato nale o di arrivo. F (n) associa all' indice n il nome della transizione che esegue in tale posizione. tF (n) e la transizione che esegue nello stato S n e porta nello stato S n+1 . L' insieme ftF (0) : : : tF (N 1) g indica tutte le transizioni della traccia. (tF (n) ) e il tempo che il sistema passa nello stato S n, ovvero il tempo che passa da quando il sistema entra nello stato S n a quando esegue la transizione tF (n) . ani e bni sono i coecienti che vincolano il tempo all' esecuzione della transizione ti nello stato S n (cioe nel dominio di esecuzione di S n compare il vincolo ani (ti ) bni ). Si suppone inoltre che tutti i domini di esecuzione siano espressi in forma normale e tutte le transizioni del primo stato S 0 sono considerate appena abilitate. LPS (t0 ) associa ad una transizione t0 la posizione nella traccia dell' ultimo stato in cui tale transizione e persistente. Una transizione, dopo essere stata abilitata, resta persistente no a che non esegue o viene disabilitata dall' esecuzione di un' altra transizione. ; 3.4.2 Algoritmo di stima a stato singolo Per ottenere una prima stima del tempo di esecuzione della traccia T , osserviamo che anche la transizione tF (n) esegua nello stato S n , il suo tempo all' esecuzione deve essere minore di tutti i LFT d delle altre transizioni abilitate in S n inoltre valgono i vincoli imposti dal dominio di esecuzione, quindi deve valere il vincolo anF (n) (tF (n) ) bnF (n) sul tempo di permanenza nello stato S n per tutte le transizioni di T . 29 CAPITOLO 3. ANALISI DI MTPN Considerando tutti gli stati visitati nella traccia, una prima stima del tempo globale di esecuzione (T ) si puo esprimere cos: X N ;1 n=0 anF (n) (T ) X N ;1 n=0 min bnk tk 2T (M n ) Per migliorare questa prima approssimazione si deve stimare il tempo di esecuzione di ogni transizione della traccia, usando iterativamente i vincoli descritti in precedenza. L' intervallo di esecuzione di una transizione che esegue nella traccia comincia a scorrere da quando il sistema entra in uno stato che rende la transizione appena abilitata, dunque tale intervallo puo essere reso assoluto, cioe riferito all' inizio dell' esecuzione della traccia, sommandovi il tempo a cui il sistema entra in quello stato. Iterando tale principio per tutta la traccia, si ottiene una stima migliore sul tempo a cui ogni transizione esegue. Indicando con EFT n il vettore dei tempi minimi stimati per l' esecuzione di tF (n) e con LFT n l' analogo vettore dei tempi massimi, tali vettori possono essere calcolati con l' algoritmo di gura 3.2. 0. sia EFT in LFT in] l' intervallo di esecuzione della transizione di ingresso nello stato corrente (inizialmente nullo). 1. per n da 0 a N ; 1 1.1. per ogni transizione ti appena abilitata in S n 1.1.1. se ti esegue in S n (ti tF (n) ) 1.1.1.1. poni EFT n = EFT in + ani 1.1.1.2. poni LFT n = LFT in + mint T (M ) bnk 1.1.2. se ti esegue dopo S n nello stato S m (9m > n : ti tF (m) ) 1.1.2.1. poni EFT m = EFT in + ani 1.1.2.2. poni LFT m = LFT in + bni 1.2. se EFT n < EFT in 1.2.1. poni EFT n = EFT in 1.3. poni EFT in = EFT n 1.4. poni LFT in = LFT n k2 n Figura 3.2. Algoritmo di stima a stato singolo 3.4.3 Algoritmo di stima a stato globale Durante l' esecuzione di una traccia, i possibili tempi di esecuzione delle transizioni sono limitati da vincoli incrociati che ne impediscono il calcolo esatto andando a considerare solo i vincoli locali ad ogni stato. Infatti, poiche il dominio di esecuzione di ogni classe di stati accetta tutti i tempi di esecuzione che sono possibili per ogni stato appartenente alla classe stessa, puo succedere che alcuni degli stati riuniti in una classe non accettino tutti i tempi all' esecuzione che sono invece compatibili con il dominio di esecuzione della classe stessa. Questo impedisce all' algoritmo a stato singolo di fornire delle stime minime, stime che invece sono il risultato dell' algoritmo a stato globale, il quale 30 CAPITOLO 3. ANALISI DI MTPN costruisce un sistema di disequazioni globale in cui compaiono tutti i vincoli che limitano i tempi all' esecuzione di tutte le transizioni eseguite lungo la traccia. Per costruire tale sistema di disequazioni si devono considerare, oltre a tutti i vincoli che compaiono nei domini di esecuzione sulle transizioni che eseguono, anche i vincoli sulle transizioni che non eseguono mai, ma che impongono delle condizioni aggiuntive all' esecuzione della traccia. Un' ulteriore complicazione deriva dal fatto che una transizione ti puo comparire piu volte negli stati visitati dalla traccia ed essere piu volte abilitata, disabilitata e riabilitata di nuovo prima di eseguire. Quando ci riferiamo ad una transizione t0 che esegue nella traccia, intendiamo l' ultima istanza di t0 , escludendo le volte in cui t0 e abilitata e disabilitata prima che possa eseguire. L' algoritmo usa l' idea di ultimo stato di persistenza di una transizione per aggiungere al sistema di disequazioni globale i giusti vincoli. Infatti una transizione appena abilitata puo imporre due tipi di vincoli, a seconda che arrivi o meno all' esecuzione: Se arriva all' esecuzione, il tempo in cui resta persistente deve essere maggiore del suo EFT s e minore del suo LFT s. Se non arriva all' esecuzione resta solo il vincolo che essa non puo restare abilitata senza eseguire per piu del suo LFT s . Il tempo in cui una transizione resta abilitata e il tempo che passa dalla esecuzione della transizione che porta nello stato in cui e appena abilitata alla transizione che esce dall' ultimo stato di persistenza. Un altro vincolo da imporre al sistema di disequazioni globale e che ogni transizione nella traccia esegue dopo le transizioni che la precedono. Applicando queste considerazioni intuitive, ampliate e dimostrate in 43], si ottiene l' algoritmo di calcolo del sistema di disequazioni globale D di gura 3.3. Il sistema di disequazioni globale si puo scrivere nella stessa forma di un dominio di esecuzione e quindi, una volta costruito, lo si puo risolvere normalizzandolo, evidenziando cos i vincoli minimi sui tempi di esecuzione delle singole transizioni della traccia. 3.5 Costruzione di interfacce o erte Abbiamo visto come le interfacce attese siano usate per nascondere i dettagli interni di un modello realizzato con le MTPN orendo di esso solo una rappresentazione in termini degli intervalli di tempo che passano tra l' esecuzione di una transizione osservabile e l' esecuzione di ogni altra transizione osservabile. La scelta delle transizioni osservabili dipende ovviamente dal tipo di rappresentazione che si vuole del modello, potendosi avere piu rappresentazioni di uno stesso modello nalizzate ad analisi diverse. Una volta scelte le transizioni, si deve costruire l' interfaccia attesa in maniera corretta, cioe compatibilmente con la rappresentazione del modello data dal suo grafo di raggiungibilita. La miglior soluzione e quella di costruire direttamente dal grafo l' interfaccia oerta. 31 CAPITOLO 3. ANALISI DI MTPN 1. per ogni transizione ti dello stato iniziale S 0 1.1. se ti esegue in LPS (ti ) 1.1.1. aggiungi a0i (tF (LPS(t )) ) b0i 1.1.2. per ogni transizione tj in S 0 diversa da ti 1.1.2.1. se tj esegue in LPS (tj ) 1.1.2.1.1. aggiungi a0ij (tF (LPS(t )) ) ; (tF (LPS(t )) ) b0ij 1.1.2.2. altrimenti 1.1.2.2.1. aggiungi a0ij (tF (LPS(t )) ) ; (tF (LPS(t )) ) 1.2. altrimenti 1.2.1. aggiungi (tF (LPS(t )) ) b0i 2. per n da 1 a N ; 1 2.1. per ogni transizione ti appena abilitata in S n 2.1.1. se ti esegue in LPS (ti ) 2.1.1.1. aggiungi ani (tF (LPS(t )) ) ; (tF (n 1) ) bni 2.1.2. altrimenti 2.1.2.1. aggiungi (tF (LPS(t )) ) ; (tF (n 1) ) bni 3. per n da 1 a N ; 1 3.1. aggiungi 0 (tF (n) ) ; (tF (n 1) ) i i j i j i ; i i ; ; Figura 3.3. Algoritmo di stima a stato globale A tal ne, per ogni coppia di transizioni osservabili < t0 tf >, si deve calcolare l' intervallo di esecuzione statico oerto FIpis (t0 tf ) in modo tale che dopo l' esecuzione di tf , t0 non esegua prima di essere stato continuamente abilitato per almeno EFTpis (t0 tf ) e non resti continuamente abilitato senza eseguire per piu di LFTpis (t0 tf ). Poiche l' intervallo di esecuzione dinamico di t0 e resettato ogni volta che si esegue una transizione osservabile, EFTpis (t0 tf ) e posto al minimo tempo necessario ad eseguire una traccia che inizi da un qualunque stato in cui si entra attraverso tf e termini con l' esecuzione di t0 senza eseguire nessun' altra transizione osservabile. Se tale traccia non esiste, si pone EFTpis (t0 tf ) = 1, poiche t0 non esegue mai dopo l' esecuzione di tf . Poiche LFTpis (t0 tf ) limita il tempo in cui t0 puo rimanere abilitata senza eseguire, e posto al massimo tempo necessario ad eseguire una traccia che inizi da un qualunque stato in cui si entra attraverso tf e termini con l' esecuzione di una qualunque transizione osservabile. Se non esiste tale traccia, si pone LFTpis (t0 tf ) = 1. 3.5.1 Enumerazione automatica di tracce Per costruire una interfaccia oerta e necessario trovare tutte le tracce che partono da un certo stato e terminano con certe transizioni. La costruzione di tutte queste tracce e un problema non banale, complicato anche dal fatto che le tracce possono fare dei loop nel grafo e che tali loop devono essere segnalati. La soluzione ha portato alla creazione di un algoritmo originale modellato sulla falsa riga dell' algoritmo di attraversamento a ventaglio. 32 CAPITOLO 3. ANALISI DI MTPN L' idea e quella di costruire tutte le tracce che partono da un certo insieme di stati S e niscono con una certa condizione di ne traccia, mantenendo un insieme di tracce # in costruzione, allungandole via via che si attraversa il grafo e terminandole quando si incontra un loop o una condizione di ne traccia. Le tracce nite si mettono nell' insieme ;, mentre i loop in %. Una transizione che innesca un loop si riconosce esaminando la traccia e controllando che non ci sia un' altra esecuzione della stessa stessa traccia che porta nello stesso stato cui porta l' esecuzione attuale. Si introduce l' idea di traccia vuota, intendendo una traccia di lunghezza N = 0 in cui lo stato iniziale coincide con quello nale (S 0 S N ). L' algoritmo completo e mostrato in gura 3.4. 1. poni in le tracce vuote che niscono negli stati di S 2. nche non e vuoto 2.1. togli da la prima traccia T 2.2. sia S N lo stato nale di T 2.3. se S N e uno stato terminale 2.3.1. aggiungi T a ; 2.4. altrimenti per ogni transizione to di uscita per S N 2.4.1. se to e una transizione terminale 2.4.1.1. aggiungi fT + to g a ; 2.4.2. altrimenti se in to innesca un loop 2.4.2.1. aggiungi T a 2.4.3. altrimenti 2.4.3.1. aggiungi fT + to g a T T T Figura 3.4. Algoritmo di enumerazione automatica delle tracce 3.5.2 Algoritmo per il calcolo di interfacce oerte Usando il precedente algoritmo per costruire tutte le tracce possibili tra l' esecuzione di una transizione tf e l' esecuzione di una transizione osservabile, e calcolandone i tempi di esecuzione con i metodi illustrati in precedenza, la costruzione di una interfaccia oerta risulta quasi banale. Le uniche considerazioni che restano da fare riguardano il calcolo del limite superiore ed i loop. Infatti dopo l' esecuzione di tf , tutte le altre transizioni osservabili possono restare continuamente abilitate no a che una di loro non esegue, dato che la nuova esecuzione resetta tutti gli intervalli di esecuzione dinamici. Quindi il LFTpis (t0 tf ) dipende solo da tf , ed e uguale per tutte le transizioni t0 osservabili e raggiungibili, ovvero per tutte le transizioni t0 per cui esiste una traccia che le raggiunge partendo da tf senza eseguire nessun' altra transizione osservabile. Inoltre, poiche si parla di durata massima, quando si calcola tale durata massima tra tutte le tracce che partono con l' esecuzione di tf , si devono considerare eventuali loop incontrati, che possono essere eseguiti in nite volte prima di portare all' esecuzione di una transizione osservabile se almeno uno di questi loop ha durata massima non nulla, dall' esecuzione di tf 33 CAPITOLO 3. ANALISI DI MTPN all' esecuzione di una transizione osservabile puo passare un tempo massimo in nito. Da tutte queste osservazioni si ottiene l' algoritmo di gura 3.5 che calcola tutte le interfacce oerte relative all' esecuzione di una transizione tf . 1. sia l' insieme degli stati in cui si entra con tf 2. costruisci le tracce ; ed i loop che partono da e niscono con una transizione osservabile 3. sia LFT = ;1 la durata massima delle tracce che partono con tf 4. per ogni traccia T in ; 4.1. sia E la durata minima di T 4.2. sia L la durata massima di T 4.3. sia T0 l' ultima transizione di T 4.4. se E < EFTpis (t0 tf ) 4.4.1. EFTpis (t0 tf ) = E 4.5. se L > LFT 4.5.1. LFT = L 5. per ogni loop L in 5.1. se la durata massima di L e > 0 5.1.1. LFT = 1 6. per ogni transizione t0 osservabile e raggiungibile da tf 6.1. LFTpis (t0 tf ) = LFT Figura 3.5. Algoritmo di calcolo delle interfacce oerte 3.6 Esempi Applicando l' algoritmo per la costruzione del grafo degli stati al semplice modello di un protocollo stop and wait (vedi gura 2.1), otteniamo il grafo di gura 3.6, in cui si possono vedere i domini di esecuzione di ciascuno stato. Lo stesso algoritmo permette di calcolare i gra dei singoli moduli che compongono il modello del protocollo di Stenning (vedi gura 2.2), ottenuti dalle reti delle gure 2.3, 2.4, 2.5 e 2.6 con l' assunzione delle rispettive interfacce attese. I gra dei moduli source ( gura 3.7) e TX ( gura 3.9) e dei moduli RX ( gura 3.10) e sink ( gura 3.8), sono stati successivamente integrati con l' algoritmo di integrazione, veri cando cos la correttezza dei vincoli imposti dalle interfacce attese ed ottenendo i gra delle gure 3.11 e 3.12. Applicando nuovamente il processo di integrazione ai gra dei due sottosistemi appena calcolati, otteniamo il grafo dell' intero modello. Il grafo nale e troppo complesso per essere mostrato gra camente e tale complessita complica anche la sua interpretazione. Per sempli care la lettura dei risultati conviene costruire le interfacce oerte dei due sottosistemi source-TX e RX-sink isolando solo le transizioni relative allo scambio di pacchetti tra i due sistemi. Il risultato 34 CAPITOLO 3. ANALISI DI MTPN - S2 : P (tP) 0 0 6 0 4 t0 ? S1 : P1 P2 P6 16 (t1) 16 2 (t3) 4 2 (t6) 4 t6 - S12: P P(t ) 3 1 6 1 14 t1 t3 ? S2 : P1 P4 P6 12 (t1) 14 0 (t7) 0 t7 ? S4 : P1 P7 12 (t1) 14 1 (t8) 2 t8 ? S5 : P1 P5 P6 10 (t1) 13 2 (t4) 4 2 (t5) 4 t4 - S6 : P (tP) 6 1 6 1 11 t1 t5 ? S7 : P1 P3 P6 6 (t1 ) 11 0 (t2 ) 0 t2 Figura 3.6. Grafo del modello del protocollo stop and wait 35 CAPITOLO 3. ANALISI DI MTPN S0 : P0 P2 2 (t0 ) 4 t0 - S0 1 ? :P P 1 2 (t1 ) 1 t1 ? S2 : P0 2 (t0) 4 0 (i20 ) 1 - S0 : P (tP) i20 4 0 2 0 4 t0 t0 ? S3 : P1 0 (i20 ) 1 i20 Figura 3.7. Grafo del modello della sorgente nel protocollo di Stenning - S0 : P (i 0 14 50 ) 1 i50 ? S1 : P12 P14 0 (t13 ) 1 t13 ? S2 : P13 0 (t14 ) 0 t14 Figura 3.8. Grafo del modello della destinazione nel protocollo di Stenning 36 CAPITOLO 3. ANALISI DI MTPN -S 0 : P6 0 (i31 ) 1 i31 ? :P P S1 3 6 1 (t3) 2 t3 ? S2 : P4 P8 16 (t5 ) 16 3 (t7 ) 6 3 (t8 ) 6 -S t8 I@@ t7 ? @@t t5 S3 : P4 10 (t5) 13 0 (i30 ) 1 4 : P4 10 (t5 ) 13 t5 4 @@ ? -S : P 5 5 1 (t4) 2 i3 0 ? :P P S6 4 7 0 (t6) 1 t6 Figura 3.9. Grafo del modello del trasmettitore nel protocollo di Stenning 37 CAPITOLO 3. ANALISI DI MTPN S0 : P10 0 (i41 ) 1 i41 ? S1 : P9 P10 1 (t10 ) 3 10 (i41 ) 1 t10 - S7 : P (i 2 ? 11 41 ) 3 (t11 ) 3 (t12 ) 0 (i40 ) t12 - S0 : P (t P) i40 1 6 6 1 5 QQt QQ 10 11 11 6 0 (t12 ) 6 1 (i41 ) 1 ? S4 : ; 0 (i40 ) 1 0 (i41 ) 1 i40 Q 8 10 41 ) 1 i41 QQs S3 : ; 0 (i40 ) 1 1 (i41 ) 1 i Q QQ i i Q ? + QsS : P ? 41 S7 : P9 0 (i40 ) 1 0 (t9) 0 10 (i41 ) 1 40 - S1 : P (i 11 t12 ?i t11 41 40 6 10 0 (i41 ) 1 6 QkQ t9 QQQQ QQQQQs Q S9 : P9 P10 10 (i41 ) 1 1 (t10 ) 3 i41 i40 i41 S1 0 : ; 0 (i40 ) 1 10 (i41 ) 1 t10 Figura 3.10. Grafo del modello del ricevitore nel protocollo di Stenning 38 CAPITOLO 3. ANALISI DI MTPN S0 : S0 S0 2 (t0 ) 4 ?t 0 S1 : S1 S0 0 (t1 ) 1 ?t 1 - 2: ( ) 4 1 ( ) 2 t t ) ? : S2 S2 S1 t0 t3 0 3 S3 : S3 S1 0 (t3 ) 0 S4 t3 - 163 S2 S2 0 (t3 ) 0 16 (t5 ) 16 3 (t7 ) 6 3 (t8 ) 6 t0 ? S5 : S3 S2 (t5 ) 16 (t7 ) 6 3 (t8 ) 6 ? S6 : S3 S2 13 (t5 ) 16 0 (t7 ) 6 0 (t8 ) 6 Qt Q ?t + QQst ? Qt5 t5 8 7 i30 ? S15 : S3 S6 0 (t6 ) 1 Ht7 S8 : S2 S4 0 (t0 ) 0 13 (t5 ) 13 HHH H:Hj S7 t0 S10 : S3 S4 10 (t5 ) 13 ? i 5 S14 4 QtQ QQ 0 S3 S5 t4 6 S16 : S3 S6 (t6 ) 1 ZZ ZiZ 30 t + 0 S1 S0 0 (t1 ) 1 t1 Figura 3.11. Grafo dell' integrazione tra source e TX 39 S3 S4 13 (t5 ) 13 6 S18 QQ Qs : S13 S11 : S3 S3 30 13 (t5 ) 13 0 (i30 ) 1 t ? + : 1 ( ) 2 @I t 0 HH;t ;t @ @ ; HHHj : Q 9 QQs S2 S3 0 (t0 ) 0 13 (t5 ) 13 0 (i30 ) 1 t8 7 S9 : S3 S3 10 (t5 ) 13 0 (i30 ) 1 - t8 t5 ZZ~ S12 : S2 S6 0 (t0 ) 0 0 (t6 ) 1 ?t 6 S17 : S4 S0 0 (t0 ) 0 CAPITOLO 3. ANALISI DI MTPN S0 : S0 S0 0 (i41 ) 1 -S i41 ? : S1 S0 1 (t10 ) 3 10 (i41 ) 1 1 t10 ? S2 : S2 S1 7 (i41 ) 3 (t11 ) 3 (t12 ) 0 (t13 ) 1 6 6 1 t13 ? S3 : S2 S2 6 (i41 ) 2 (t11 ) 2 (t12 ) 0 (t14 ) 1 6 6 0 t14 ? S4 : S5 S0 2 (t11 ) 6 2 (t12 ) 6 6 (i41 ) 1 t12 - S0 : S (iS ) 6 0 0 41 1 i41 t11 ? :S S S5 8 0 1 (i41 ) 1 i41 Figura 3.12. Grafo dell' integrazione tra RX e sink 40 CAPITOLO 3. ANALISI DI MTPN di questa costruzione e mostrato nelle tabelle 3.1 e 3.2. t7 i30 init 6 1 1 1 t7 14 1 0 1 i30 4 1 1 1 Tabella 3.1. L' interfaccia oerta del sistema composto source-TX t12 i41 init t12 1 1 1 1 0 1 0 1 i41 4 1 10 1 Tabella 3.2. L' interfaccia oerta del sistema composto RX-sink Integrando i gra ottenuti da queste interfacce oerte, si arriva al grafo di gura 3.13 S0 : S0 S0 6 (t7 ) 1 -S t7 ? : S1 S1 14 (t7 ) 1 4 (t12 ) 1 1 t7 t12 ? :S S S2 2 0 4 (t7 ) 1 t7 Figura 3.13. Grafo dell' integrazione delle interfacce oerte dei sistemi source-TX e RX-sink 41 Capitolo 4 Modellazione di Bus con MTPN 4.1 I Bus nei sistemi a microprocessore Il bus e un canale per lo scambio di informazioni tra i moduli di un sistema18]. Le informazioni trasmesse sono di diversi tipi. Il tipo di trasferimento piu frequente riguarda i codici delle istruzioni che passano dalla memoria al microprocessore, ed e evidente che questi trasferimenti dovranno essere il piu veloci possibile, per evitare che il microprocessore si fermi per attendere l' arrivo di una istruzione. I trasferimenti meno frequenti sono generalmente quelli che coinvolgono le memoria di massa o altre periferiche di ingresso/uscita, in cui l' accesso (in termini di indirizzamento sul bus) non e casuale, ma avviene tramite porte di interfaccia associate a funzioni del dispositivo di I/O. Il generale il bus deve avere caratteristiche diverse a seconda della natura delle informazioni da trasferire e del tipo di dispositivi che deve mettere in comunicazione. Funzionalmente si possono de nire diversi tipi di bus per microcomputer: Bus locali che permettono frequenti trasferimenti ad alta velocita di pochi dati tra componenti molto integrate tra loro. Bus per back-plane, che si occupano di trasferimenti meno frequenti ad alta velocita tra componenti del sistema che si trovano su schede dierenti all' interno del cabinet principale. Bus di sistema usati per trasferimenti paralleli ad alta velocita di blocchi di dati tra microprocessori e la memoria di sistema condivisa in un sistema multiprocessore o tra un microcomputer e dispositivi di I/O ad alta velocita in sistemi ad alte prestazioni. Bus di I/O che forniscono supportano i trasferimenti, relativamente poco frequenti, di grossi blocchi di dati tra un microcomputer e le sue periferiche di I/O questi bus sono di due tipi: seriali e paralleli. 42 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN Non e plausibile pensare di costruire un microcomputer dotato di tanti bus diversi, ognuno dedicato ed ottimizzato per le comunicazioni con un solo dispositivo. Il numero di connessioni da realizzare nelle schede e negli integrati, lo spazio sico richiesto per disporre i bus e le dicolta di eventuali modi che o espansioni al progetto originale impongono di usare dei bus condivisi da piu dispositivi. Per questo una singola struttura a bus e comunemente impiegata per connettere molteplici dispositivi In un semplice bus che collega due dispositivi, la comunicazione e facile: un dispositivo (il master, tipicamente la CPU) inizia il trasferimento dei dati e l' altro (lo slave), fornisce o riceve i dati in questione. Le cose si complicano se al bus sono collegati altri dispositivi slave, poiche per completare un trasferimento il master deve indicare a quale slave si rivolge (ad esempio tramite un indirizzo). Se poi sul bus sono presenti altri dispositivi che possono funzionare come master (ad esempio un controllore di DMA), ogni master deve ottenere l' uso del bus prima di iniziare un trasferimento. Nella situazione di maggior complessita si possono individuare tre diverse azioni di controllo esercitate nelle operazioni di un bus: fasi: Device synchronization. Il dispositivo slave manda al master la richiesta di iniziare un trasferimento di dati. La richiesta e riconosciuta dal master, che ne esamina la priorita ed inizia il trasferimento non appena la richiesta ha la priorita piu alta tra le eventuali altre richieste fatte. Bus allocation. Il master richiede l' uso del bus. La richiesta e riconosciuta e la sua priorita esaminata dalla logica di arbitraggio. Quando la richiesta ha la priorita piu alta ed il bus e libero, il master ne ottiene il controllo. Data transfer. Il master segnala allo slave che e pronto per il trasferimento. Lo slave risponde ed ha luogo il trasferimento. Completato il trasferimento, il master rilascia il bus ed esamina la richiesta successiva. Durante ogni fase delle operazioni, i dispositivi master e slave devono generare la giusta sequenza di segnali di controllo, in accordo all' ordine ed alla temporizzazione de nite nel protocollo del bus. 4.1.1 Specica del protocollo di un bus Il protocollo del bus speci ca completamente il bus, descrivendone le caratteristiche siche (numero di segnali e le loro tensioni, forma dei connettori, ecc.), logiche (signi cato dei segnali, uso dei segnali, ecc) e temporali (temporizzazioni, vincoli di priorita, ecc.). Le proprieta logico-temporali di un bus sono quelle che piu lo caratterizzano, ma sono anche le piu dicili da speci care in maniera completa e non ambigua. I metodi piu usati per descrivere le operazioni di un bus sono tre: i diagrammi temporali (timing diagram), i diagrammi di sequenza (sequence diagram) ed i diagrammi di stato (state diagram). Diagrammi temporali La sequenza delle operazioni e descritta da un insieme di gra ci che indicano le variazioni nel tempo dei segnali di controllo rilevanti. Le condizioni logiche che causano le transizioni dei segnali sono indicate con delle frecce. 43 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN Il metodo dei diagrammi temporali e popolare poiche permette di identi care facilmente le transizioni importanti nella sequenza delle operazioni e presenta le informazioni nello stesso modo del monitor di un analizzatore di stati logici. Nonostante questo, l' interpretazione di questi diagrammi non e sempre facile, per i seguenti motivi: Lo stato logico dei dispositivi non e mostrato e si ricostruire solo approssimatamente dall' andamento temporale dei segnali di controllo1 . I segnali di controllo generati da dispositivi diversi e spesso sicamente lontani sono combinati un un solo diagramma. Spesso l' unica sequenza di operazioni mostrata e quella normale, poiche per descrivere tutte le sequenze possibili sarebbero necessari troppi diagrammi. Le operazioni meno comuni, che potrebbero accadere durante l' accensione del sistema o in caso di errore, sono presentate raramente e con descrizioni spesso incomplete. Diagrammi di sequenza La sequenza delle operazioni e descritta da una lista di frasi che speci cano ogni evento. Le frasi sono tabulate in ordine cronologico in due o piu colonne, una per ogni dispositivo. Il usso degli eventi nella tabella e indicato da frecce tra gli eventi importanti. Poiche gli eventi sono tabulati in ordine cronologico, si ha una informazione, benche minima, sull' ordine temporale degli eventi stessi. Questo metodo di descrivere il protocollo di un bus e particolarmente interessante quando la logica di interfacciamento al bus e implementata in software: Il diagramma si puo banalmente tradurre nel diagramma di usso di un programma. Le operazioni di ogni dispositivo sono elencate separatamente e sono quindi piu facili da capire. Gli eventi contemporanei sono mostrati chiaramente. Nonostante questo, i diagrammi di sequenza hanno alcuna pesanti limitazioni: La descrizione verbale delle operazioni e, oltre che non elegante, imprecisa ed ambigua. Mancano nel diagramma informazioni temporali precise. Le transizioni dei segnali di controllo non sono indicate esplicitamente. Le condizioni logiche degli ingressi e delle uscite di un circuito logico sequenziale dicilmente indicano lo stato interno in maniera non ambigua. 1 44 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN Diagrammi di stato I diagrammi di stato forniscono una descrizione completa e non ambigua delle operazioni di un bus. Le operazioni di ogni dispositivo sono descritte da un diverso diagramma di stato, ed in ogni diagramma sono indicati chiaramente sia lo stato interno del dispositivo che le transizioni dei segnali di ingresso che provocano un cambio di stato e la transizione dei segnali di uscita. Poiche i diagrammi di stato de niscono la risposta dei dispositivi a tutti i segnali in tutti i possibili stati, essi speci cano il protocollo del bus in maniera completa. Sebbene siano completi e non ambigui, i diagrammi di stato sono dicili da interpretare in termini di variazioni temporali dei segnali di controllo e possono diventare oscuri se si mostrano tutte le transizioni. Per sempli carne la lettura, si usano di solito dei diagrammi incompleti, che mostrano solo le transizioni che avvengono in circostanze normali e se ne chiarisce l' interpretazione con diagrammi temporali. 4.2 Modellazione dei componenti di un bus Le MTPN costituiscono un buon modo per speci care il protocollo di un bus ed il suo funzionamento, dato che mantengono l' espressivita dei diagrammi di stato per quanto riguarda le transizioni dei segnali e allo stesso tempo evidenziano le sequenze temporali ed i vincoli di temporizzazione a cui i segnali devono sottostare. Inoltre la modularita delle MTPN permette di modellare e veri care un aspetto del bus per volta e poi comporre i risultati in un modello completo del bus. In questa sezione vedremo come modellare con le MTPN le principali componenti di un bus per microcomputer, focalizzando l' attenzione sulle temporizzazioni e le sincronizzazioni tra i segnali di controllo. Nella modellazione con le MTPN, i segnali sono rappresentati da piazze, eventualmente importate, ed il livello del segnale e alto se la piazza contiene un gettone, basso se la piazza e vuota. Inoltre si useranno spesso le funzioni di abilitazione per abilitare la transizione di un certo segnale in base a condizioni logiche sugli altri segnali. 4.2.1 Segnali di controllo per il trasferimento dati Questi segnali di controllo presiedono al trasferimento dei dati. Prima di trasferire un dato e necessario speci care la sua sorgente o la sua destinazione, ovvero l' indirizzo a cui il master si riferisce di solito il master pone l' indirizzo sulle linee del bus dati o di un bus indirizzi speci co prima di avviare il trasferimento vero e proprio. Spesso sono necessarie altre informazioni prima del trasferimento vero e proprio, come la direzione del trasferimento (lettura o scrittura), il tipo di dispositivo coinvolto (mappato in memoria, nello spazio di I/O, ecc), l' ampiezza del trasferimento (1, 2, 4 byte o piu), quali linee del bus si usano, ecc. Quando tutto e pronto, occorrono altri segnali per coordinare il trasferimento del dato tra il master e lo slave, se questi operano in maniera asincrona. 45 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN Esistono sono tre modi di controllare il trasferimento dei dati: il trasferimento sincrono, asincrono e semisincrono18]. One-Way (Synchronous) Control - DREQ DREQ master slave Figura 4.1. Trasferimento di dati sincrono Il trasferimento sincrono e il metodo piu semplice e veloce di comunicare tra dispositivi che operino a velocita comparabili. In questo schema (vedi gura 4.1) il master usa un solo segnale (DREQ) per comunicare allo slave l' inizio di un trasferimento di dati e lo slave deve rispondere entro un tempo massimo pre ssato. La rete di gura 4.2 presenta una possibile modello di una lettura 0 1] t1 DREQ t2 1 2 ] DREQ master t3 3 4 ] slave Figura 4.2. Modello di un trasferimento di dati sincrono di dati in modalita sincrona. La transizione t1 modella la necessita del master di leggere un dato quando scatta, il master alza DREQ e dopo aver atteso un tempo compreso tra 1 e 2 legge il dato e ritorna nella condizione iniziale. Si noti che la lettura avviene (sulle linee del bus dati) con l' esecuzione di t1 , pertanto lo slave deve aver fornito il dato richiesto prima che t1 esegua. Tale vincolo si traduce nella condizione 4 1 , imponendo che la transizione t3 , quella che rende disponibili i dati sul bus, esegua prima del tempo minimo di durata per DREQ. Per quanto riguarda il modello del modulo slave, esso puo assumere che il segnale DREQ, una volta asserito, resti asserito per un intervallo di tempo a b ], con a 1 e b 2 , e tale assunzione si traduce 46 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN in vincoli nell' interfaccia attesa del modulo, come in tabella 4.1: init . . . DREQ 0 1 . . . 1 1 1 1 . . . a b " DREQ DREQ " # DREQ 0 1 1 1 # ... ... ... Tabella 4.1. Parte dell' interfaccia attesa dello schema di trasferimento sincrono Request/Acknowledge (Handshake) Control - DREQ DREQ DRDY DRDY master slave Figura 4.3. Trasferimento di dati asincrono In questo caso il master e lo slave si servono di due linee di controllo (DREQ e DRDY ) per segnalare rispettivamente la necessita di un dato e la disponibilita a fornirlo (vedi gura 4.3). Di questo metodo esistono tre varianti, a seconda di quanto strettamente sono legati il master e lo slave. 0 1] t1 DREQ DREQ t2 1 2 ] 5 6 ] t3 DRDY t4 3 4 ] DRDY master slave Figura 4.4. Modello di un trasferimento di dati asincrono non-interlocking La prima, in gura 4.4, e detta non-interlocking. In essa il master chiede un dato alzando DREQ, aspetta che lo slave segnali la disponibilita del dato con DRDY e legge il dato dopo un tempo pre ssato, modellato nella transizione t2 . Lo slave si limita a rispondere a DREQ alzando, con il ritardo de nito in t3 , il segnale DRDY e mantenendolo per il tempo de nito in t4 . Puo succedere che lo slave tolga il dato prima che il master lo legga, causando un errore di trasferimento. La seconda, in gura 4.5, e detta half-interlocking. Adesso lo slave mantiene il dato nche il master segnala la lettura abbassando DREQ. Nel modello cambia 47 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN 0 1] t1 5 6 ] t3 DREQ DREQ DRDY t4 t2 1 2 ] 3 4 ] DRDY master slave Figura 4.5. Modello di un trasferimento di dati asincrono half-interlocking lo slave, in cui si aggiunge l' inibizione di t4 da parte di DREQ, che realizza quanto detto. Si puo avere ancora un errore se il master cerca di iniziare un' altro trasferimento prima che lo slave abbia completato il ciclo e sia tornato allo stato iniziale. Il master interpreterebbe il DRDY residuo come una risposta al nuovo DREQ e leggerebbe i dati sbagliati. t1 0 1] DREQ t5 7 8 ] t2 1 2 ] DRDY DREQ t4 5 6 ] t3 DRDY 3 4 ] master slave Figura 4.6. Modello di un trasferimento di dati asincrono fully-interlocking La soluzione fully-interlocking di gura 4.6 risolve il problema imponendo che il master attenda che lo slave abbassi DRDY prima di iniziare un nuovo trasferimento. Nel modello, DRDY inibisce t3 che riporta il master allo stato iniziale, mentre la lettura del dato avviene sempre con t2 . Il limite maggiore della soluzione fully-interlocking e la riduzione della la velocita di trasferimento, a causa degli ulteriori ritardi di propagazione nel bus introdotti. Semisynchronous Control Il trasferimento semisincrono combina la velocita dei trasferimenti sincroni con la capacita di sincronizzazione con i dispositivi piu lenti dei protocolli asincroni. Normalmente il master legge i dati sul bus alla massima velocita possibile e sono i dispositivi lenti a segnalare al master di aspettarli. In questo schema (vedi 48 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN - DREQ DREQ DRDY master CLK DRDY - CLK slave CLK clock Figura 4.7. Trasferimento di dati semisincrono gura 4.7) il ciclo di lettura si compone di due stati piu un terzo stato di wait. Il master controlla il bus solo in corrispondenza dei fronti di discesa del clock e se trova il segnale WAIT alto, entra nello stato di wait, aspettando il prossimo ciclo per controllare se puo portare a termina la lettura. Il modello in gura 4.8 e complicato dal generatore di clock (transizioni t5 e t6 ), rappresentato da un oscillatore in cui il clock resta alto (un gettone in CLK ) per un periodo " e basso per T ; ". 4.2.2 Segnali di controllo per l' accesso al bus Prima che un master possa iniziare un trasferimento di dati, esso deve ottenere il controllo del bus. Questi segnali servono ad indicare quale master ha richiesto il bus ed a stabilire la sua priorita nel caso ci siano altre richieste da servire. Il controllo dell' accesso al bus puo essere centralizzato se l' arbitraggio e gestito da un apposito controllore o decentralizzato se tutti i master possiedono la logica necessaria a condividere il bus. Gli schemi piu diusi per il controllo centralizzato dell' accesso al bus sono tre: seriale con due linee, seriale con tre linee e parallelo a richieste indipendenti. Two-wire Serial Control Il controllore del bus usa due linee di controllo per comunicare con i master: BREQ e BGNT . La linea di bus request e una linea di ingresso per il controllore a cui i master sono collegati con un wired OR, in modo che tutti i master possano leggerne lo stato ed asserirla. La linea di bus grant e un uscita del controllore che si propaga tra i master con una daisy chain, in modo da realizzare un meccanismo di priorita in cui il master piu vicino al controllore ha la priorita piu alta. Un master puo accedere al bus solo se ha asserito BREQ e rileva BGNT alto in ingresso. Se un master non deve usare il bus, propaga BGNT in uscita agli altri master della catena. Quando un master deve usare il bus, controlla che entrambe le linee BREQ e BGNT in ingresso siano basse e poi alza BREQ. Il controllore, non appena sente BREQ alta, alza a sua volta BGNT , che si propaga nella catena no a raggiungere il master che ha generato la richiesta. Adesso il master puo usare il bus, mantenendo BREQ alto no alla ne della 49 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN WAIT 3 4 ] 1 2 ] 5 6 ] t3 CLK t2 t4 DREQ t1 0 1] master T ; " T ; "] t6 CLK t5 " "] 7 8 ] DREQ t7 clock 9 10 ] WAIT 11 12 ] t8 13 14 ] t9 t10 CLK slave Figura 4.8. Modello di un trasferimento di dati semisincrono BGNT controller BREQ - BGI master1 BGO BREQ BR1 6 BREQ ? - BGI master2 BGO BREQ BR2 6 BR1 wiredOR BREQ Figura 4.9. Arbitraggio seriale del bus con due linee 50 ? BR2 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN transazione. A questo punto abbassa BREQ e propaga BGNT in uscita. Il controllore nega BGNT non appena rileva l' abbassamento di BREQ. Nel modello di gura 4.10 si usano delle reti molto semplici per modellare i segnali. Queste reti hanno generalmente una piazza corrispondente allo stato della linea, una piazza corrispondente alla sua negazione e due transizioni che si occupano di alzare ed abbassare il segnale. Associate a queste transizioni ci sono due funzioni di abilitazione, che abilitano la transizione in accordo con la logica che gestisce il segnale. Il tempo all' esecuzione di queste transizioni puo essere usato per modellare i ritardi inseriti dalle porte necessarie a realizzare praticamente il circuito. La linea BREQ, che e realizzata con un wired OR, richiede un modulo di gestione, poiche ogni modulo puo controllare solo le proprie piazze e transizioni, limitando l' accesso alle altre alla sola lettura. Tale modulo controlla il segnale BREQ, alzandolo appena una delle linee BRi si alza ed abbassandolo quando nessuna e attiva. Il master ha un segnale NEED che prima o poi si alza, segnalando la necessita di usare il bus. Da quando il master ottiene il bus tramite la linea BGI (il bus grant in ingresso), esso lo usa per l' intervallo stabilito da t6 e poi lo rilascia. Three-wire Serial Control Le modalita di controllo del bus sono simili al caso a due linee, salvo la presenza di BBSY , una terza linea di controllo in wired OR che segnala l' uso del bus da parte di un master. Quando un master ottiene l' accesso al bus, abbassa BREQ ed asserisce BBSY , mantenendolo alto durante l' uso del bus. In questo schema i master possono asserire BREQ in qualsiasi momento, ma devono negarlo non appena ottengono il controllo del bus. Il controllore asserisce BGNT solo quando rileva BREQ e BBSY e falso, e poi lo nega non appena il nuovo proprietario del bus asserisce BBSY . Il modello (vedi gura 4.12) e simile al caso precedente, cui si e aggiunto un modulo per il controllo in wired OR di BBSY e si e modi cata la logica delle transizioni in accordo con il nuovo comportamento. Indipendent Request In questo schema ogni master e collegato da due linee di controllo dedicate, BRi e BGi, ed una condivisa, BBSY con il controllore del bus. Quando un master i deve accedere al bus, asserisce la sua linea di bus request (BRi). Il controllore confronta la priorita della richiesta con il proprietario attuale del bus e le altre eventuali richieste: se la nuova richiesta ha la priorita piu alta, il controllore nega il segnale di bus grant (BGj ) del master j corrente per spingerlo a rilasciare il bus il prima possibile. Quando il master corrente libera il bus abbassando BBSY , il controllore segnala la disponibilita del bus al master in attesa con la priorita piu alta. 51 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN 0 1] t1 3 4 ] t3 NEED BGO t2 1 2 ] t4 5 6 ] BGI 7 8 ] t5 BREQ BR i t6 9 10 ] master i BREQ 11 12 ] t7 BGNT t8 13 14 ] controller 15 16 ] t9 BR1 BREQ BR2 BR t10 17 18 ] n wired OR Figura 4.10. Modello di accesso al bus seriale a due linee 52 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN - BGI BGNT master1 BGO BBSY BB1 BR1 6 controller BBSY BREQ ? ? - BGI master2 BGO BBSY BB2 BR2 6 ? ? BBSY BB1 BR1 BBSY BB2 BR2 BREQ wiredOR Figura 4.11. Arbitraggio seriale del bus con tre linee 0 1] t1 3 4 ] t3 NEED BGO BGI t2 1 2 ] 11 12 ] t7 t4 5 6 ] 7 8 ] t5 BR BBSY BB i t8 13 14 ] i t6 9 10 ] master i 23 24 ] t13 BREQ BGNT BBSY t14 25 26 ] controller Figura 4.12. Modello di accesso al bus seriale a tre linee 53 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN master1 BG1 BR1 BB1 ? wired OR BB1 BG1 BG2 - BR1controllerBR2 BBSY 6 BBSY - BG 2 BR2 BB2 master2 ? BB2 Figura 4.13. Arbitraggio del bus tramite richieste indipendenti Nel modello di gura 4.14 si esempli ca il caso di un controllore che gestisca no a due master. Si noti ancora il modulo wired OR per la gestione di BBSY . 4.2.3 Segnali di interruzione I segnali visti no ad ora permettono ai master di comunicare con i dispositivi slave. Questi segnali forniscono agli slave il mezzo per attirare l' attenzione dei master, segnalando che sono pronti ad eettuare un trasferimento di dati. In questo modo si evita che ogni master debba fare il polling dei dispositivi slave per veri care se possono ricevere altri dati, con il conseguente spreco di risorse. I segnali interruzione devono permettere di individuare il dispositivo slave che ha segnalato l' interruzione e la sua priorita. Gli schemi piu diusi sono due: richieste indipendenti ed interruzioni vettorizzate. Indipendent Request E' lo schema piu semplice, in cui ogni dispositivo e collegato da una linea di interruzione dedicata con il master. Tale linea individua univocamente il dispositivo che ha richiesto l' attenzione del master, che ne puo valutare la priorita. Daisy-chain Vectored Interrupt In questo schema i dispositivi segnalano la richiesta di interruzione tramite una linea comune IRQ di tipo wired OR. Quando il master riceve la richiesta, completa la transazione in corso e risponde con un segnale di riconoscimento IACK , che si propaga tramite una daisy-chain no al dispositivo a priorita piu alta che ha richiesto una interruzione. Tale dispositivo fornisce al master un codice di identi cazione tramite il bus dati, dove il master lo legge in maniera solitamente sincrona. Una volta identi cato il dispositivo da servire, il master nega IACK , acquisisce il bus ed inizia i trasferimenti necessari. 4.2.4 Segnali ausiliari La maggior parte dei bus possiede delle linee usate da segnali di controllo utili ma non necessari al corretto funzionamento del bus. Sebbene il numero e la 54 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN 0 1] t1 3 4 ] t3 NEED t2 1 2 ] BR i BB i t4 5 6 ] BG 7 8 ] t5 i t6 9 10 ] master i BR1 11 12 ] t7 BG1 t8 13 14 ] BBSY BR2 15 16 ] t9 BG2 t10 17 18 ] controller Figura 4.14. Modello di accesso al bus tramite richieste indipendenti 55 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN IR1 slave1 - IR 1 master IR2 IR2 slave2 Figura 4.15. Interruzioni tramite richieste indipendenti 1 2 ] t1 IR1 IRQ IR2 t2 2 3 ] IR n master Figura 4.16. Modello di interruzioni tramite richieste indipendenti IACK master IRQ - IAI IAO slave1 IR1 IRQ IR1 ? - IAI slave2 wiredOR Figura 4.17. Interruzioni vettorizzate 56 IAO IR2 ? IR2 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN 0 1] t1 3 4 ] t3 IR i IAO IAI t2 1 2 ] t4 5 6 ] slave i IRQ 11 12 ] t7 IACK t8 13 14 ] master Figura 4.18. Modello di interruzioni vettorizzate funzione di questi segnali vari largamente da bus a bus, essi si possono riunire in quattro gruppi: controllo del sistema, espansione degli indirizzi, controllo dell' alimentazione ed alimentazioni ausiliarie. System Synchronization and Control Tutti i bus forniscono una linea di RESET che provoca l' inizializzazione dei dispositivi connessi al bus. Tale segnale di solito e generato dal controllore del bus subito dopo l' accensione o dopo un errore di sistema. Alcuni bus hanno piu di una linea di reset per inizializzare indipendentemente diversi tipi di dispositivi. Inoltre molti bus forniscono il clock di sistema con cui sincronizzare tutte le operazioni del bus ed un clock ausiliario, non sincronizzato con il primo, il cui uso non e de nito nelle speci che. Slave Addressing Spesso un bus fornisce delle linee ausiliarie di controllo per espandere, migliorare od abilitare l' indirizzamento dei dispositivi slave. Tramite queste linee si possono realizzare accessi alla memoria a pagine, abilitare delle mappe di indirizzamento fantasma (di solito usate durante l' inizializzazione del sistema) o realizzare degli accessi protetti. 57 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN Power Failure Quasi tutti i sistemi industriali hanno bisogno di una linea che informi i dispositivi che sta per mancare l' alimentazione e che bisogna prendere provvedimenti di emergenza. Tale linea e di solito generata dal modulo di alimentazione tramite un circuito che rileva la perdita della tensione di rete prima che la tensione di sistema ne sia inuenzata. L' attivarsi di questo segnale indica che manchera l' alimentazione entro un certo tempo. Spesso questo segnale controlla anche le linee di reset, per inizializzare correttamente tutti i dispositivi dopo la perdita dell' alimentazione. Auxiliary Power and Ground Alcuni bus forniscono su linee addizionali delle tensioni di alimentazione diverse da quella di sistema, ad uso dei dispositivi collegati al bus. 4.3 Un' esempio: il bus VME Il bus VME29] deriva dal bus proprietario VERSAbus di Motorola, nato per interconnettere schede basate sulla famiglia di processori M68k, sia a 16 che a 32 bit. Una versione piu compatta venne sviluppata dalla Motorola di Monaco e divenne uno standard europeo. Nel 1981 la Motorola, in collaborazione con altre ditte europee, annuncio il bus VME come standard non proprietario ed in seguito tale bus ha avuto una larga diusione soprattutto nel campo della strumentazione automatica di misura. Il bus VME supporta dispositivi a 8, 16 e 32 bit per le linee dati e permette indirizzi a 16, 24 e 32 bit inoltre fornisce il supporto per sistemi multiprocessore. Le schede sono connesse sicamente ad un backplane tramite due connettori a 96 pin, P 1 e P 2: il connettore P 1 contiene il bus primario, mentre P 2 e opzionale, essendo necessario solo per espandere il bus a 32 bit di dati ed a 32 linee di indirizzi. 4.3.1 Descrizione dei segnali del bus VME Le linee possono essere pilotate da dispositivi con stadi di uscita open-collector (OC), tristate (TS) oppure totem-pole (TP). ACFAIL* (AC Failure, OC) Indica che l' alimentazione principale non e piu disponibile. AM0-AM5 (Address Modier, TS) Forniscono ulteriori informazioni sul bus indirizzi, come la dimensione, il tipo di ciclo, ecc. AS* (Address Strobe, TS) Indica che il bus indirizzi contiene un indirizzo valido. A01-A23 (Address Bus, TS) Prime 23 linee del bus indirizzi. A24-A31 (Address Bus, TS) Linee di espansione del bus indirizzi. 58 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN (Bus Busy, OC) Indica che il bus dati e occupato dalla scheda che lo genera. BCLR* (Bus Clear, TP) Generato dal bus arbiter, indica che il possessore attuale del bus dati deve lasciare l' uso del bus ad un master a priorita piu alta. BERR* (Bus Error, OC) Indica un errore irrecuperabile durante un trasferimento dati, con la necessita di abortire il ciclo. BG0IN*-BG3IN* (Bus Grant (0-3) In, TP) Formano insieme a BGxOUT** tre daisy-chain per l' arbitraggio del bus. Indicano che la scheda puo diventare il prossimo bus master. BG0OUT*-BG3OUT* (Bus Grant (0-3) Out, TP) Formano insieme a BGxIN* tre daisy-chain per l' arbitraggio del bus. Indicano che la scheda successiva puo diventare il prossimo bus master. BR0*-BR3* (Bus Request (0-3), OC) Indicano al bus arbiter che un bus master richiede l' uso del bus. DS0* (Data Strobe 0, TS) Indica, durante un trasferimento dati, che il trasferimento usera le linee dati D00-D07. DS1* (Data Strobe 1, TS) Indica, durante un trasferimento dati, che il trasferimento usera le linee dati D08-D15. DTACK* (Data Transfer Acknowledge, OC) Durante un ciclo di lettura indica che sul bus dati sono disponibili dei dati validi, mentre in un ciclo di scrittura indica che i dati sono stati accettati. D00-D15 (Data Bus, TS) Linee bidirezionali per lo scambio di dati tra master e slave. D16-D31 (Data Bus, TS) Linee bidirezionali di espansione del bus dati. GND (Ground) Linea di massa. IACK* (Interrupt Acknowledge, OC) Segnala il trattamento da parte di un master di una richiesta di interruzione: e trasportato dal backplane no al primo slot dove inizia la daisy-chain del riconoscimento di interruzione. IACKIN* (Interrupt Acknowledge In, TP) Forma insieme a IACKOUT* una daisychain ed indica alla scheda che e in corso un ciclo di riconoscimento di interruzione. IACKOUT* (Interrupt Acknowledge Out, TP) Forma insieme a IACKIN* una daisy-chain ed indica alla scheda successiva che e in corso un ciclo di riconoscimento di interruzione. IRQ1*-IRQ7* (Interrupt Request (1-7), OC) Indicano la richiesta di interruzione da parte di un dispositivo: IRQ7* ha la priorita piu alta. BBSY* 59 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN (Longword, TS) Indica che il trasferimento di dati in corso e a 32 bit. SERCLK (Serial Clock, TP) E' un segnale riservato all' uso come linea di clock nel protocollo di comunicazione seriale VMS. SERDAT (Serial Data, OC) E' un segnale riservato all' uso come linea dati nel protocollo di comunicazione seriale VMS. SYSCLK (System Clock, TP) E' un segnale di clock a 16 MHz indipendente dalla velocita del processore, usato per generiche temporizzazioni. SYSFAIL* (System Fail, OC) Indica un malfunzionamento del sistema e pu o essere generato da qualunque scheda. SYSRESET* (System Reset, OC) Provoca il reset del sistema. WRITE* (Write, TS) Speci ca il tipo di trasferimento dati: alto per operazioni di lettura e basso per operazioni di scrittura. +5V STDBY (+5 Vdc Standby) Fornisce +5 Vdc ai dispositivi che richiedono una batteria tampone. +5V (+5Vdc Power) Alimentazione a +5Vdc. +12V (+12Vdc Power) Alimentazione a +12Vdc. -12V (-12Vdc Power) Alimentazione a -12Vdc. LWORD* 4.3.2 Funzionamento del bus VME Le linee del bus VME possono essere raggruppate in diverse categorie: linee indirizzi, linee dati, linee di interruzione e controllo, linee di arbitraggio del bus e linee di utilita. Le linee indirizzi e dati sono pilotate da dispositivi tristate mentre la maggior parte delle linee di controllo sono pilotate da dispositivi open-collector. Il bus principale ha 23 linee indirizzi, A01-A23. Includendo il bus opzionale si aggiungono altre 8 linee, A24-A31, per l' indirizzamenti no a 4 gigabyte. Le linee indirizzi sono pilotate dal bus master per speci care la locazione della word (16 bit) a cui si vuole accedere. Oltre all' indirizzo si usano i segnali DS0* e DS1* per selezionare la parte da trasferire: byte basso, byte alto o tutta la word. Insieme all' indirizzo il master usa AS* per segnalare un indirizzo valido ed un modi catore a 6 bit, AM0-AM5, ad indicare la dimensione ed il tipo di accesso (accesso dati, accesso programma, accesso protetto, ecc). Il bus dati principale e composto da 16 linee bidirezionali, D00-D15, di cui le prime otto sono usate in sistemi a 8 bit. Il supporto di dispositivi a 32 bit si ha con l' aggiunta del bus opzionale, che fornisce le linee necessarie, D16-D31. Un trasferimento a 32 bit e indicato dal bus master con il segnale LWORD*. Si noti che un trasferimento a 32 bit puo essere eettuato solo ad indirizzi divisibili per 4. Il trasferimento dei dati nel bus VME avviene in modalita fully-interlocking. Il master usa il segnale WRITE* per speci care una lettura 60 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN (WRITE* alto) od una scrittura (WRITE* basso), mentre lo slave usa DTACK* per terminare il trasferimento. Per gestire con gurazioni multiprocessore, sono fornite 14 linee per l' arbitraggio del bus, gestite generalmente da un arbitro nel modulo di controllo del sistema. L' arbitraggio avviene con lo schema seriale a tre linee con quattro livelli di priorita. Un bus master puo richiedere il controllo del bus tramite una delle quattro linee di richiesta, BR0*-BR3*. Ogni linea di richiesta corrisponde ad una linea di grant che e gestita con una daisy-chain tramite le linee BGxIT/OUT. Il master che riceve il segnale di bus grant asserisce BBSY* e non propaga il grant ai moduli successivi nella catena. Il controllo del bus resta al master nche questo non lo lascia negando BBSY*. L' arbitro puo risolvere i conitti tra le richieste con uno di tre schemi diversi. L' arbitraggio a priorita assegna il bus sulla base di priorita sse, con la linea 3 che indica la priorita piu alta in questo caso l' arbitro usa BCLR* per informare il master corrente che deve rilasciare il bus ad un modulo a priorita piu alta. Nell' arbitraggio round-robin il master che ha ottenuto il controllo per ultimo ha la priorita piu bassa nel successivo ciclo di arbitraggio. L' arbitraggio ad un solo livello usa una sola linea BR3* per le richieste ed assegna le priorita in base al solo ordine nella daisy-chain. Il bus VME supporta interruzioni con priorita vettorizzate. Sette linee di richiesta di interruzione, IRQ1*-IRQ7*, sono a disposizione di un master per ricevere richieste, con la linea 7 alla priorita piu alta. Alla richiesta di interruzione il master risponde con un codice di livello sulle linee A01-A03 lo slave decodi ca il codice e controlla il segnale di riconoscimento della daisy-chain IACKIN*: se il livello della richiesta non corrisponde al livello indicato dal master, lo slave passa il segnale di riconoscimento al modulo successivo nella catena tramite IACKOUT*, altrimenti invia al master il suo codice di interruzione sulle linee D00-D08. 4.3.3 Il protocollo per il trasferimento dati nel bus VME data control READWRITE- DONE . data master AS DS 0 WRITEDTACK data slave Figura 4.19. Modello di lettura di un byte nel bus VME In gura 4.19 vediamo lo schema dei moduli necessari a modellare un trasferimento di un byte da un dispositivo slave ad un master (lettura). Nel modello sono presenti solo le linee di controllo interessate nel trasferimento. Il modulo Data Control comanda una lettura od una scrittura al modulo Data Master asserendo READ o WRITE no a che il il master non risponde 61 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN asserendo DONE naturalmente si suppone che il modulo di controllo abbia gia ottenuto il controllo del bus ed abbia posto l' indirizzo giusto sul bus nel momento che comanda la lettura. Il modulo Data Master funge da interfaccia tra il bus ed il modulo di controllo, gestendo i dettagli della comunicazione con il Data Slave e comunicando con DONE che il dato e disponibile sul bus. Data Control 0 1] t0 data control READ 1 2] t1 DONE Figura 4.20. Modello del modulo di controllo del trasferimento dati su bus VME Il modulo di gura 4.20 modella un controller che deve eettuare una sola lettura da un modulo slave. Prima o poi t0 esegue, comandando la lettura tramite il segnale READ, segnale che viene disasserito non appena il modulo di interfaccia risponde con DONE . In questo semplice esempio si suppone che tutti i segnali cambino stato in un intervallo di tempo 1 2], ed e questo l' intervallo di esecuzione che che e assegnato a tutte le transizioni che gestiscono i segnali. L' interfaccia attesa del modulo speci ca semplicemente che il segnale DONE si alza dopo che READ va alto e si abbassa dopo che READ e tornato basso (vedi tabella 4.2). Si noti che poiche il bus VME e completamente asincrono, il tempo minimo di attesa ad un segnale e il tempo minimo che impiega il segnale a commutare (di norma 1), mentre il massimo e 1. init DONE 1 1 1 1 1 1 | " DONE DONE " # DONE # | 1 1 t0 1 1 | t1 | 0 1 Tabella 4.2. L' interfaccia attesa del modulo Data Control Data Master Il modulo di gura 4.21 modella l' interfaccia tra il controller ed il dispositivo slave. In risposta ad un comando di lettura, il modulo asserisce prima AS e poi DS 0 ed aspetta che lo slave asserisca DTACK per asserire DONE . Si noti come le transizioni relative alla piazza CY CLE (che segnala l' inizio di un ciclo di accesso alla memoria) ed alla piazza DONE abbiano tempi di esecuzione istantanei, dato che non modellano segnali sici ma servono a mantenere le temporizzazioni. L' interfaccia attesa del modulo speci ca che il segnale DTACK si alza dopo AS e torna basso dopo che DS 0 e tornato basso e che i segnali READ e WRITE sono mutualmente esclusivi e tornano bassi in risposta a DONE (vedi tabella 4.2). 62 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN 1 2] t2 DTACK AS t3 1 2] 1 2] t0 READ WRITE 1 2] t4 DS 0 0 0] t8 t5 1 2] WRITE t1 1 2] DONE 0 0] t6 t7 1 2] CY CLE data master Figura 4.21. Modello del modulo master nel trasferimento dati su bus VME 63 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN init DTACK 1 1 1 1 1 1 | DTACK " DTACK DTACK " # init READ 1 1 1 1 1 1 | 1 1 1 1 1 1 | " READ READ WRITE WRITE " # " # t2 # 1 1 READ 1 1 1 1 # | | t5 1 1 | | 1 1 | WRITE 1 1 WRITE | 1 1 " t8 # | | 1 1 | 1 1 | 1 1 | 1 1 Tabella 4.3. L' interfaccia attesa del modulo Data Master Data Slave 1 2] t0 AS DTACK t1 1 2] t2 1 2] DS 0 WRITE data slave Figura 4.22. Modello del modulo slave nel trasferimento dati su bus VME Il modulo di gura 4.22 modella il dispositivo slave che risponde ad un comando di lettura ponendo sul bus dati il byte richiesto. Il segnale DTACK puo essere asserito in seguito ad una lettura od in seguito ad una scrittura, e le due transizioni t1 e t2 modellano i due casi in maniera distinta per permettere tempi di risposta diversi. Il segnale DTACK torna alto dopo che sia AS che DS 0 sono tornati alti. L' interfaccia attesa del modulo speci ca che AS precede DS 0 e che entrambi tornano alti dopo che lo slave ha asserito DTACK . Il segnale WRITE e completamente asincrono e l' unico vincolo impedisce l' accumulo di gettoni nella piazza importata (vedi tabella 4.4). 64 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN init AS AS DS 0 DS 0 t1 t2 1 1 1 1 | | | 1 1 1 1 1 1 1 1 1 1 | | | | 1 1 | | 1 1 | 1 1 1 1 1 1 | 1 1 | 1 1 | | " AS AS DS 0 DS 0 " # " # WRITE WRITE " # # " init WRITE 1 1 1 1 1 1 1 1 " # WRITE 1 1 1 1 # Tabella 4.4. L' interfaccia attesa del modulo Data Slave Analisi del modello di trasferimento dati su bus VME L' analisi dei singoli moduli che compongono il modello di trasferimento dati sul bus VME con le rispettive interfacce attese produce tre gra di raggiungibilita che contengono tutti gli stati in cui il modello si puo trovare in seguito a tutte le combinazioni possibili di segnali in ingresso. Il modello del modulo Data Control produce 5 stati, il modello del modulo Data Master produce 87 stati e quello del modulo Data Slave produce 57 stati. Integrando questi tre gra si ottiene il grafo del sistema completo, che esprime le possibili sequenze di segnali durante la lettura, fornendo anche informazioni sulle temporizzazioni di tali segnali. Il grafo integrato risulta composto di 25 stati. 4.3.4 Il protocollo per l' arbitraggio nel bus VME bus control NEED- OWN . bus master BR3 BG3 BBSYBCLR bus arbiter Figura 4.23. Modello dell' arbitraggio del bus VME In gura 4.23 vediamo lo schema dei moduli necessari a modellare l' arbitraggio del bus, nel caso in cui un solo master debba ottenere l' accesso. Il modulo Bus Control comanda al modulo Bus Master di prendere il controllo del bus tramite il segnale NEED. Il modulo Bus Master inizia un ciclo di arbitraggio con il modulo Bus Arbiter ed alla ne, quando ha ottenuto il bus, segnala il possesso asserendo OWN . Il Bus Arbiter usa il meccanismo a priorita sse, ed il master ha la priorita piu alta. 65 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN Bus Control 0 1] t0 bus control 10 20] t1 NEED OWN Figura 4.24. Modello del modulo di controllo dell' arbitraggio del bus VME Il modulo di gura 4.24 modella un dispositivo che ha bisogno del bus per un periodo di tempo compreso nell' intervallo 10 20]. Prima o poi t0 esegue, comandando l' acquisizione del bus tramite il segnale NEED, segnale che viene disasserito dopo un tempo compreso tra 10 e 20 da quando il modulo ottiene il bus. L' interfaccia attesa del modulo speci ca che il segnale OWN si alza dopo che NEED va alto e si abbassa dopo che NEED e tornato basso (vedi tabella 4.5). init OWN 1 1 1 1 1 1 | OWN " OWN OWN " # # | 1 1 t0 1 1 | t1 | 0 1 Tabella 4.5. L' interfaccia attesa del modulo Bus Control Bus Master Il modulo di gura 4.25 modella l' interfaccia tra il dispositivo di controllo e l' arbitro del bus VME. Il modulo asserisce BGiOUT solo se riceve BGiIN e non ha bisogno del bus. Il segnale BRi viene asserito quando il modulo ha bisogno del bus, e resta asserito nche non arriva BGiIN ed il modulo occupa il bus asserendo BBSY . Il segnale BBSY e piu complesso, dato che si puo rilasciare il bus anche in seguito ad un BCLR , oltre che all' abbassarsi di NEED. Inoltre il modulo deve aspettare a segnalare OWN no a che il master corrente non ha concluso la sua operazione, ovvero no a che AS non viene disasserito. L' interfaccia attesa del modulo speci ca che il segnale BGiIN puo arrivare normalmente in qualunque momento e risalire dopo che il modulo lo ha propagato con BGiOUT . Se il modulo richiede il bus con BRi , ci si aspetta ancora BGiIN , che risale dopo che BRi e stato negato. Il segnale BCLR puo essere asserito in qualunque momento, e risale dopo che il modulo ha lasciato il bus alzando BBSY . Il segnale AS e completamente asincrono rispetto al modulo. 66 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN 1 2] t0 1 2] t2 BGiOUT BRi t1 1 2] BGiIN NEED t3 1 2] 1 2] t4 OWN t7 1 2] BCLR AS t5 1 2] t8 0 0] BBSY 1 2] t6 bus master Figura 4.25. Modello del modulo master nell' arbitraggio del bus VME 67 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN BGiIN BGiIN AS AS init BGiIN 1 1 1 1 1 1 1 1 1 1 | 1 1 | " # " # " BCLR BCLR NEED NEED # " # # | | init BCLR 1 1 1 1 1 1 1 1 1 1 | 1 1 | " " BGiIN 1 1 1 1 BCLR # | 1 1 | | AS AS " | | # | | 1 1 1 1 1 1 1 1 t1 NEED NEED 1 1 1 1 1 1 " | | t2 t3 1 1 1 1 | | | 1 1 | | | | | | # | | 1 1 t5 t7 1 1 | | | | | | 1 1 Tabella 4.6. L' interfaccia attesa del modulo Bus Master Bus Arbiter t6 1 2] OWN 2 t8 1 2] 1 2] t12 BG2 BR2 t7 1 2] t9 1 2] OWN 3 t11 1 2] BCLR t13 1 2] BBSY BG3 BR3 t10 1 2] bus arbiter Figura 4.26. Modello parziale del modulo arbitro del bus VME Il modulo di gura 4.26 modella l' arbitro del bus VME. Per semplicita si mostrano solo i segnali dei due livelli piu alti di priorita, BG2 e BG3 . Le piazze OWN 2 e OWN 3 contengono un gettone se il bus e usato da un master 68 CAPITOLO 4. MODELLAZIONE DI BUS CON MTPN nella rispettiva catena di daisy-chain e vengono usate per forzare il rilascio del bus in presenza di una richiesta a piu alta priorita tramite il segnale BCLR . Il segnale BGi viene asserito in presenza di una richiesta su BRi se il bus e libero (BBSY alto) e nessuno dei master a priorita piu alta lo richiede. L' interfaccia attesa del modulo speci ca che le richieste BRi possono arrivare in qualunque momento e restare asserite no a che il master non ottiene il bus tramite BGi . Il segnale BBSY si abbassa dopo un BGi ed e forzato a tornare alto da un BCLR . init BRi BRi BBSY 1 1 1 1 | | 1 1 1 1 1 1 | 1 1 | | 1 1 1 1 | | | " BRi BRi BBSY BBSY " # " # # " BBSY # | | 1 1 1 1 BGi 1 1 # | | 1 1 BCLR # | | 1 1 | Tabella 4.7. L' interfaccia attesa del modulo Bus Arbiter Analisi del modello di arbitraggio del bus VME Il modello dell' arbitro del bus VME e stato analizzato nella sua forma completa, restringendo solamente l' interfaccia attesa dell' arbitro per mantenere sempre alti i due ingressi BR0 e BR1 . Anche con queste riduzioni il grafo risultante e sempre piuttosto vasto, essendo composto da 655 stati. Il grafo del modulo di controllo e ovviamente molto piu semplice, consistendo in solo 5 stati. Il modulo master risulta di gran lunga il piu vasto, anche a causa dei segnali AS e BCLR che sono quasi completamente asincroni, risultando composto da piu di 7700 stati. Integrando i tre gra si ottiene il grafo del sistema completo, in cui il numero di stati cala drasticamente grazie al fatto che i moduli sono asserviti ad un controllo molto semplice, arrivando ad appena 12 stati diversi. 69 Capitolo 5 Sistema software Le tecniche di analisi di Modular Time Petri Net illustrate nei capitoli precedenti sono state implementate in un sistema software con l' obiettivo di formare il nucleo di base per un futuro ambiente gra co per l' editing e la veri ca di modelli di Reti di Petri. Il sistema e stato sviluppato con il linguaggio C++39], per garantire una facile integrazione in un sistema piu complesso ed una reale trasportabilita dei sorgenti su macchine diverse. In particolare, il sistema, sviluppato con un Amiga 4000 sotto AmigaOS 3.1, e stato usato compilato senza modi che anche su workstation Sun con SunOS 5.1, ed e facilmente compilabile in qualsiasi piattaforma per la quale sia disponibile un compilatore C++. In accordo con le metodologie di programmazione ad oggetti, il sistema e organizzato come una gerarchia di classi collegate ciascuna corrispondente ad un oggetto ben de nito e separato dagli altri. Queste classi permettono da una parte di descrivere il sistema in termini di reti ed interfacce (oerte od attese), e dall' altra forniscono i metodi necessari alla loro analisi, come ad esempio i costruttori di un grafo degli stati a partire da una rete. In tal modo l' analisi di una rete si realizza tramite la compilazione di un programma che descrive la rete e richiama i metodi necessari alla sua analisi. 5.1 Le classi implementate Il sistema fornisce una classe per ogni tipo di oggetto, ed ogni oggetto fornisce i metodi necessari alla sua analisi e stampa (vedi gura 5.1). Le classi possono essere divise in tre gruppi: classi base, gra di stati, classi di analisi. 5.1.1 Classi base Le classi base comprendono sia dei tipi de niti dall' utente che delle classi che servono a descrivere il sistema da analizzare. Il tipo tempo e usato diusamente e permette, tramite l' overloading di alcuni operatori, di trattare automaticamente in maniera speciale sia le operazioni che coinvolgono tempi in niti che le operazioni di ingresso/uscita. 70 CAPITOLO 5. SISTEMA SOFTWARE IntegNode StateSetNode PINode ? ? ? - StateNode 6 6 Trace 6 TPNNode StateLink - Domain 6 TraceSetNode Profile - StateGraph 6 6 6 - StateSet IntegGraph PIGraph TPNGraph IntegData ProvidedIface TPN ? ? ? Figura 5.1. Grafo delle classi. Gli archi a tratto continuo denotano relazioni di specializzazione, quelli a tratteggio indicano relazioni di uso. Poiche il tipo di analisi che si eettua sulle MTPN e centrato sulle transizioni, ad esse si deve spesso far riferimento attraverso un nome unico in tutto il sistema. Il tipo TName serve a tenere questo nome, che al momento e semplicemente un numero ed una etichetta (tag), che identi ca il tipo di transizione cui il nome si riferisce, ma che potrebbe essere esteso ad un nome simbolico, magari tramite una hash table globale. Nel sistema spesso si usano contenitori per oggetti piu complessi come i nodi dei gra , gli elementi degli insiemi, ecc. A tal ne si usano delle normali liste doppie concatenate. I domini di esecuzione si rappresentano tramite un Domain, che fornisce anche i metodi necessari alla normalizzazione. Gli oggetti da analizzare sono rappresentati da una TPN oppure da una ProvidedIface, che forniscono, oltre ai metodi necessari alla propria costruzione, anche i metodi che permettono l' esecuzione di transizioni aggiornando gli stati interni. 5.1.2 Classi dei gra degli stati Le classi dei gra degli stati (TPNGraph, PIGraph, IntegGraph), sono specializzazioni di StateGraph tramite l' aggiunta di un costruttore speci co per il tipo di grafo: TPNGraph si costruisce partendo da una TPN. PIGraph si costruisce da una ProvidedIface. 71 CAPITOLO 5. SISTEMA SOFTWARE si costruisce da un vettore di StateGraph, che possono naturalmente essere sia gra di reti, che gra di interfacce oerte, che ancora gra di integrazione. Queste classi fanno uso di altre classi minori per rappresentare i nodi del grafo, gli insiemi dei nodi, ecc. A tutti i costruttori di queste classi si puo passare il livello massimo di profondita del grafo cui deve arrivare l' analisi. Se un costruttore si ferma prima di aver completato il grafo, la costruzione si puo riprendere ed approfondire con GrowToLevel(). Per applicare gli strumenti di analisi realizzati per le MTPN ad altri tipi di sistemi che siano riconducibili ad un grafo di stati e transizioni, e suciente aggiungere a questo gruppo una nuova classe derivata da StateGraph con il relativo costruttore per poter analizzare sia i nuovi sistemi che sistemi misti. IntegGraph 5.1.3 Classi di analisi Le classi di analisi permettono di ottenere informazioni sul sistema partendo dal grafo del suo modello. Tramite la classe Trace e possibile rappresentare una traccia di esecuzione sul grafo e stimarne la durata con l' algoritmo a stato singolo, mentre per determinare i limiti ottimi sulla durata di una traccia si deve usare la classe Profile. La funzione GrowTraces() permette di costruire tutte le tracce di un grafo che terminano con l' esecuzione di una certa transizione. Questa funzione viene usata dal costruttore di ProvidedIface per calcolare l' interfaccia attesa direttamente da un grafo qualunque. A questo gruppo si potrebbero aggiungere strumenti di attraversamento del grafo mirati alla veri ca di determinate condizioni come l' assenza di deadlock, il rispetto di vincoli temporali, ecc. 5.2 Documentazione delle Classi Diamo adesso una documentazione completa di tutte le classi del sistema, fornendo di ognuna una descrizione del funzionamento, una lista dei dati interni ed una lista dei metodi che supporta. 72 CAPITOLO 5. SISTEMA SOFTWARE Classe tempo Superclassi: Sottoclassi: Usa: Usata in: TPN, Domain, StateGraph, Trace, ProvidedIface. Descrizione: Estende un tipo standard (normalmente un intero) per rappresentare un tempo, che puo anche essere 1, e le operazioni che sul tempo si possono fare. Il tipo di base e de nito tramite il tipo ausiliario TEMPOT, ed il valore di 1 e il massimo valore rappresentabile in un TEMPOT, de nito con la costante INF. Il tipo tempo supporta operazioni di I/O, confronto e somma/sottrazione. Dati: TEMPOT t E' il valore del tempo. Metodi: tempo(TEMPOT i) Costruisce un tempo a partire dal tipo base. tempo operator+(tempo a, tempo b) Somma due tempi considerando che 1 + i = 1. tempo operator-(tempo a, tempo b) Sottrae due tempi considerando che 1 ; i = 1 ed i ; 1 = ;1. ostream& operator<<(ostream& s, tempo a) Inserisce un tempo in un usso di uscita, rappresentando 1 \INF". come istream& operator>>(istream& s, tempo &a) Legge un tempo da un usso di ingresso, interpretando \INF" o \inf" come 1. 73 CAPITOLO 5. SISTEMA SOFTWARE Classe TName Superclassi: Sottoclassi: Usa: Usata in: TPN, Domain, StateGraph, Channel, Trace, ProvidedIface. Descrizione: Serve a memorizzare in un unico oggetto sia il nome di una transizione (un numero), che il suo tipo. Esistono transizioni normali (T_T), importate (T_I), di incremento (T_U) e di decremento (T_D). Ci sono poi due transizioni speciali: TINIT e la transizioni iniziale e TNONE e usata per i fallimenti nelle ricerche. Supporta assegnamenti, confronti e operazioni di I/O. Dati: int n In un unico intero si memorizza sia il tipo che il numero. Metodi: TName(int ty, int t) Costruisce il nome partendo dal numero e dal tipo. int Name() Ritorna il numero della transizione. int Type() Ritorna il tipo della transizione. ostream& operator<<(ostream& s, TName a) Inserisce un TName in un usso di uscita, rappresentando un carattere di pre sso al numero della transizione. istream& operator>>(istream& s, TName &a) Legge un TName da un usso di ingresso, interpretando il tipo con il primo carattere come il tipo della transizioni, che deve essere seguito dal suo numero. 74 CAPITOLO 5. SISTEMA SOFTWARE Classe Domain Superclassi: Sottoclassi: Usa: tempo, TName. Usata in: StateNode, Profile. Descrizione: Implementa i domini di esecuzione. I nomi delle transizioni sono memorizzati in un vettore nel seguente ordine: per prime le transizioni persistenti, seguite da quelle appena abilitate, da quelle persistenti slave ed in ne da quelle slave appena abilitate. I vincoli semplici sono memorizzati in due vettori, mentre quelli incrociati sono memorizzati in una matrice implementata tramite un vettore di dimensione adeguata. Dati: int N Numero delle transizioni (e quindi delle incognite). int P Indice della ne delle transizioni persistenti. int E Indice della ne delle transizioni appena abilitate. int SP Indice della ne delle transizioni slave persistenti. int S Indice della ne delle transizioni slave appena abilitate. TName* Trans Vettore dei nomi delle transizioni. tempo* pa Vettore dei coecienti semplici. tempo* pb Vettore dei coecienti semplici. tempo* paa Vettore dei coecienti incrociati. tempo* pbb Vettore dei coecienti incrociati. Metodi: Domain(int n, int p=0) Costruisce il Domain allocando i vettori e partizionando le transizioni: p e l' indice della ne delle transizioni persistenti, mentre n e l' indice della ne di quelle appena abilitate. 75 CAPITOLO 5. SISTEMA SOFTWARE Domain(const Domain&) Costruttore di copia, alloca un nuovo Domain e ci ricopia l' argomento. Domain() Distruttore, libera la memoria usata dai vettori. void SetSize(int n, int p=0) Ridimensiona il Domain liberando seguito della nuova dimensione. prima i vettori e riallocandoli in void SetPart(int p, int e, int sp, int s) Partiziona il Domain : p e il numero delle transizioni persistenti, e quello delle transizioni appena abilitate, sp quello delle transizioni slave persistenti e s e quello delle transizioni slave appena abilitate. int idx(TName t) Ritorna l' indice della transizione di nome t o -1 se la transizione non appartiene al dominio. TName& trn(int i) Ritorna il nome della transizione di indice i. tempo& a(int i) Accede al limite inferiore del vincolo sulla transizione di indice i. tempo& b(int i) Accede al limite superiore del vincolo sulla transizione di indice i. tempo& a(int i, int j) Accede al limite inferiore del vincolo incrociato sulle transizioni di indice i e j. tempo& b(int i, int j) Accede al limite superiore del vincolo incrociato sulle transizioni di indice i e j. int TrnCnt() Ritorna il numero di transizioni nel dominio. int PerstCnt() Ritorna l' indice della ne delle transizioni persistenti. int EnbldCnt() Ritorna l' indice della ne delle transizioni appena abilitate (numero di transizioni abilitate). int SlaveCnt() Ritorna l' indice della ne delle transizioni slave appena abilitate. tempo minb() Ritorna il minimo tra i coecienti superiori dei vincoli del dominio. tempo maxa() Ritorna il massimo tra i coecienti inferiori dei vincoli del dominio. void Minimize() Riduce il dominio in forma minima, operando solo sulle transizioni non slave. 76 CAPITOLO 5. SISTEMA SOFTWARE void Normalize() Riduce il dominio in forma normale, operando solo sulle transizioni non slave. Prima di ridurlo in forma normale, lo minimizza con Minimize(). bool CanFire(TName t) Veri ca se il dominio consente l' esecuzione della transizione non slave di nome t. void Restrict(TName t) Restringe il dominio con la condizione che la transizione non slave di nome t esegue per prima. Il dominio deve essere in forma normale e ritorna in forma normale. void SyncMasterSlave(TName m, TName s) Impone la sincronizzazione tra le due transizioni di nome m e s, aggiungendo il vincolo che eseguano allo stesso tempo. Il dominio risultante non e in forma normale. void SlaveRestrict(TName t) Restringe il dominio con la condizione che la transizione slave di nome t esegue per prima. Il dominio deve essere in forma normale e ritorna in forma normale. void SlaveMinimize() Riduce il dominio in forma minima, operando solo sui vincoli delle transizioni slave. void SlaveNormalize() Riduce il dominio in forma normale, operando solo sui vincoli delle transizioni slave. Prima di ridurlo in forma normale, lo minimizza con SlaveMinimize(). bool IsNormal() Veri ca se un dominio normalizzato con SlaveNormalize() e eettivamente ridotto in forma normale. int operator==(Domain &x, Domain &y) Operatore di confronto tra due domini: confronta i nomi delle transizioni, il modo in cui sono partizionate ed i loro vincoli. ostream& operator<<(ostream& s, Domain& d) Operatore di uscita: inserisce in un usso di uscita il dominio, stampando un vincolo per linee, prima tutti quelli semplici e poi quelli incrociati. Non stampa i vincoli sulle transizioni slave. 77 CAPITOLO 5. SISTEMA SOFTWARE Superclassi: Sottoclassi: Usa: tempo, TName. Usata in: TPNGraph. Descrizione: Classe TPN Implementa una Time Petri Net. Essa e rappresentata con un vettore di struct Transition ed un vettore di struct Place, in cui si memorizza lo stato delle transizioni e delle piazze. Per ogni piazza si memorizza il numero di gettoni che contiene, mentre per ogni transizione si memorizza l' intervallo di esecuzione e si include sia un vettore di archi, che contiene i collegamenti tra la transizione e tutte le altre piazze, che un vettore contenente i nuovi intervalli di esecuzione da associare alle transizioni di interfaccia all' esecuzione della transizione in esame. Nella TPN si memorizza sia lo stato iniziale che lo stato dinamico. Nello stato dinamico sono inclusi 3 vettori con i nomi delle transizioni che, dopo l' esecuzione di una transizione, sono abilitate, persistenti e appena abilitate. Esistono dei metodi privati, con il nome tutto minuscolo, che richiedono l' indice della transizione invece del suo nome generale. Dati: int Trans Numero di transizioni vere. int Places Numero di piazze vere. int gTrans Numero di transizioni fantasma. int gPlaces Numero di piazze fantasma. int ITrans Numero di transizioni di interfaccia. int IPlaces Numero di piazze di interfaccia. struct Transition* TransArray Vettore di transizioni. struct Place* PlaceArray Vettore di piazze bool EnabledValid Segnala la validita delle variabili relative alle transizioni abilitate. 78 CAPITOLO 5. SISTEMA SOFTWARE int EnabledCount Numero di transizioni abilitate. int NewlyEnabledCount Numero di transizioni appena abilitate. int PersistentCount Numero di transizioni persistenti. int* enbldarray Vettore di transizioni abilitate. int* newlyarray Vettore di transizioni appena abilitate. int* perstarray Vettore di transizioni persistenti. Metodi: TPN(int t, *tn, p, *pn, it=0, *itn=NULL, ip=0, *ipn=NULL) Costruisce la TPN allocando i vettori di piazze e transizioni ed inizializzandoli: t e il numero di transizioni, tn e il vettore dei nomi da dare alle transizioni, p e il numero di piazze, pn e il vettore dei nomi da dare alle piazze, it e il numero di transizioni di interfaccia, itn e il vettore dei nomi da dare alle transizioni di interfaccia, ip e il numero di piazze di interfaccia, ipn e il vettore dei nomi da dare alle piazze di interfaccia. I nomi sono dati come semplici int, poiche il tipo giusto viene assegnato dal costruttore. TPN(const TPN&) Costruttore di copia, alloca una nuova TPN e ci ricopia l' argomento. TPN() Distruttore, libera la memoria usata dai vettori. int NTrans() Ritorna il numero di transizioni vere. int NPlace() Ritorna il numero di piazze vere. int NITrans() Ritorna il numero di transizioni di interfaccia, comprese quelle associate alle piazze di interfaccia. int NIPlace() Ritorna il numero di piazze di interfaccia. TName trn(int i) Ritorna il nome della transizioni di indice i. int tidx(TName t) Ritorna l' indice della transizione di nome t o -1 se la transizione non appartiene alla rete. int plc(int i) Ritorna il nome della piazza di indice i. 79 CAPITOLO 5. SISTEMA SOFTWARE int pidx(int p) Ritorna l' indice della piazza di nome p o -1 se la piazza non appartiene alla rete. tempo EFTs(TName t) Ritorna l' EFT statico della transizioni di nome t. tempo LFTs(TName t) Ritorna il LFT statico della transizioni di nome t. tempo EFTd(TName t) Ritorna l' EFT dinamico della transizioni di nome t. tempo LFTd(TName t) Ritorna il LFT dinamico della transizioni di nome t. tempo EFTri(TName t, int it) Ritorna l' EFT della Required Interface che viene assegnato a it all' esecuzione di t. tempo LFTri(TName t, int it) Ritorna il LFT della Required Interface che viene assegnato a it all' esecuzione di t. void SetTOKs(int p, int m) Assegna il numero statico di gettoni m alla piazza p. void SetTOKd(int p, int m) Assegna il numero dinamico di gettoni m alla piazza p. void SetEFunc(TName t, EnableFuncPtr ef) Assegna la funzione di abilitazione ef alla funzione deve essere dichiarata come transizione t. Questa bool ef(int P, int* mark, Condition* cond) dove P e il numero di piazze vere e di interfaccia, mark e il marcamento e cond e il vettore degli archi collegati alla transizione. void SetPre(TName t, int p) Crea un arco di ingresso per la transizione t dalla piazza p. void SetPost(TName t, int p) Crea un arco di uscita per la transizione t alla piazza p. void SetInhibit(TName t, int p) Crea un arco di inibizione per la transizione t dalla piazza p. void SetFTs(TName t, tempo eft, tempo lft) Assegna i tempi di esecuzione statici eft e lft alla transizione t. void SetFTd(TName t, tempo eft, tempo lft) Assegna i tempi di esecuzione dinamici eft e lft alla transizione t. void SetRI(TName it, TName t, tempo eft, tempo lft) Assegna alla transizione di interfaccia it i tempi di esecuzione eft e lft che devono esserle associati all' esecuzione di t. void SetMarking(int* m) Assegna il marcamento alla rete dal vettore m. 80 CAPITOLO 5. SISTEMA SOFTWARE void GetMarking(int* m) Copia in m il vettore che rappresenta il marcamento della rete. bool IsEnabled(TName t) Veri ca se la transizione t e abilitata nello stato corrente della rete. void Fire(TName t) Esegue la transizione t, aggiornando lo stato della rete. int NewlyEnabled() Ritorna il numero di transizioni appena abilitate. int Persistent() Ritorna il numero di transizioni persistenti. int Enabled() Ritorna il numero di transizioni abilitate. void GetNewlyEnabled(TName* n) Copia nel vettore n i nomi delle transizioni appena abilitate. void GetPersistent(TName* p) Copia nel vettore p i nomi delle transizioni persistenti. void GetEnabled(TName* e) Copia nel vettore e i nomi delle transizioni abilitate. ostream& operator<<(ostream& s, TPN& tpn) Operatore di uscita: inserisce in un usso di uscita la rete. 81 CAPITOLO 5. SISTEMA SOFTWARE Classe StateNode Superclassi: ListNode. Sottoclassi: TPNNode, IntegNode, PINode. Usa: TName, Domain, StateLink. Usata in: StateGraph. Descrizione: Rappresenta un nodo nel grafo degli stati. Ogni nodo contiene il dominio di esecuzione dello stato ed una catena di archi che lo collegano agli stati successivi. Per comodita la classe replica la maggior parte dei metodi del Domain anche se in sola lettura. Dati: int StateNum Numero identi cativo dello stato. int Level Livello dello stato nel grafo. StateLink* arcs Catena degli archi uscenti dal nodo. Domain domain Dominio di esecuzione dello stato. Metodi: StateNode(StateNode& p, int s) Costruisce il nodo a partire dal padre p, associandogli il numero s. int Num() Ritorna il numero dello stato. int Lev() Ritorna il livello dello stato. StateNode* next(TName t0) Ritorna, se esiste, il successore del nodo attraverso t0, altrimenti ritorna NULL. Eettua una ricerca lineare sugli archi uscenti dal nodo. StateLink* firstarc() Ritorna il primo arco uscente dal nodo. StateLink* nextarc(StateLink* l) Ritorna l' arco che segue l. Serve a scandire tutti gli archi del nodo. ostream& operator<<(ostream& s, StateNode& n) Operatore di uscita: inserisce in un usso di uscita lo stato, compreso il suo dominio di esecuzione. 82 CAPITOLO 5. SISTEMA SOFTWARE Classe StateLink Superclassi: Sottoclassi: Usa: TName. Usata in: StateNode, StateGraph. Descrizione: Rappresenta un arco nel grafo degli stati. Gli archi sono inseriti in una lista la cui testa e nel nodo da cui partono tutti gli archi. Ad ogni arco e associata una transizione e il nodo in cui si arriva tramite la sua esecuzione. Dati: StateLink* nxt Prossimo arco nella catena. StateNode* node Nodo del grafo cui punta l' arco. TName Transition Nome della transizione associata all' arco. Metodi: TName trn() Ritorna il nome della transizione associata all' arco. StateLink* next() Ritorna il prossimo arco della catena. StateNode* state() Ritorna lo stato cui si arriva tramite l' arco. ostream& operator<<(ostream& s, StateLink& l) Operatore di uscita: inserisce in un usso di uscita l' arco. 83 CAPITOLO 5. SISTEMA SOFTWARE Classe StateSet Superclassi: List. Sottoclassi: Usa: StateNode. Usata in: StateGraph, Trace. Descrizione: E' una lista specializzata per rappresentare un insieme di stati e le operazioni che sull' insieme si possono fare. Gli stati sono inseriti tramite uno StateSetNode (non descritto per semplicita), che contiene un semplice puntatore allo stato. Metodi: void Add(StateNode* ) Aggiunge uno stato all' insieme. void AddUnique(StateNode* ) Aggiunge uno stato all' insieme solo se il nodo non e gia presente. StateNode* Get() Toglie il primo stato dall' insieme. StateSetNode* head() Ritorna il primo stato dell' insieme. StateSetNode* next() Ritorna lo stato successivo a quello corrente. ostream& operator<<(ostream& s, StateSet& ss) Operatore di uscita: inserisce in un usso di uscita l' insieme di stati. 84 CAPITOLO 5. SISTEMA SOFTWARE Classe StateGraph Superclassi: Sottoclassi: TPNGraph, IntegGraph, PIGraph. Usa: List, TName, StateNode, StateLink, StateSet. Usata in: IntegGraph. Descrizione: E' la classe principale, che poi viene specializzata nei vari tipi di gra degli stati. Per potervi accedere con semplicita i nodi del grafo sono tutti collegati tramite una lista doppia, oltre che dai normali archi del grafo. Il grafo viene normalmente costruito con un algoritmo di scansione a ventaglio, in cui si usa un insieme che contiene i nodi incontrati e non ancora esaminati questo insieme viene mantenuto nella classe StateGraph per poter costruire il grafo in piu passi. Inoltre uno StateGraph deve fornire alcune informazioni sul numero ed i nomi delle transizioni che lo interessano. La classe non e molto utile se non e specializzata e dotata di un costruttore signi cativo. Dati: int TrnCnt Numero di transizioni nel grafo. int StateCnt Numero di stati nel grafo. int LevelCnt Numero di livelli nel grafo. StateList list Lista dei nodi del grafo. StateSet Sigma Insieme dei nodi da espandere. StateNode* root Radice del grafo degli stati. Metodi: StateGraph(int t) Inizializza le dimensioni del grafo, dichiarando t transizioni. StateGraph() Distruttore del grafo: libera la memoria allocata e distrugge tutti i nodi del grafo. StateNode* head() Ritorna il primo nodo del grafo, usato per scorrere tutti i nodi. 85 CAPITOLO 5. SISTEMA SOFTWARE StateNode* next() Ritorna il nodo successivo a quello attuale, usato per scorrere tutti i nodi. StateNode* rootnode() Ritorna la radice del grafo. StateNode* state(int n) Ritorna lo stato di nome n. Eettua una ricerca lineare nella lista dei nodi. void Link(StateNode* p, StateNode* c, TName t) Collega il nodo c come successore di p tramite la transizione t. int NTrans() Ritorna il numero di transizioni presenti nel grafo. virtual TName trn(int i) Ritorna il nome della transizione di indice i. Se non e ride nita nella classe derivata, converte semplicemente i nel nome di una transizione. virtual int idx(TName t) Ritorna l' indice della transizione di nome t. Se non e ride nita nella classe derivata, converte semplicemente t nell' intero corrispondente. ostream& operator<<(ostream& s, StateGraph& g) Operatore di uscita: inserisce in un usso di uscita il grafo, elencando tutti gli stati. 86 CAPITOLO 5. SISTEMA SOFTWARE Classe TPNNode Superclassi: StateNode. Sottoclassi: Usa: tempo, TName, TPN, Domain. Usata in: Descrizione: Rappresenta uno stato nel grafo ottenuto da una TPN. Aggiunge al semplice StateNode il marcamento ed i costruttori. Dati: int M E' la dimensione del vettore marcamento, corrisponde al numero di piazze nella TPN. int* marking E' il vettore che contiene il marcamento. Metodi: TPNNode(TPN& tpn) Costruisce la radice del grafo degli stati. Il marcamento si ottiene con TPN::GetMarking(). Il dominio di esecuzione viene calcolato dalla tpn usando i metodi TPN::EFT() e TPN::LFT() e normalizzato con Domain::Normalize(). TPNNode(TPNNode& p, TPN& tpn, TName t0, int s) Costruisce il nodo del grafo di tpn successore di p attraverso t0. Per prima cosa si riporta la TPN allo stato p tramite TPN::SetFTs() e TPN::SetMarking(), poi si esegue t0 tramite TPN::Fire(). Il nuovo dominio si calcola a partire dal domino di p ristretto con Domain::Restrict() e dai nuovi intervalli di esecuzione della TPN. TPNNode() Libera la memoria usata dallo stato. int operator==(TPNNode& a, TPNNode& b) Confronta due stati, considerando dominio e marcamento. ostream& operator<<(ostream& s, TPNNode& n) Operatore di uscita: inserisce in un usso di uscita lo stato. 87 CAPITOLO 5. SISTEMA SOFTWARE Classe TPNGraph Superclassi: StateGraph. Sottoclassi: Usa: tempo, TName, TPN, Domain. Usata in: Descrizione: Rappresenta il grafo degli stati ottenuto da una TPN. Aggiunge al semplice StateGraph la rete ed il costruttore. Dati: TPN tpn E' la rete di cui si vuole il grafo. Metodi: TPNGraph(TPN& net, int depth=INT MAX) Costruisce il grafo della rete net, arrivando dita depth. al massimo alla profon- TPNGraph() Libera la memoria occupata dal grafo e dai suoi nodi. void GrowToLevel(int depth) Continua la costruzione del grafo usando gli stati inseriti nell' insieme Sigma, arrivando al massimo alla profondit a depth. Per ogni stato padre usa Domain::CanFire() prima di costruire ed inserire il glio nel grafo. TName trn(int i) Ritorna il nome della transizione di indice i della tpn. int idx(TName t) Ritorna l' indice della transizione di nome t nella tpn, o -1 se t non e presente. ostream& operator<<(ostream& s, TPNGraph& g) Operatore di uscita: inserisce in un usso di uscita il grafo. 88 CAPITOLO 5. SISTEMA SOFTWARE Superclassi: Sottoclassi: Usa: TName. Usata in: IntegGraph. Descrizione: Classe Channel Rappresenta un canale tra due transizioni di gra diversi, come una coppia di nomi di transizioni, una e il master, l' altra lo slave. Dati: TName master E' il master del canale. TName slave E' lo slave del canale. Metodi: Channel(TName m, TName s) Costruttore del canale tra il master m e lo slave s. TName Master() Ritorna il master del canale. TName Slave() Ritorna lo slave del canale. 89 CAPITOLO 5. SISTEMA SOFTWARE Classe IntegData Superclassi: Sottoclassi: Usa: Channel, StateGraph. Usata in: IntegGraph. Descrizione: Contiene i dati necessari alla integrazione di piu stati in un grafo di integrazione, tramite un vettore di StateGraph, un vettore di Channel ed un vettore di nomi di transizioni. I nomi delle transizioni sono quelli contenuti nei gra da integrare, salvo i casi in cui ci sono collisioni, dove le transizioni sono rinominate con un nome funzione del numero del grafo di appartenenza e del nome originale. Un ag segnala che la rimappatura e stata fatta ed i nomi delle transizioni sono validi. Dati: int GraphNum Numero dei gra da integrare. StateGraph** GraphArray Vettore dei gra da integrare. int ChannelNum Numero dei canali. Channel* ChannArray Vettore dei canali di integrazione. int N Numero totale di transizioni. TName* Trans Nomi rimappati delle transizioni dei gra . int* lwr Questo vettore contiene gli indici necessari a partizionare il vettore di transizioni in pezzi corrispondenti alle transizioni dei gra da integrare. bool validtrans Segnala la validita dei nomi. Metodi: IntegData(int g, int c) Costruttore IntegData allocando lo spazio per g gra e c canali. IntegData(IntegData& id) Costruttore di copia, alloca un nuovo IntegData e ci ricopia l' argomento. 90 CAPITOLO 5. SISTEMA SOFTWARE IntegData() Distruttore, libera la memoria usata dai vettori. int NGraph() Ritorna il numero di gra da integrare. int NTrans() Ritorna il numero di transizioni totali. StateGraph& Graph(int g) Ritorna il grafo di indice g. void SetGraph(int g, StateGraph& sg) Assegna il grafo sg all' indice g. void SetChannel(int i, int mg, TName mt, int sg, TName st) Costruisce un canale tra la transizione mt del grafo mg e la transizione st del grafo sg e lo assegna all' indice i. TName trn(int i) Ritorna il nome globale della transizione di indice i. int idx(TName t) Ritorna l' indice della transizione globale t, o -1 se t non e presente. TName Trn(int g, TName t) Ritorna il nome globale della transizione t del grafo g. TName TrnTrn(TName t) Ritorna il nome originale della transizione il cui nome globale e t. int TrnGraph(TName t) Ritorna l' indice del grafo cui appartiene la transizione globale t. TName TrnSlave(TName t) Ritorna il nome della transizione di cui t e il master, o TNONE se t non ha slave. TName TrnMaster(TName t) Ritorna il nome della transizione di cui t e lo slave, o TNONE se t non ha master. bool IsSlave(TName t) Controlla se t e una transizione slave. bool IsMaster(TName t) Controlla se t e una transizione 91 master. CAPITOLO 5. SISTEMA SOFTWARE Classe IntegNode Superclassi: StateNode. Sottoclassi: Usa: StateNode, TName, IntegData, Domain. Usata in: Descrizione: Rappresenta uno stato nel grafo di integrazione. Aggiunge al semplice StateNode gli stati dei singoli gra ed i costruttori. Uno IntegNode puo essere uno stato di errore per il processo di integrazione: in tal caso il primo stato del vettore e NULL, mentre il secondo indica il tipo dell' errore (ERR_MISSED o ERR_EARLY). Dati: int S E' la dimensione del vettore di stati, corrisponde al numero di gra da integrare. StateNode** states E' il vettore che contiene i puntatori agli stati che sono integrati in questo nodo. Metodi: IntegNode(IntegData& id) Costruisce la radice del grafo di integrazione. Si riuniscono le radici di tutti i gra con StateGraph::rootnode() e si separano le transizioni slave dalle altre con IntegData::IsSlave(). Il dominio di esecuzione si calcola usando i metodi di IntegData per accedere alle transizioni e poi si normalizza in due tempi: prima, con Domain::Normalize(), si sistemano le transizioni normali e poi si passa alle slave con IntegData::SlaveNormalize() per veri care che la required interface sia soddisfatta. IntegNode(IntegNode& p, IntegData& id, TName t0, int in) Costruisce il nodo del grafo di integrazione che e il successore di p attraverso t0. Per prima cosa si calcola il nuovo insieme di stati integrati con i metodi di IntegData e StateGraph::next(). Se durante questa fase si veri ca una violazione della required interface il nodo diventa uno stato di errore. Durante la costruzione del dominio di esecuzione si usano i metodi di Domain per restringere il dominio padre in due tempi, per poi veri care eventuali violazioni alla required interface. IntegNode() Libera la memoria usata dallo stato. 92 CAPITOLO 5. SISTEMA SOFTWARE int operator==(IntegNode& a, IntegNode& b) Confronta due stati, considerando dominio e stati integrati. ostream& operator<<(ostream& s, IntegNode& n) Operatore di uscita: inserisce in un usso di uscita lo stato. 93 CAPITOLO 5. SISTEMA SOFTWARE Classe IntegGraph Superclassi: StateGraph. Sottoclassi: Usa: tempo, TName, StateGraph, Domain. Usata in: Descrizione: Rappresenta il grafo di integrazione. Si possono integrare gra di qualsiasi classe derivata da StateGraph. Aggiunge al semplice StateGraph una copia di IntegData ed il costruttore. Dati: IntegData id Contiene i dati necessari all' integrazione. Metodi: IntegGraph(IntegData& id, int depth=INT MAX) Costruisce il grafo di integrazione partendo da massimo alla profondita depth. id ed arrivando al IntegGraph() Libera la memoria occupata dal grafo e dai suoi nodi. void GrowToLevel(int depth) Continua la costruzione del grafo usando gli stati inseriti nell' insieme Sigma, arrivando al massimo alla profondit a depth. Per ogni stato padre usa Domain::CanFire() prima di costruire ed inserire il glio nel grafo. TName trn(int i) Ritorna il nome globale della transizione di indice i. int idx(TName t) Ritorna l' indice della transizione di nome globale t, o -1 se t non e presente. ostream& operator<<(ostream& s, IntegGraph& g) Operatore di uscita: inserisce in un usso di uscita il grafo. 94 CAPITOLO 5. SISTEMA SOFTWARE Classe Trace Superclassi: Sottoclassi: Usa: TName, tempo, StateNode. Usata in: Profile Descrizione: Rappresenta una traccia di esecuzione nel grafo degli stati. Una traccia e una successione di coppie stato-transizione unita ad uno stato nale cui giunge la traccia. Una traccia puo essere lunga 0 ed avere comunque uno stato di arrivo. Dalla traccia si possono ricavare in maniera semplice le stime sui vincoli dei tempi di esecuzione delle singole transizioni e quindi di tutta la traccia. Dati: int N Lunghezza della traccia. StateNode** states Vettore degli stati della traccia. TName* Trans Vettore delle transizioni della traccia. StateNode* endstate Nodo in cui termina la traccia. bool validbounds Segnala se i limiti sono validi. tempo gEFT Tempo minimo di esecuzione di tutta la traccia. tempo gLFT Tempo massimo di esecuzione di tutta la traccia. tempo* tEFT Vettore dei tempi minimi di esecuzione delle transizioni. tempo* tLFT Vettore dei tempi massimi di esecuzione delle transizioni. Metodi: Trace(StateNode* s, int n, TName* t) Costruttore completo, costruisce una traccia lunga n a partire dallo stato s, dimensionando i vettori ed usando il vettore di transizioni t e StateNode::next() per formare le coppie ed arrivare allo stato nale. 95 CAPITOLO 5. SISTEMA SOFTWARE Trace(Trace* tau) Quasi un costruttore di copia, salvo usare un puntatore alla traccia invece di un riferimento. Trace(Trace* Tau, TName T) Costruttore di allungamento. Costruisce una traccia aggiungendo alla traccia Tau la transizione T. Trace() Distruttore, libera la memoria usata dai vettori. int idx(int n, TName t) Ritorna l' indice della transizione di nome t che esegue non prima di quella in posizione n nella traccia, o -1 se non esiste. TName trn(int i) Ritorna il nome della transizione che esegue in posizione i. int lenght() Ritorna la lunghezza della traccia. StateNode* start() Ritorna il primo stato della traccia, quello di partenza. StateNode* end() Ritorna l' ultimo stato della traccia, quello di arrivo. int LastPerstState(int n, TName t) Ritorna la posizione nella traccia dell' ultimo stato in cui t e persistente dopo lo stato in posizione n. Usa Domain::IsPersistent(). bool HasLoop(StateNode* S, TName T) Controlla se la coppia (S,T) e presente nella traccia. tempo EFT() Ritorna il tempo minimo di esecuzione di tutta la traccia. tempo LFT() Ritorna il tempo massimo di esecuzione di tutta la traccia. tempo EFT(int i) Ritorna il tempo minimo di esecuzione della transizione di indice i. tempo LFT(int i) Ritorna il tempo massimo di esecuzione della transizione di indice i. ostream& operator<<(ostream& s, Trace& t) Operatore di uscita: inserisce in un usso di uscita la traccia. 96 CAPITOLO 5. SISTEMA SOFTWARE Classe TraceSet Superclassi: List. Sottoclassi: Usa: TName, StateNode, StateLink, StateSet, Trace. Usata in: Profile. Descrizione: E' una lista specializzata per rappresentare un insieme di tracce e le operazioni che sull' insieme si possono fare. Le tracce sono inserite tramite un TraceSetNode (non descritto per semplicita), che contiene un semplice puntatore alla traccia. Metodi: void Add(Trace* ) Aggiunge una traccia all' insieme. Trace* Get() Toglie la prima traccia dall' insieme. StateSetNode* head() Ritorna la prima traccia dell' insieme. StateSetNode* next() Ritorna la traccia successiva a quella corrente. GrowTraces(StateSet& s, int ts, TName* t, TraceSet& trc,lop) E' una funzione (e non un metodo), che trova tutte le tracce semplici di un grafo che partono da un insieme di stati e terminano con l' esecuzione di una certa transizione. La funzione si aspetta in s l' insieme degli stati di partenza delle tracce ed nel vettore t di lunghezza ts le transizioni che eseguendo terminano le tracce. L' insieme delle tracce costruite e ritornato in trc, mentre in lop si ottengono gli eventuali loop rilevati tramite Trace::HasLoop() nella costruzione delle tracce. 97 CAPITOLO 5. SISTEMA SOFTWARE Classe Profile Superclassi: Domain. Sottoclassi: Usa: tempo, Trace. Usata in: ProvidedIface. Descrizione: Specializza un Domain aggiungendo un costruttore che da una traccia ricava i vincoli minimi sui tempi di esecuzione delle singole transizioni della traccia. Metodi: Profile(Trace& tr) Costruisce il pro lo minimo di esecuzione della traccia. Scorre la traccia e, per ogni transizione dei domini degli stati incontrati, cerca con Trace::LastPerstState() lo stato in cui la transizione sparisce ed aggiunge i vincoli giusti al sistema di disequazioni globale. In ne risolve il sistema con Domain::Normalize(). Profile() Distrugge il pro le. tempo EFT() Ritorna il tempo di esecuzione minimo di tutta la traccia. tempo LFT() Ritorna il tempo di esecuzione massimo di tutta la traccia. tempo EFT(int i) Ritorna il tempo di esecuzione minimo della transizione che esegue in posizione i nella traccia. tempo LFT(int i) Ritorna il tempo di esecuzione massimo della transizione che esegue in posizione i nella traccia. 98 CAPITOLO 5. SISTEMA SOFTWARE Classe ProvidedIface Superclassi: Sottoclassi: Usa: TName, tempo, StateSet, StateNode, StateGraph. Usata in: PIGraph. Descrizione: Implementa una interfaccia oerta. Contiene sia i dati necessari a calcolare l' interfaccia che quelli necessari ad eseguirla in maniera simile ad una TPN: per ogni transizione si memorizza in una struct Transition, oltre al nome, due vettori che contengono i nuovi intervalli di esecuzione da assegnare alle altre transizioni quando esegue la transizione in esame. La transizione iniziale TINIT e memorizzata in fondo alle transizioni osservabili. Esistono dei metodi privati, con il nome tutto minuscolo, che richiedono l' indice della transizione invece del suo nome generale. Dati: int N Numero di transizioni osservabili (escluso TINIT). struct Transition* TransArray Vettore delle transizioni osservabili. int EnabledCount Numero di transizioni abilitate dopo l' ultima esecuzione. bool enabledvalid Segnala che il numero di transizioni abilitate e corretto. Metodi: ProvidedIface(StateGraph& g, int n, TName* t) Costruttore ProvidedIface(const ProvidedIface&) Costruttore di copia, alloca una nuova ProvidedIface e ci ricopia l' argomento. ProvidedIface() Distruttore, libera la memoria usata dai vettori. int NTrans() Ritorna il numero di transizioni osservabili. TName trn(int i) Ritorna il nome della transizione di indice i. int idx(TName t) Ritorna l' indice della transizione di nome t o -1 se la transizione non appartiene al dominio. 99 CAPITOLO 5. SISTEMA SOFTWARE void Fire(TName t) Esegue la transizione di nome t, aggiornando lo stato dinamico ed il conteggio delle transizioni abilitate. int Enabled() Ritorna il numero di transizioni abilitate void GetEnabled(TName* e) Copia nel vettore e i nomi delle transizioni abilitate. tempo EFT(TName t) Ritorna l' EFT dinamico della transizioni di nome t. tempo LFT(TName t) Ritorna il LFT dinamico della transizioni di nome t. tempo EFT(TName t0, TName tf) Ritorna l' EFT che viene assegnato alla transizione t0 all' esecuzione di tf. tempo LFT(TName t0, TName tf) Ritorna il LFT che viene assegnato alla transizione t0 all' esecuzione di tf. ostream& operator<<(ostream& s, ProvidedIface& pi) Operatore di uscita: inserisce in un usso di uscita l' interfaccia oerta. 100 CAPITOLO 5. SISTEMA SOFTWARE Classe PINode Superclassi: StateNode. Sottoclassi: Usa: tempo, TName, ProvidedIface, Domain. Usata in: Descrizione: Rappresenta uno stato nel grafo ottenuto da una ProvidedIface. Aggiunge al semplice StateNode dei costruttori specializzati. Metodi: PINode(ProvidedIface& pi) Costruisce la radice del grafo degli stati. Il dominio di esecuzione viene calcolato da pi usando i metodi ProvidedIface::EFT() e ProvidedIface::LFT() e normalizzato con Domain::Normalize(). PINode(PINode& p, ProvidedIface& pi, TName t0, int s) Costruisce il nodo del grafo di pi successore di p attraverso t0. Per prima cosa si esegue t0 tramite ProvidedIface::Fire(). Il nuovo dominio si calcola a partire dai nuovi intervalli di esecuzione della ProvidedIface. PINode() Libera la memoria usata dallo stato. int operator==(PINode& a, PINode& b) Confronta due stati. ostream& operator<<(ostream& s, PINode& n) Operatore di uscita: inserisce in un usso di uscita lo stato. 101 CAPITOLO 5. SISTEMA SOFTWARE Classe PIGraph Superclassi: StateGraph. Sottoclassi: Usa: tempo, TName, ProvidedIface, Domain. Usata in: Descrizione: Rappresenta il grafo degli stati ottenuto da una ProvidedIface. Aggiunge al semplice StateGraph la copia della interfaccia ed il costruttore. Dati: ProvidedIface pi E' l' interfaccia di cui si vuole il grafo. Metodi: PIGraph(ProvidedIface& pi, int depth=INT MAX) Costruisce il grafo dell' interfaccia pi, arrivando profondita depth. al massimo alla PIGraph() Libera la memoria occupata dal grafo e dai suoi nodi. void GrowToLevel(int depth) Continua la costruzione del grafo usando gli stati inseriti nell' insieme Sigma, arrivando al massimo alla profondit a depth. Per ogni stato padre usa Domain::CanFire() prima di costruire ed inserire il glio nel grafo. TName trn(int i) Ritorna il nome della transizione di indice i della pi. int idx(TName t) Ritorna l' indice della transizione di nome t nella pi, o -1 se t non e presente. ostream& operator<<(ostream& s, PIGraph& g) Operatore di uscita: inserisce in un usso di uscita il grafo. 102 CAPITOLO 5. SISTEMA SOFTWARE 5.3 Un esempio d' uso Come esempio vediamo il listato del programma che de nisce ed analizza il protocollo di Stenning secondo il modello discusso nella sezione 2.2.4 ed il listato del programma che de nisce ed analizza il protocollo di arbitraggio del bus VME discusso nella sezione 4.3.4. 5.3.1 Listato di testpgSTRS.cpp #include #include #include #include #include #include #include <iostream.h> "common.h" "tpn.h" "tpngraph.h" "igraph.h" "pintface.h" "pigraph.h" // // Source: // // p0 t0 p1 | init |ready(20)| 1 | // _ | _ ------+---------+---------+-------+ // (_)---->|---->(_) ready |+INF,+INF|+INF,+INF| 0,+INF| // 1 ^ | | 0 ------+---------+---------+-------+ // | 2,4] | // | | ready -> t20 // | | data -> p20 // | | // | t1 | // | |<-----+ p2 // +------| _ // |<----------(_) // 0,1] 1 // data! ready? // // TX: // t7 // ----// ^ 3,6] // | pkt! ack -> t30 // | data -> t31 // t8 | // | _ p8 t4 p5 ready -> p30 // |<---(_)<--------------| _ pkt -> p31 // | ^ 0 |<-----(_) // 3,6] | +---------| ^ 0 // p3 | | 1,2] | // _ t3 | | | // (_)------->|-----+ v | // 0 | _ p4 t5 | // data? +--->|---------->(_)------->| | // | 1,2] | 0 |-------+ // | | +---*| // | t6 | | 16,16] // p6 _ |<-----+ | // (_)<--------| _ p7 103 CAPITOLO 5. SISTEMA SOFTWARE // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // 1 |<---------(_) 0,1] 0 ready! ack? | init | data(31)| ack(30) | 5 | 6 | 7 | -----+---------+---------+---------+---------+---------+---------+ data | 0,+INF |+INF,+INF| --| --| 0,+INF | --| -----+---------+---------+---------+---------+---------+---------+ ack |+INF,+INF| --|+INF,+INF|+INF,+INF| --| 0,+INF | -----+---------+---------+---------+---------+---------+---------+ RX: t9 p10 | _ +------->|*-----(_) | | | 1 | 0,0] | ready? | | | | | | t10 p11 t12 | +---->| _ | p9 _ |------>(_)------>| (_)-------------------->| | 0 | 0 1,3] | 3,6] pkt? data! | ack! v t11 ----3,6] ready -> t40 pkt -> t41 data ack -> p40 -> p41 | init | pkt(41) |ready(40)| 12 | 10 | ------+---------+---------+---------+---------+---------+ ready |+INF,+INF| --|+INF,+INF| --| 0,+INF| ------+---------+---------+---------+---------+---------+ pkt | 0,+INF| 10,+INF| --| 0,+INF | --| ------+---------+---------+---------+---------+---------+ Sink: p13 t14 p14 _ | _ (_)---->|---->(_) 0 ^ | | 1 | 0,0] | | ready! | | | | | | t13 | | |<-----+ p12 +------| _ |<----------(_) 0,1] 0 data? | init |data(50) | 14 | ------+---------+---------+-------+ data | 0,+INF|+INF,+INF| 0,+INF| ------+---------+---------+-------+ ready -> p50 data -> t50 void main() { 104 CAPITOLO 5. SISTEMA SOFTWARE int source_T2]={0,1}" int source_P3]={0,1,2}" int source_R1]={20}" class TPN source(2,source_T, 3,source_P, 1,source_R)" // t0 source.SetPre(T(0), 0)" source.SetPost(T(0), 1)" source.SetFTs(T(0), 2, 4)" // t1 source.SetPre(T(1), 1)" source.SetPre(T(1), 2)" source.SetPost(T(1), 0)" source.SetFTs(T(1), 0, 1)" // ready (t20) source.SetPost(I(20), 2)" source.SetRI(I(20), TINIT, +INF, +INF)" // RI(ready, init) source.SetRI(I(20), I(20), +INF, +INF)" // RI(ready, ready) source.SetRI(I(20), T(1), 0, +INF)" // RI(ready, 1) // Setta il marcamento piazza per piazza source.SetTOKs( 0, 1)" source.SetTOKs( 1, 0)" source.SetTOKs( 2, 1)" cout << "TPN di Source\n" << source" TPNGraph source_graph(source, 15)" cout << "Grafo di Source\n" << source_graph" int tx_T6]={3,4,5,6,7,8}" int tx_P6]={3,4,5,6,7,8}" int tx_R2]={30,31}" class TPN tx(6,tx_T, 6,tx_P, 2,tx_R)" // t3 tx.SetFTs(T(3), 1, 2)" tx.SetPre(T(3), 3)" tx.SetPre(T(3), 6)" tx.SetPost(T(3), 8)" tx.SetPost(T(3), 4)" // t4 tx.SetFTs(T(4), 1, 2)" tx.SetPre(T(4), 5)" tx.SetPost(T(4), 8)" tx.SetPost(T(4), 4)" // t5 tx.SetFTs(T(5), 16, 16)" tx.SetPre(T(5), 4)" tx.SetPost(T(5), 5)" tx.SetInhibit(T(5), 7)" // t6 tx.SetFTs(T(6), 0, 1)" tx.SetPre(T(6), 4)" tx.SetPre(T(6), 7)" tx.SetPost(T(6), 6)" // t7 tx.SetFTs(T(7), 3, 6)" tx.SetPre(T(7), 8)" // t8 tx.SetFTs(T(8), 3, 6)" tx.SetPre(T(8), 8)" 105 CAPITOLO 5. SISTEMA SOFTWARE // ack? (t30) tx.SetPost(I(30), 7)" tx.SetRI(I(30), TINIT, +INF, +INF)" tx.SetRI(I(30), I(30), +INF, +INF)" tx.SetRI(I(30), T(5), +INF, +INF)" // mia aggiunta tx.SetRI(I(30), T(7), 0, +INF)" // data? (t31) tx.SetPost(I(31), 3)" tx.SetRI(I(31), TINIT, 0, +INF)" tx.SetRI(I(31), I(31), +INF, +INF)" tx.SetRI(I(31), T(6), 0, +INF)" // Setta il marcamento piazza per piazza tx.SetTOKs( 3, 0)" tx.SetTOKs( 4, 0)" tx.SetTOKs( 5, 0)" tx.SetTOKs( 6, 1)" tx.SetTOKs( 7, 0)" tx.SetTOKs( 8, 0)" cout << "TPN di TX\n" << tx" TPNGraph tx_graph(tx, 100)" cout << "Grafo di TX\n" << tx_graph" int rx_T4]={9,10,11,12}" int rx_P3]={9,10,11}" int rx_R2]={40,41}" class TPN rx(4,rx_T, 3,rx_P, 2,rx_R)" // t9 rx.SetFTs(T(9), 0, 0)" rx.SetPre(T(9), 9)" rx.SetInhibit(T(9), 10)" // t10 rx.SetFTs(T(10), 1, 3)" rx.SetPre(T(10), 9)" rx.SetPre(T(10), 10)" rx.SetPost(T(10), 11)" // t11 rx.SetFTs(T(11), 3, 6)" rx.SetPre(T(11), 11)" // t12 rx.SetFTs(T(12), 3, 6)" rx.SetPre(T(12), 11)" // ready? (t40) rx.SetPost(I(40), 10)" rx.SetRI(I(40), TINIT, +INF, +INF)" rx.SetRI(I(40), I(40), +INF, +INF)" rx.SetRI(I(40), T(10), 0, +INF)" // pkt? (t41) rx.SetPost(I(41), 9)" rx.SetRI(I(41), TINIT, 0, +INF)" rx.SetRI(I(41), I(41), 10, +INF)" rx.SetRI(I(41), T(12), 0, +INF)" // Setta il marcamento piazza per piazza rx.SetTOKs( 9, 0)" rx.SetTOKs( 10, 1)" rx.SetTOKs( 11, 0)" cout << "TPN di RX\n" << rx" TPNGraph rx_graph(rx, 100)" 106 CAPITOLO 5. SISTEMA SOFTWARE cout << "Grafo di RX\n" << rx_graph" int sink_T2]={13,14}" int sink_P3]={12,13,14}" int sink_R1]={50}" class TPN sink(2,sink_T, 3,sink_P, 1,sink_R)" // t13 sink.SetFTs(T(13), 0, 1)" sink.SetPre(T(13), 14)" sink.SetPre(T(13), 12)" sink.SetPost(T(13), 13)" // t14 sink.SetFTs(T(14), 0, 0)" sink.SetPre(T(14), 13)" sink.SetPost(T(14), 14)" // data (t50) sink.SetPost(I(50), 12)" sink.SetRI(I(50), TINIT, 0, +INF)" sink.SetRI(I(50), I(50), +INF, +INF)" sink.SetRI(I(50), T(14), 0, +INF)" // Setta il marcamento piazza per piazza sink.SetTOKs( 12, 0)" sink.SetTOKs( 13, 0)" sink.SetTOKs( 14, 1)" cout << "TPN di Sink\n" << sink" TPNGraph sink_graph(sink, 15)" cout << "Grafo di Sink\n" << sink_graph" IntegData sourcetx(2, 2)" // 2 grafi e 2 canali sourcetx.SetGraph(0, source_graph)" sourcetx.SetGraph(1, tx_graph)" sourcetx.SetChannel(0, 0,T(1), 1,I(31))"// SOURCE_data! --> TX_data? sourcetx.SetChannel(1, 1,T(6), 0,I(20))"// TX_ready! --> SOURCE_ready? IntegGraph sourcetx_graph(sourcetx, 100)" cout << "Grafo integrato di Source e TX\n" << sourcetx_graph" IntegData rxsink(2, 2)" // 2 grafi e 2 canali rxsink.SetGraph(0, rx_graph)" rxsink.SetGraph(1, sink_graph)" rxsink.SetChannel(0, 0,T(10), 1,I(50))" // RX_data! --> rxsink.SetChannel(1, 1,T(14), 0,I(40))" // SINK_ready! --> IntegGraph rxsink_graph(rxsink, 10)" cout << "Grafo integrato di RX e Sink\n" << rxsink_graph" TName sourcetx_tobs] = {T(7),I(30)}" ProvidedIface sourcetxpi(sourcetx_graph, 2, sourcetx_tobs)" cout << "PI di SourceTX\n" << sourcetxpi" PIGraph sourcetxpi_graph(sourcetxpi,15)" cout << "Grafo della PI di SourceTX\n" << sourcetxpi_graph" TName rxsink_tobs] = {T(12),I(41)}" ProvidedIface rxsinkpi(rxsink_graph, 2, rxsink_tobs)" cout << "PI di RXSink\n" << rxsinkpi" PIGraph rxsinkpi_graph(rxsinkpi,15)" cout << "Grafo della PI di RXSink\n" << rxsinkpi_graph" 107 SINK_data? RX_ready? CAPITOLO 5. SISTEMA SOFTWARE IntegData st_rs(2, 2)" st_rs.SetGraph(0, sourcetxpi_graph)" st_rs.SetGraph(1, rxsinkpi_graph)" st_rs.SetChannel(0, 0,T(7), 1,I(41))" st_rs.SetChannel(1, 1,T(12), 0,I(30))" // // TX_pkt! RX_ack! --> --> RX_pkt? TX_ack? IntegGraph st_rs_graph(st_rs, 100)" cout << "Grafo integrato delle PI di SourceTX e RXSink\n" << st_rs_graph" } 5.3.2 Listato di testigBUS.cpp #include #include #include #include #include <iostream.h> "common.h" "tpn.h" "tpngraph.h" "igraph.h" #define P(a) (a) // // E' bene che le piazze siano nominate con il loro indice, per comodita' // // ************************** Bus Control ********************** #define NEED (mark1]!=0) #define OWN (mark2]!=0) bool NEEDdn(int P, int *mark, Condition *cond) { return (bool)(OWN)" } #undef NEED #undef OWN // ************************** Bus Master ********************** #define BGiOUT (mark 0]!=0) #define BRi (mark 2]!=0) #define BBSY (mark 4]!=0) #define OWN (mark 6]!=0) #define BGiIN (mark 8]!=0) #define BCLR (mark 9]!=0) #define AS (mark10]!=0) #define NEED (mark11]!=0) bool BGiOUTup(int P, int *mark, Condition *cond) { return (bool)(BGiIN)" } bool BGiOUTdn(int P, int *mark, Condition *cond) { return (bool)(!BGiIN && !NEED)" } bool BRiup(int P, int *mark, Condition *cond) { return (bool)(NEED && !BGiIN && !BBSY)" } bool BRidn(int P, int *mark, Condition *cond) 108 CAPITOLO 5. SISTEMA SOFTWARE { return (bool)(NEED && BBSY )" } bool OWNdn1(int P, int *mark, Condition *cond) { return (bool)(!NEED)" } bool OWNdn2(int P, int *mark, Condition *cond) { return (bool)(!BCLR)" } bool OWNup(int P, int *mark, Condition *cond) { return (bool)(AS && BGiIN)" } bool BBSYdn(int P, int *mark, Condition *cond) { return (bool)(NEED && !BGiIN && BCLR)" } #undef BGiOUT #undef BRi #undef BBSY #undef OWN #undef BGiIN #undef BCLR #undef AS #undef NEED // ************************** Bus Arbiter ********************** #define BG0 (mark 0]!=0) #define OWN0 (mark 2]!=0) #define BG1 (mark 3]!=0) #define OWN1 (mark 5]!=0) #define BG2 (mark 6]!=0) #define OWN2 (mark 8]!=0) #define BG3 (mark 9]!=0) #define OWN3 (mark11]!=0) #define BCLR (mark12]!=0) #define BR0 (mark14]!=0) #define BR1 (mark15]!=0) #define BR2 (mark16]!=0) #define BR3 (mark17]!=0) #define BBSY (mark18]!=0) bool BG0up(int P, int *mark, Condition *cond) { return (bool)(!BBSY && BR0)" } bool BG0dn(int P, int *mark, Condition *cond) { return (bool)(BBSY && !BR0 && BR1 && BR2 && BR3 && !OWN0)" } bool OWN0dn(int P, int *mark, Condition *cond) { return (bool)(BBSY)" } bool BG1up(int P, int *mark, Condition *cond) { 109 CAPITOLO 5. SISTEMA SOFTWARE return (bool)(!BBSY && BR1)" } bool BG1dn(int P, int *mark, Condition *cond) { return (bool)(BBSY && !BR1 && BR2 && BR3 && ! OWN1)" } bool OWN1dn(int P, int *mark, Condition *cond) { return (bool)(BBSY)" } bool BG2up(int P, int *mark, Condition *cond) { return (bool)(!BBSY && BR2)" } bool BG2dn(int P, int *mark, Condition *cond) { return (bool)(BBSY && !BR2 && BR3 && !OWN2)" } bool OWN2dn(int P, int *mark, Condition *cond) { return (bool)(BBSY)" } bool BG3up(int P, int *mark, Condition *cond) { return (bool)(!BBSY && BR3)" } bool BG3dn(int P, int *mark, Condition *cond) { return (bool)(BBSY && !BR3 && !OWN3)" } bool OWN3dn(int P, int *mark, Condition *cond) { return (bool)(BBSY)" } bool BCLRup(int P, int *mark, Condition *cond) { return (bool)(BBSY)" } bool BCLRdn(int P, int *mark, Condition *cond) { return (bool)(!BBSY && (OWN0&&!BR1 || (OWN0||OWN1)&&!BR2 || (OWN0||OWN1||OWN2)&&!BR3 ) )" } #undef BG0 #undef OWN0 #undef BG1 #undef OWN1 #undef BG2 #undef OWN2 #undef BG3 #undef OWN3 #undef BCLR #undef BR0 #undef BR1 #undef BR2 #undef BR3 110 CAPITOLO 5. SISTEMA SOFTWARE #undef BBSY void main() { int BusControl_T2]={0,1}" int BusControl_P2]={0,1}" int BusControl_IP1]={2}" class TPN BusControl(2,BusControl_T, 2,BusControl_P, 0,NULL, 1,BusControl_IP)" // t0 BusControl.SetFTs(T(0), 0, +INF)" BusControl.SetPre(T(0), P(0))" BusControl.SetPost(T(0), P(1))" // t1 BusControl.SetFTs(T(1), 10, 20)" BusControl.SetPre(T(1), P(1))" BusControl.SetEFunc(T(1), NEEDdn)" // marcamenti BusControl.SetTOKs(P(0), 1)" BusControl.SetTOKs(P(1), 0)" // NEED (p2) BusControl.SetTOKs(P(2), 0)" // u2 BusControl.SetRI(U(2), TINIT, BusControl.SetRI(U(2), U(2), BusControl.SetRI(U(2), T(0), // d2 BusControl.SetRI(D(2), TINIT, BusControl.SetRI(D(2), D(2), BusControl.SetRI(D(2), T(1), +INF, +INF)" +INF, +INF)" 1, +INF)" +INF, +INF)" +INF, +INF)" 0, +INF)" TPNGraph BusControl_g(BusControl,10)" cout << "Grafo del Bus Control\n" << BusControl_g" int BusMaster_T9]={0,1,2,3,4,5,6,7,8}" int BusMaster_P8]={0,1,2,3,4,5,6,7}" int BusMaster_IP4]={8,9,10,11}" class TPN BusMaster(8,BusMaster_T, 8,BusMaster_P, 0,NULL, 4,BusMaster_IP)" // t0 BusMaster.SetFTs(T(0), 1, 1)" BusMaster.SetPre(T(0), P(1))" BusMaster.SetPost(T(0), P(0))" BusMaster.SetEFunc(T(0), BGiOUTup)" // t1 BusMaster.SetFTs(T(1), 1, 2)" BusMaster.SetPre(T(1), P(0))" BusMaster.SetPost(T(1), P(1))" BusMaster.SetEFunc(T(1), BGiOUTdn)" // marcamenti 111 CAPITOLO 5. SISTEMA SOFTWARE BusMaster.SetTOKs(P(0), 1)" BusMaster.SetTOKs(P(1), 0)" // t2 BusMaster.SetFTs(T(2), 1, 2)" BusMaster.SetPre(T(2), P(3))" BusMaster.SetPost(T(2), P(2))" BusMaster.SetEFunc(T(2), BRiup)" // t3 BusMaster.SetFTs(T(3), 1, 2)" BusMaster.SetPre(T(3), P(2))" BusMaster.SetPost(T(3), P(3))" BusMaster.SetEFunc(T(3), BRidn)" // marcamenti BusMaster.SetTOKs(P(2), 1)" BusMaster.SetTOKs(P(3), 0)" // t4 BusMaster.SetFTs(T(4), 1, 2)" BusMaster.SetPre(T(4), P(6))" BusMaster.SetPost(T(4), P(7))" BusMaster.SetEFunc(T(4), OWNdn1)" // t5 BusMaster.SetFTs(T(5), 1, 2)" BusMaster.SetPre(T(5), P(6))" BusMaster.SetPost(T(5), P(7))" BusMaster.SetEFunc(T(5), OWNdn2)" // t6 BusMaster.SetFTs(T(6), 1, 2)" BusMaster.SetPre(T(6), P(4))" BusMaster.SetPost(T(6), P(5))" BusMaster.SetEFunc(T(6), BBSYdn)" // t7 BusMaster.SetFTs(T(7), 1, 2)" BusMaster.SetPre(T(7), P(5))" BusMaster.SetPost(T(7), P(6))" BusMaster.SetEFunc(T(7), OWNup)" // t8 BusMaster.SetFTs(T(8), 0, 0)" BusMaster.SetPre(T(8), P(7))" BusMaster.SetPost(T(8), P(4))" // marcamenti BusMaster.SetTOKs(P(4), 1)" BusMaster.SetTOKs(P(5), 0)" BusMaster.SetTOKs(P(6), 0)" BusMaster.SetTOKs(P(7), 0)" // BGiIN (p8) BusMaster.SetTOKs(P(8), 1)" // u8 BusMaster.SetRI(U(8), TINIT, +INF, +INF)" BusMaster.SetRI(U(8), U(8), +INF, +INF)" BusMaster.SetRI(U(8), D(8), +INF, +INF)" BusMaster.SetRI(U(8), T(1), 1, +INF)" BusMaster.SetRI(U(8), T(2), 1, +INF)" // d8 BusMaster.SetRI(D(8), TINIT, 1, +INF)" 112 // BGiOUTdn // BRiup CAPITOLO 5. SISTEMA SOFTWARE BusMaster.SetRI(D(8), BusMaster.SetRI(D(8), BusMaster.SetRI(D(8), U(8), 1, +INF)" D(8), +INF, +INF)" T(3), 1, +INF)" // BCLR (p9) BusMaster.SetTOKs(P(9), 1)" // u9 BusMaster.SetRI(U(9), TINIT, +INF, +INF)" BusMaster.SetRI(U(9), U(9), +INF, +INF)" BusMaster.SetRI(U(9), T(5), 1, +INF)" // d9 BusMaster.SetRI(D(9), TINIT, 1, +INF)" BusMaster.SetRI(D(9), U(9), 1, +INF)" BusMaster.SetRI(D(9), D(9), +INF, +INF)" // BRidn // BBSYup2 // BCLRup // AS (p10) BusMaster.SetTOKs(P(10), 1)" // u10 BusMaster.SetRI(U(10), TINIT, +INF, +INF)" BusMaster.SetRI(U(10), U(10), +INF, +INF)" BusMaster.SetRI(U(10), D(10), 1, +INF)" // d10 BusMaster.SetRI(D(10), TINIT, 1, +INF)" BusMaster.SetRI(D(10), U(10), 1, +INF)" BusMaster.SetRI(D(10), D(10), +INF, +INF)" // NEED (p11) BusMaster.SetTOKs(P(11), 0)" // u11 BusMaster.SetRI(U(11), TINIT, BusMaster.SetRI(U(11), U(11), BusMaster.SetRI(U(11), D(11), // d11 BusMaster.SetRI(D(11), TINIT, BusMaster.SetRI(D(11), U(11), BusMaster.SetRI(D(11), D(11), BusMaster.SetRI(D(11), T(7), 1, +INF)" +INF, +INF)" 1, +INF)" +INF, +INF, +INF, 1, +INF)" +INF)" +INF)" +INF)" TPNGraph BusMaster_g(BusMaster,20)" cout << "Grafo del Bus Master\n" << BusMaster_g" int BusArbiter_T14]={0,1,2,3,4,5,6,7,8,9,10,11,12,13}" int BusArbiter_P14]={0,1,2,3,4,5,6,7,8,9,10,11,12,13}" int BusArbiter_IP5]={14,15,16,17,18}" class TPN BusArbiter(14,BusArbiter_T, 14,BusArbiter_P, 0,NULL, 5,BusArbiter_IP)" // t0 BusArbiter.SetFTs(T(0), 1, 2)" BusArbiter.SetPre(T(0), P(1))" BusArbiter.SetPost(T(0), P(0))" BusArbiter.SetPost(T(0), P(2))" BusArbiter.SetEFunc(T(0), BG0up)" // t1 BusArbiter.SetFTs(T(1), 1, 2)" 113 CAPITOLO 5. SISTEMA SOFTWARE BusArbiter.SetPre(T(1), P(0))" BusArbiter.SetPost(T(1), P(1))" BusArbiter.SetEFunc(T(1), BG0dn)" // t2 BusArbiter.SetFTs(T(2), 1, 2)" BusArbiter.SetPre(T(2), P(2))" BusArbiter.SetEFunc(T(2), OWN0dn)" // marcamenti BusArbiter.SetTOKs(P(0), 1)" BusArbiter.SetTOKs(P(1), 0)" BusArbiter.SetTOKs(P(2), 0)" // t3 BusArbiter.SetFTs(T(3), 1, 2)" BusArbiter.SetPre(T(3), P(4))" BusArbiter.SetPost(T(3), P(3))" BusArbiter.SetPost(T(3), P(5))" BusArbiter.SetEFunc(T(3), BG1up)" // t4 BusArbiter.SetFTs(T(4), 1, 2)" BusArbiter.SetPre(T(4), P(3))" BusArbiter.SetPost(T(4), P(4))" BusArbiter.SetEFunc(T(4), BG1dn)" // t5 BusArbiter.SetFTs(T(5), 1, 2)" BusArbiter.SetPre(T(5), P(5))" BusArbiter.SetEFunc(T(5), OWN1dn)" // marcamenti BusArbiter.SetTOKs(P(3), 1)" BusArbiter.SetTOKs(P(4), 0)" BusArbiter.SetTOKs(P(5), 0)" // t6 BusArbiter.SetFTs(T(6), 1, 2)" BusArbiter.SetPre(T(6), P(7))" BusArbiter.SetPost(T(6), P(6))" BusArbiter.SetPost(T(6), P(8))" BusArbiter.SetEFunc(T(6), BG2up)" // t7 BusArbiter.SetFTs(T(7), 1, 2)" BusArbiter.SetPre(T(7), P(6))" BusArbiter.SetPost(T(7), P(7))" BusArbiter.SetEFunc(T(7), BG2dn)" // t8 BusArbiter.SetFTs(T(8), 1, 2)" BusArbiter.SetPre(T(8), P(8))" BusArbiter.SetEFunc(T(8), OWN2dn)" // marcamenti BusArbiter.SetTOKs(P(6), 1)" BusArbiter.SetTOKs(P(7), 0)" BusArbiter.SetTOKs(P(8), 0)" // t9 BusArbiter.SetFTs(T(9), 1, 2)" BusArbiter.SetPre(T(9), P(10))" BusArbiter.SetPost(T(9), P(9))" BusArbiter.SetPost(T(9), P(11))" 114 CAPITOLO 5. SISTEMA SOFTWARE BusArbiter.SetEFunc(T(9), BG3up)" // t10 BusArbiter.SetFTs(T(10), 1, 2)" BusArbiter.SetPre(T(10), P(9))" BusArbiter.SetPost(T(10), P(10))" BusArbiter.SetEFunc(T(10), BG3dn)" // t11 BusArbiter.SetFTs(T(11), 1, 2)" BusArbiter.SetPre(T(11), P(11))" BusArbiter.SetEFunc(T(11), OWN3dn)" // marcamenti BusArbiter.SetTOKs(P(9), 1)" BusArbiter.SetTOKs(P(10), 0)" BusArbiter.SetTOKs(P(11), 0)" // t12 BusArbiter.SetFTs(T(12), 1, 2)" BusArbiter.SetPre(T(12), P(13))" BusArbiter.SetPost(T(12), P(12))" BusArbiter.SetEFunc(T(12), BCLRup)" // t13 BusArbiter.SetFTs(T(13), 1, 2)" BusArbiter.SetPre(T(13), P(12))" BusArbiter.SetPost(T(13), P(13))" BusArbiter.SetEFunc(T(13), BCLRdn)" // marcamenti BusArbiter.SetTOKs(P(12), 1)" BusArbiter.SetTOKs(P(13), 0)" // BR0 (p14) BusArbiter.SetTOKs(P(14), 1)" // u14 BusArbiter.SetRI(U(14), TINIT, +INF, +INF)" // d14 BusArbiter.SetRI(D(14), TINIT, +INF, +INF)" // BR1 (p15) BusArbiter.SetTOKs(P(15), 1)" // u15 BusArbiter.SetRI(U(15), TINIT, +INF, +INF)" // d15 BusArbiter.SetRI(D(15), TINIT, +INF, +INF)" // BR2 (p16) BusArbiter.SetTOKs(P(16), 1)" // u16 BusArbiter.SetRI(U(16), TINIT, +INF, +INF)" BusArbiter.SetRI(U(16), U(16), +INF, +INF)" BusArbiter.SetRI(U(16), T(7), 1, +INF)" // dopo BG2dn, BR2up // d16 BusArbiter.SetRI(D(16), TINIT, 1, +INF)" BusArbiter.SetRI(D(16), U(16), 1, +INF)" BusArbiter.SetRI(D(16), D(16), +INF, +INF)" // BR3 (p17) BusArbiter.SetTOKs(P(17), 1)" // u17 115 CAPITOLO 5. SISTEMA SOFTWARE BusArbiter.SetRI(U(17), BusArbiter.SetRI(U(17), BusArbiter.SetRI(U(17), // d17 BusArbiter.SetRI(D(17), BusArbiter.SetRI(D(17), BusArbiter.SetRI(D(17), TINIT, +INF, +INF)" U(17), +INF, +INF)" T(10), 1, +INF)" // dopo BG3dn, BR3up TINIT, 1, +INF)" U(17), 1, +INF)" D(17), +INF, +INF)" // BBSY (p18) BusArbiter.SetTOKs(P(18), 1)" // u18 BusArbiter.SetRI(U(18), TINIT, BusArbiter.SetRI(U(18), U(18), BusArbiter.SetRI(U(18), D(18), BusArbiter.SetRI(U(18), T(13), // d18 BusArbiter.SetRI(D(18), TINIT, BusArbiter.SetRI(D(18), D(18), BusArbiter.SetRI(D(18), T(7), BusArbiter.SetRI(D(18), T(10), +INF, +INF, 1, 1, +INF)" +INF)" +INF)" +INF)" +INF, +INF, 1, 1, +INF)" +INF)" +INF)" // dopo BG2dn, BBSYdn +INF)" // dopo BG3dn, BBSYdn TPNGraph BusArbiter_g(BusArbiter,30)" cout << "Grafo del Bus Arbiter\n" << BusArbiter_g" IntegData Bus(3, 17)" // 3 grafi e 18 canali Bus.SetGraph(0, BusControl_g)" Bus.SetGraph(1, BusMaster_g)" Bus.SetGraph(2, BusArbiter_g)" Bus.SetChannel( 0, Bus.SetChannel( 1, Bus.SetChannel( 2, Bus.SetChannel( 3, Bus.SetChannel( 4, Bus.SetChannel( 5, Bus.SetChannel( 6, Bus.SetChannel( 7, Bus.SetChannel( 8, Bus.SetChannel( 9, Bus.SetChannel(10, Bus.SetChannel(11, Bus.SetChannel(12, Bus.SetChannel(13, Bus.SetChannel(14, Bus.SetChannel(15, Bus.SetChannel(16, 0,T(0), 0,T(1), 1,T(7), 1,T(4), 1,T(5), 1,T(2), 1,T(3), 1,T(8), 1,T(6), 2,T(9), 2,T(10), 2,T(12), 2,T(13), 2,TNONE, 2,TNONE, 1,TNONE, 1,TNONE, 1,U(11))" 1,D(11))" 0,U(2))" 0,D(2))" 0,D(2))" 2,U(17))" 2,D(17))" 2,U(18))" 2,D(18))" 1,U(8))" 1,D(8))" 1,U(9))" 1,D(9))" 1,U(10))" 1,D(10))" 2,U(16))" 2,D(16))" // // // // // // // // // // // // // // // // // ctrl_NEEDup ctrl_NEEDdn mstr_OWNup mstr_OWNdn mstr_OWNdn mstr_BR3up mstr_BR3dn mstr_BBSYup mstr_BBSYdn arbt_BG3up arbt_BG3dn arbt_BCLRup arbt_BCLRdn arbt_ASup arbt_ASdn mstr_BG2up mstr_BG2dn IntegGraph Bus_g(Bus, 20)" cout << "Grafo del sottosistema Bus\n" << Bus_g" } 116 --> --> --> --> --> --> --> --> --> --> --> --> --> --> --> --> --> mstr_NEEDup mstr_NEEDdn ctrl_OWNup ctrl_OWNdn ctrl_OWNdn arbt_BR3up arbt_BR3dn arbt_BBSYup arbt_BBSYdn mstr_BG3up mstr_BG3dn mstr_BCLRup mstr_BCLRdn mstr_ASup mstr_ASdn arbt_BG2up arbt_BG2dn Conclusioni In questa tesi e stato presentata un modello per la progettazione e la validazione di sistemi hardware, in particolare bus per microcomputer. L' approccio si basa su una estensione delle Communicating Time Petri Net che permette la comunicazione tra moduli attraverso segnali, in modo da soddisfare i requisiti espressivi incontrati nella modellazione di sistemi a bus. L' estensione proposta mantiene le possibilita di analisi esaustiva proprie delle CmTPN. Le tecniche di analisi di MTPN sono state implementate in un sistema software che realizza un nucleo di analisi tale da permettere la generazione composizionale dello spazio degli stati e la valutazione di pro li di temporizzazione per le possibili sequenze di esecuzione del modello. L' espressivita del modello proposto e stata veri cata con la modellazione dei meccanismi basilari incontrati nella progettazione di bus per microcomputer. Riuscendo a modellare gli elementi di base per la realizzazione un bus (bus arbiter, bus master, interrupt controller, ecc.) il modello dimostra di poter essere ecacemente usato nella progettazione di tali sistemi. Come caso concreto di applicazione e stato modellato ed analizzato il bus VME di Motorola. Il sistema realizzato e unico nel suo genere, non essendo noti in letteratura altri tool per l' analisi di raggiungibilita di modelli con temporizzazioni nello stile delle Time Petri Net. Gli sviluppi futuri del sistema potranno includere: studio di tecniche atte ad evitare una eccessiva esplosione del grafo degli stati, magari indagando sulla possibilita di usare per i ring domain delle transizioni degli intervalli di tempo aperti a destra uno strumento per facilitare l' esplorazione del grafo degli stati attraverso un linguaggio di interrogazione di tipo descrittivo un editor visuale per modelli di Modular Time Petri Net che faciliti al progettista il compito di de nire il modello da analizzare. 117 Bibliography 1] W.R. Adrion, M.A. Branstad, and J.C. Cherniavsky. Validation, veri cation and testing of computer software. ACM Computing Surveys, 14(2), June 1982. 2] M. Afghahi and C. Svensson. Performance of synchronous and asynchronous schemes for vlsi systems. IEEE Transactions on Computers, 41(7):858{872, July 1992. 3] T. Agerwala. Putting petri nets to work. IEEE Computer, 12(12):85{94, December 1979. 4] R. Alur, C. Courcoubetis, and D. Dill. Model checking for real time systems. In Proc. of the 5th Symp. on Logics in Computer Science (LICS), pages 414{425. IEEE Computer Society Press, 1990. 5] R. Alur, C. Courcoubetis, and D. Dill. Model checking for probabilistic real-time systems. In Proc. of the 18th ICALP. Madrid, July 1991. 6] R. Alur and D. Dill. Automata for modeling real time systems. In Proc. of the 17th ICALP, Lecture Notes on Computer Science 443, pages 332{335. Springer Verlag, 1990. 7] R. Alur and T.A. Henzinger. Logics and models of real time: a survey. In Real-Time: Theory in Practice, Lecture Notes on Computer Science 600. Springer Verlag, 1991. 8] M. Ben-Ari, A.Pnueli, and Z.Manna. The temporal logic of branching time. Acta Informatica, 20:2207{226, 1983. 9] B. Berthomieu and M. Diaz. Modeling and veri cation of time dependent systems using time petri nets. IEEE Transactions on Software Engineering, 17(3):259+, March 1991. 10] B. Berthomieu and M. Menasche. An enumerative approach fo analyzing time petri nets. In Proc. IFIP Congress, September 1983. 11] G.V. Bochmann. Hardware speci cation with temporal logic: An example. IEEE Transactions on Computers, C{31(3):223{231, March 1982. 12] G. Bucci, R. Mattolini, and E. Vicario. A framework for the development of distribuited object-oriented systems. In Proc. Int. Symposium on Autonomous Decentralized Systems (ISADS), March 1993. 118 BIBLIOGRAPHY 13] G. Bucci and E. Vicario. Compositional validation of time-critical systems using communicating time petri nets. submitted to IEEE Transactions on Software Engineering, 1995. 14] J. Calvo, J.I. ACHA, and M. Valencia. Asynchronous modular arbiter. IEEE Transactions on Computers, C{35(1):67{70, January 1986. 15] E.M. Clarke, E.A. Emerson, and A.P. Sistla. Automatic veri cation of nite-state concurrent systems using temporal logic speci cations. ACM Transactions on Programming Languages and Systems, 8(2), April 1986. 16] A.A.S. Danthine. Protocol representation with nite state models. IEEE Transactions on Communications, COM-28(4), April 1984. 17] D.Dill. Timing assumptions and veri cation of nite-state concurrent systems. In Proc. of the Workshop on Computer Aided Verication Methods for Finite State Systems. Grenoble, France, 1989. 18] A.L. Dexter. Microcomputer Bus Structures and Bus Interface Design, volume 32 of Electrical Engineering and Electronics. MARCEL DEKKER, INC., 270 Madison Avenue, New York, New Jork 10016, 1986. 19] D.B. Gustavson. Computer buses | a tutorial. IEEE Micro, 4(4):7{22, 1984. 20] T.A. Henzinger, Z. Manna, and A. Pnueli. Timed transition systems. Tech. Rep. 92{1263, Dept. of Computer Science, Cornell University, Itaha, NY, January 1992. 21] G.J. Holzmann. Protocol design: Rede ning the state of the art. IEEE Software, January 1992. 22] P. Huber, K. Jensen, and R. Shapiro. Hierarchies in coloured petri nets. In G. Rozenberg, editor, Advances in Petri Nets 1990, Springer Verlag, 1991. 23] R.M. Keller. Formal veri cation of parallel programs. Communications of the ACM, 19(7), July 1976. 24] S. Kipnis. Analysis of asynchronous binary arbitration on digital trasmission line buses. IEEE Transactions on Computers, 43(4):484{489, April 1994. 25] S.S. Lam and A.U. Shankar. Protocol veri cation via projections. IEEE Transactions on Software Engineering, 10(4), July 1984. 26] H. Lee-Kwang, J. Favrel, and P. Baptiste. Generalized petri net reduction method. IEEE Transactions on Systems, Man and Cybernetics, SE-10(4), July 1984. 27] N. Leveson. Safety analysis using petri nets. IEEE Transactions on Software Engineering, SE-13(3), March 1987. 119 BIBLIOGRAPHY 28] F.J. Lin and M.T. Liu. Prototcol validation for large scale applications. IEEE Software, January 1992. 29] Yu-Cheng Liu. The M68000 Microprocessor Family, chapter 7.7, pages 224{234. Prentice-Hall International, Inc., Reading, Massachusetts, 1991. 30] A.J. McAuley. Four state asynchronous architectures. IEEE Transactions on Computers, 41(2):129{142, February 1992. 31] P. Merlin. A methodology for the design and the implementation of communication protocols. IEEE Transactions on Communications, COM-24(6), June 1976. 32] P. Merlin and D.J. Farber. Recoverability of communication protocols. IEEE Transactions on Communications, COM-24(9), September 1976. 33] T. Murata. Petri nets: Properties, analysis and applications. Proceedings of the IEEE, 77(4), April 1989. 34] M. Notomi and T. Murata. Hierarchical reachability graph og bounded petri nets for concurrent software analysis. IEEE Transactions on Software Engineering, 20(5), May 1994. 35] Y.A. Papelis and T.L. Casavant. Speci cation of parallel/distribuited software and systems by petri nets with transition enabling functions. IEEE Transactions on Software Engineering, 18(3):252+, March 1992. 36] J.L. Peterson. Petri nets. ACM Computing Surveys, 9(3), September 1977. 37] W.W. Plummer. Asynchronous arbiters. IEEE Transactions on Computers, 11(1):37{42, 1972. 38] N.V. Stenning. A data transfer protocol. Computer Networks, 1, September 1976. 39] B. Stroustrup. Il linguaggio C++ - Seconda Edizione. Addison-Wesley Masson, 1993. 40] I.E. Sutherland. Micropipelines. Communcations of the ACM, 32(6):720{ 738, June 1989. 41] I. Suzuki and H. LU. Temporal petri nets and their application to modeling and analysis of a handshake daisy chain arbiter. IEEE Transactions on Computers, 38(5):696{704, May 1989. 42] S.H. Unger and C.J. Tan. Clocking schemes for high-speed digital systems. IEEE Transactions on Computers, C-35(10):880{895, October 1986. 43] E. Vicario. Automated derivation of time bounds for real-time cuncurrent systems using time petri nets. Forthcoming. 120 BIBLIOGRAPHY 44] E. Vicario. Riformulazione dell' algoritmo di integrazione, veri ca delle required interfaces, soundness theorem. Appunti non pubblicati, September 1994. 45] E. Vicario. Validazione di Sistemi di Tempo Reale Mediante Modelli di Petri Estesi. Tesi di dottorato, Universita degli Studi di Firenze | Facolta di Ingegneria, Dipartimento di Sistemi e Informatica, 1994. 46] E. Vicario. A polynomial solution method for systems of inequalities as encountered in the analysis of time petri nets. submitted to IEEE Transactions on Software Engineering, 1995. 121