next up previous contents index
Next: Suite du simulateur Up: Example : Simulateur logique Previous: Exemple d'utilisation   Contents   Index



Simulateur : les connexions

Dans ce chapitre, nous ne décrirons que les connexions. Il nous restera à décrire l'agenda, le moteur du simulateur, et les portes primitives.

Une connexion est un vecteur Scheme à trois éléments :

La fonction Scheme créant une connexion est :

; création d'une connexion
(define (connexion:créer . init)
  (vector 'connexion
          (if (null? init) 0 (car init))
          '()))

On remarque que la fonction est à nombre d'arguments variable : Elle peut être appliquée à zéro, un ou plus arguments. Le paramètre init contient la liste des arguments supplémentaires, ou la liste vide, le cas échéant. Dans notre cas, seul le premier argument sera utilisé pour modifier, le cas échéant, la valeur initiale de la connexion.

Le premier élément du vecteur est le symbole connexion qui nous permettra d'effectuer des tests sur la validité de l'objet. De plus, à l'affichage d'un objet connexion, le nom connexion permettra de le différencier des autres objets.

Le second élément du vecteur est la valeur initiale de la connexion, initialisé à zéro ou par l'argument optionnel.

Le troisième élément du vecteur est la liste des actions attachées à la connexion, initialement vide.

Nous allons maintenant définir les fonctions permettant de manipuler une connexion. La première d'entre elles est la fonction de lecture de la valeur courante de la connexion :

; lecture de la valeur courante
(define (connexion:lire connexion)
  (vector-ref connexion 1))

La valeur d'une connexion est simplement la deuxième valeur du vecteur.

On remarque qu'aucun test n'est effectué quant à la nature de l'objet passé en argument. Il serait possible de vérifier qu'il s'agit bien d'un vecteur et que son premier élément est le symbole connexion.

La fonction suivante permet d'ajouter une action à la liste des actions enregistrées dans la connexion :

; ajout d'une action
(define (connexion:brancher! connexion
                             action)
  (vector-set! connexion
               2
              (cons action
                    (vector-ref connexion
                                2))))

Enfin, la dernière fonction permet de modifier la valeur courante. Si la nouvelle valeur est différente de la valeur courante, toutes les actions sont activées. Sinon, rien ne ce passe :

; modifier la valeur courante
(define (connexion:changer! connexion
                            valeur)
  (if (not (eq? (vector-ref connexion 1)
                valeur))
   (begin
    (vector-set! connexion 1 valeur)
    (for-each (lambda (action)
                (action))
              (vector-ref connexion 2)))))

La fonction ne présente pas de difficultés. Si la nouvelle valeur est différente de la valeur courante de la connexion, la valeur de la connexion est modifiée et toutes les procédures de la liste des actions sont activées, sans arguments.

Nous verrons dans le prochain chapitre que les actions sont responsables de la propagation des valeurs le long des connexions en activant des fonctions de calcul attachées aux portes.


next up previous contents index
Next: Suite du simulateur Up: Example : Simulateur logique Previous: Exemple d'utilisation   Contents   Index
© 1993 to 2001 Erian Concept