PROBLEMA [c++] Simulatore Logico

vardagilthoniel

Nuovo Utente
3
0
Ciao, studio il C++ da qualche mese. Ho da implementare un simulatore logico di circuiti digitali per un progetto dell'università. In sostanza dati due file: uno relativo agli input da dare al circuito e l'altro riguardante la struttura top level e interna (a livello di porte logiche) del circuito, (come un esempio di seguito), devo ottenere gli output.

full_adder.txt

NAME Full_adder
INPUTS 3
OUTPUTS 2
NETS 4
GATES
XOR2 U0 I0, I1, N0
XOR2 U1 N0, I2, O0
OR2 U2 N1, N2, O1
AND2 U3 N0, I2, N1
AND2 U4 I0, I1, N2

input.txt
001
111
101
010

In sintesi ciò che ho fatto è stato:
-Creare una classe FileManager che gestisce i due file di input e crea 3 strutture dati: una riguardante gli input, una la descrizione top level del circuito e una la descrizione interna.
-Creare una classe Synthesizer che presi in ingresso le tre struttura sintetizza il circuito come una sorta di grafo, nel quale il collegamento tra le porte è fatto tramite puntatori alle porte successive.
In particolare per ogni riga dopo "GATES" istanzia una porta logica descritta da un'ulteriore classe LogicGate, e tramite la descrizione identifica se sia una porta HEADER (cioè che riceve gli input top level del circuito contrassegnati con "Ix"), una porta INTERNA che ha come input gli output di porte precedenti (contrassegnati con "Nx"), o un TAIL (ossia una porta che ha come output gli output toplevel del circuito). Dunque le raccoglie in questi contenitori vector<LogicGate> a seconda del tipo di porta. Inoltre ogni porta i-esima ha come membro un vector<LogicGate*> next_gate, ossia un vettore di puntatori alle porte successive alla porta i-esima, indispensabili a livello di simulazione per poter propagare gli input in ingresso al circuito.
-Creare una classe Simulator che istanziato il circuito da in ingresso gli input, li immette negli HEADER, e li fa propagare nelle porte interne fino ai TAIL, e infine raccoglie le uscite.

Le strutture vengono definite correttamente da FileManager, il circuito viene istanziato correttamente, però gli output del circuito sono corretti solo al primo giro di input. Alla seconda simulazione mi è sembrato di capire tramite diversi flag e cout che ho piazzato appositamente lungo il codice, che il contenitore vector<LogicGate*> non viene svuotato bene, sebbene lo svuoti esplicitamente. Inoltre svuoto e cancello i dati nei contenitori output e input di ogni porta e pure quelli del circuito.

Di seguito vi posto i punti di codice cruciale che potrebbero servire per capire meglio, ciò che intendo(metto le catture perchè mi sembrano più leggibili):


Da notare il fatto che nel metodo buildCircuit() non ho utilizzato l'operatore new[] per istanziare le porte perchè mi sembrava più facile scrivere del codice in questo modo (altrimenti avrei avuto puntatori di puntatori che mi confondono abbastanza). Però in effetti può essere una delle implicazioni per cui magari l'operazione di svuotamento non funziona, anche perchè non ho utilizzato distruttori etc in modo canonico, ma il metodo clearIOBuffer().
Spero qualcuno mi possa aiutare, grazie a chi vorrà darmi delle dritte! Se serve ho tutto il codice, spero sia stata chiara.
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!