# CORRECTION
# Ebauche de Testeur de CI logique
# P. Mariano
# Lycée PE Martin
# le 5/12/2023
# Raspberry Pi Pico https://webge.fr/dokuwiki/doku.php?id=microc:uc:rp2

# Bibliothèques
from machine import Pin
import time
time.sleep(0.1) # Attente nécessaire pour l'affichage en console

# GPIO
# Stimulis en sortie
S_A15 = Pin(19, Pin.OUT) # Stimuli A15
S_A14 = Pin(18, Pin.OUT) # Stimuli A14 
S_A13 = Pin(17, Pin.OUT) # Stimuli A13 
S_A12 = Pin(16, Pin.OUT) # Stimuli A12 
S_PSEN = Pin(21, Pin.OUT) # Stimuli PSEN
S_RD = Pin(20, Pin.OUT)  # Stimuli RD
# Signaux à analyser en entrée
E_RAM = Pin(26, Pin.IN)  # signal RAM issu du circuit testé
E_ROM = Pin(27, Pin.IN)  # signal ROM issu du circuit testé
E_OE = Pin(28, Pin.IN)   # signal OE issu du circuit testé

# Table de vérité de RAM
#    [A15,PSEN] ->  RAMa
# V0 [0 , 0] ->  1
# V1 [0 , 1] ->  0
# V2 [1 , 0] ->  1
# V3 [1 , 1] ->  1

# Table de vérité de ROM
#    [A15,RD,PSEN] ->  ROMa
# V0 [0,0,0] -> 0
# V1 [0,0,1] -> 1
# V2 [0,1,0] -> 0
# V3 [0,1,1] -> 1
# V4 [1,0,0] -> 0
# V5 [1,0,1] -> 0
# V6 [1,1,0] -> 0
# V7 [1,1,1] -> 1

# Table de vérité de OE 
#    [A15,A14,A13,A12] -> OEa
# V0 [0,0,0,0] -> 0
#        |               
#        |
# V15 [1,1,1,1] -> 1


# Une liste de tuples matérialise la table des vecteurs de test
Vecteurs_RAM = [(0, 0, 1), (0, 1, 0), (1, 0, 1), (1, 1, 1)] 
Vecteurs_ROM = [(0, 0, 0, 0), (0, 0, 1, 1), (0, 1, 0, 0), (0, 1, 1, 1), (1, 0, 0, 0), (1, 0, 1, 0), (1, 1, 0, 0), (1, 1, 1, 1)]

# Fonction
def creerVecteursTest(n, vs): # 2^n : nombre de vecteurs, vs : sorties attendues
    vecteurs = []
    # Correction
    vecteur_i = []  # Vecteur de la ligne i dans la table
    for i in range(2**n):  # Pour n entrées, la table contient les lignes 0 <= i <= (2^n) - 1
        # Suppression de '0b' dans la représentation binaire de i
        binaire_i = bin(i)[2:] # pour i = 3 binaire_i='11'
        # conversion du nombre binaire_i en une liste de booléens
        for j in binaire_i:
            vecteur_i.append(int(j)) # pour i = 3 vecteur_i = [1,1]
        # si la taille du vecteur < n, il est complété par des 0
        for _ in range(n-len(vecteur_i)):
            vecteur_i.insert(0, 0) # pour i = 3 et n = 3 vecteur_i = [0,1,1]
        vecteur_i.append(vs[i])  # Ajout de la valeur attendue pour s 
                                 # pour i = 3, n = 3 et vs[i] = 1 vecteur_i = [0,1,1,1]
        # Ajout du vecteur i à la table des vecteurs
        vecteurs.append(tuple(vecteur_i))  # sous la forme d'un tuple
                          # pour i = 3, n = 3 et vs[i] = 1, on ajoute (0,1,1,1) à vecteurs
        vecteur_i = []  # on vide le vecteur i en cours pour le calcul du vecteur i+1
    return vecteurs

# Tests
# Test de la sortie logique RAM
print("[A15,PSEN] -> RAMa,RAMo")
for A15, PSEN, RAMa in Vecteurs_RAM: # RAMa : RAM attendue
    if A15 == 0 :
        S_A15.off()
    else:
       S_A15.on()
    if PSEN == 0 :
        S_PSEN.off()
    else:
        S_PSEN.on()

    RAMo = E_RAM.value() # RAMo : RAM obtenue

    if RAMa == RAMo: 
        print(f"[{A15},{PSEN}] -> {RAMa},{RAMo} ")
    else:
        print(f"[{A15},{PSEN}] -> {RAMa},Erreur")


# Test de la sortie logique ROM
print("[A15,RD,PSEN] -> ROMa,ROMo")
for A15, RD, PSEN, ROMa in Vecteurs_ROM: # ROMa : ROM attendue
    if A15 == 0 :
        S_A15.off()
    else:
        S_A15.on()
    if RD == 0 :
        S_RD.off()
    else:
        S_RD.on()
    if PSEN == 0 :
        S_PSEN.off()
    else:
        S_PSEN.on()

    ROMo = E_ROM.value() # ROMo : sortie obtenue

    if ROMa == ROMo: 
        print(f"[{A15},{RD},{PSEN}] -> {ROMa},{ROMo}")
    else:
        print(f"[{A15},{RD},{PSEN}] -> {ROMa},Erreur")

# Test de la sortie logique OE
OEattendu = [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
Vecteurs_OE = creerVecteursTest(4, OEattendu)
print("[A15,A14,A13,A12] -> OEa,OEo ")
for A15, A14, A13, A12, OEa in Vecteurs_OE: # OEa : OE attendue
    if A15 == 0 :
        S_A15.off()
    else:
        S_A15.on()
    if A14 == 0 :
        S_A14.off()
    else:
        S_A14.on()
    if A13 == 0 :
        S_A13.off()
    else:
        S_A13.on()
    if A12 == 0 :
        S_A12.off()
    else:
        S_A12.on()

    OEo = E_OE.value() # OEo : OE obtenue

    if OEa == OEo: 
        print(f"[{A15},{A14},{A13},{A12}] -> {OEa},{OEo}")
    else:
        print(f"[{A15},{A14},{A13},{A12}] -> {OEa},Erreur")
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT
RAM
ROM
OE
PSEN
RD
A15
A14
A13
A12