Le langage Signal
Signal est un langage synchrone de type déclaratif et flot de données. Les objets de base manipulés par ce langage sont les signaux. Un signal est une suite non bornée de valeurs typées à laquelle est associée une horloge qui détermine l'ensemble des instants où le signal est présent. Par exemple, un signal X dénote la séquence tex2html_wrap_inline111 de données indexées par le temps t dans un domaine T. Des signaux d'un type particulier appelés event sont caractérisés seulement par leur horloge, c'est-à-dire leur présence (ils ont la valeur Booléenne true à chaque occurrence). Étant donné un signal X, son horloge est donnée par l'expression event X, qui donne l'événement présent simultanément à X.

Signal est construit autour d'un petit nombre d'opérateurs de base qui permettent de spécifier dans un style équationnel les relations entre les signaux. Chaque équation issue d'un programme Signal peut être vue comme un processus élémentaire. Ces processus Signal décrivent donc à la fois les relations fonctionnelles et temporelles entre les signaux. Ils peuvent communiquer, par l'intermédiaire de signaux constituant leurs ports d'entrée et de sortie, avec le monde extérieur ou avec d'autres processus. Enfin, la composition d'un ensemble de processus produit le programme Signal.

Le système d'équations issu de la composition des différents processus est ensuite analysé par le compilateur qui se livre à une vérification de sa consistance et détermine si les contraintes de synchronisation sont vérifiées. Si c'est le cas et si le programme est contraint de façon à calculer une solution unique, alors un code exécutable en C ou en Fortran est produit.

Noyau du langage signal

En Signal, les opérateurs de base définissent des processus élémentaires, chacun correspondant à une équation :

  1. Les opérateurs fonctionnels : ils sont définis sur les types du langage. Par exemple la négation Booléenne du signal E est écrite not E et le signal (Yt) , défini par la fonction f dans Yt = f(X1t,X2t,...,Xnt), est écrit:

    Y := f{X1, X2, ... , Xn}

    Les expressions fonctionnelles sont monochrones, ce qui signifie que les signaux Y, X1, ..., Xn sont dits synchrones : ils partagent la même horloge. En d'autres termes, pour calculer la valeur de Yt, tous les Xi doivent être disponibles à l'instant t. Pour cette raison, ils sont contraints à avoir la même horloge : celle de Y.

  2. Le filtre : le sous-échantillonnage d'un signal X selon une condition C est écrit:

    Y := X when C

    Cet opérateur est polychrone : les opérandes et le résultat n'ont pas la même horloge. Le signal Y est présent si et seulement si X et C sont présents au même instant et C a la valeur true. Ainsi, Y est moins fréquent que X et que C à la fois : l'intersection des horloges de X et de C (c'est-à-dire les instants où l'expression peut être évaluée) inclut l'horloge de Y (qui ne comporte que les instants où C s'évalue à true). Quand Y est présent, sa valeur est celle de X.

  3. La fusion : on définit la fusion de deux signaux X et Y par:

    Z := X default Y

    Cet opérateur est également polychrone : l'horloge de Z est l'union de celles de X et Y, elle est donc plus fréquente que chacune d'elles.
    La valeur de Z est celle de X quand il est présent, sinon celle de Y quand il est présent.

  4. La composition de processus. : les processus élémentaires peuvent être composés par l'opérateur commutatif et associatif ``|'' qui dénote l'union des systèmes d'équations. En Signal, pour des processus P1 et P2, on écrit :

    (| P1 | P2 |)

Si le langage est construit autour de ce noyau élementaire, il comporte cependant des opérateurs dérivés pour les tableaux ou les variables par exemple. On peut ainsi définir des sortes de macro-instructions : des schémas de processus, qui ont un nom, des paramètres et des signaux d'entrée et de sortie typés, un corps et des déclarations locales. Les instances de schémas de processus rencontrées dans un programme sont expansées par un préprocesseur du compilateur.

D'autres opérateurs, dont le rôle est de décrire des comportements dynamiques et des comportements parallèles, sont disponibles dans le langage Signal : le retard permet l'accès aux valeurs passées d'un signal et l'opérateur de composition peut être vu comme un opérateur de composition parallèle.

  1. Le retard : le retard donne la valeur passée d'un signal, ce qui est généralement noté ZXt=Xt-d, avec la valeur initiale ZXi=Vi, pour i inférieur ou égal à d; en Signal, pour le cas simple où d=1, on écrit:

    ZX := X$1 avec l'initialisation ZX init V0

    Le retard est un opérateur monochrone, c'est-à-dire que X et ZX ont la même horloge.

  2. Le parallélisme : l'opérateur de composition | que l'on a défini précédemment comme un opérateur réalisant l'union de deux systèmes d'équations peut de plus être considéré comme un opérateur de parallélisme entre plusieurs processus et est noté de la même manière :

    (| P1 | P2 |)

    Les communications entre ces processus se font de manière instantanée par l'intermédiaire de signaux.


Webmaster : epatr_webmaster@irisa.fr
Last modified: Wed Mar 24 13:29:42 MET 1999