Simulateur de circuits électroniques logiques en C++, chargeant des composants via des plugins et affichant les états via SFML/ncurses.
Telecharger & tester
make && ./nanotekspice -f circuit.chip (simulateur de circuits logiques a base de composants chargeables dynamiquement)
NanoTekSpice est un projet Epitech (Tek2, B-OOP-400, groupe) qui consiste a ecrire en C++ un simulateur de logique numerique : a partir d'un fichier de configuration decrivant un circuit electronique, le programme construit un graphe de composants (portes logiques, entrees, sorties) puis injecte des valeurs booleennes pour en observer le resultat, composant par composant.
Le systeme repose sur une algebre a trois etats et non une simple algebre booleenne : en plus de true et false, une valeur peut etre undefined lorsqu'un composant depend d'une sortie qui n'a pas encore ete calculee dans le cycle courant. Chaque composant doit implementer l'interface IComponent, avec notamment une methode compute qui retourne un Tristate pour une broche donnee et une methode setLink qui relie deux broches entre deux composants ; il est interdit de manipuler des pointeurs ou references vers les classes concretes des composants, seule l'interface IComponent doit circuler dans le graphe.
Le fichier de circuit se decoupe en deux sections : .chipsets, qui declare et nomme les composants utilises (avec eventuellement une valeur d'initialisation entre parentheses, comme pour la ROM 2716), et .links, qui decrit les connexions broche a broche entre composants. Une bibliotheque de circuits integres classiques doit etre supportee (4001 NOR, 4008 additionneur 4 bits, 4011 NAND, 4013 bascule D, 4017 compteur Johnson, 4030 XOR, 4040 compteur 12 bits, 4069 inverseurs, 4071 OR, 4081 AND, 4094 registre a decalage, 4514 decodeur, 4801 RAM, 2716 ROM), ainsi que des composants speciaux : input, clock (comme input mais dont la valeur s'inverse a chaque simulation), true, false et output.
Une fois lance avec le fichier de circuit et les valeurs des entrees passees en parametres, le simulateur lit des commandes sur l'entree standard : exit, display (affiche les sorties triees par ordre ASCII de leur nom), input=value (modifie une entree), simulate (execute un cycle de simulation) et loop (boucle jusqu'a reception de SIGINT). Le programme doit executer une premiere simulation puis un display automatiquement au demarrage, afficher un prompt '>' entre chaque commande, et representer une valeur indefinie par la lettre 'U'.
La robustesse est un axe central de l'evaluation : le programme doit lever des exceptions (heritant de std::exception, jamais d'exceptions scalaires) pour toute erreur de configuration — erreur lexicale ou syntaxique, type ou nom de composant inconnu, broche inexistante, doublon de nom, sortie non reliee, entree non fournie ou inconnue, section manquante — sans jamais planter (segfault, boucle infinie). Les bonus suggeres incluent un composant terminal, une sortie graphique du circuit, des composants d'affichage 7 segments ou matrice de pixels, voire un microprocesseur complet (i4004 ou design maison Turing-complet).
Projet suivant
