Files
uni/ws2019/ipi/uebungen/cpp_headers/AnalyzerImp.cc
T

65 lines
1.7 KiB
C++

Analyzer::Analyzer (int m)
{
n = m; // Merke Groesse, Eingang n
a = new Wire*[n]; // n Zeiger auf Wires
for (int i=0; i<n; i=i+1) a[i] = 0; // nix angeschlossen
b = c = 0; // nix angeschlossen
w.ConnectInput(*this,0); // Ich -> Draht
w.ConnectOutput(*this,n); // Draht->Ich
actionFlag=true; // nix aktiviert
Sim.StoreCircuitEvent(*this); // Starte Auswertung
}
Analyzer::~Analyzer()
{
delete[] a;
}
void Analyzer::ChangeInput (State s, int pin)
{
// Sorge dafuer, dass Gatter neu berechnet wird, wenn
// alle Zustaende der Eingaenge (Draehte) festliegen
if (!actionFlag)
{
Sim.StoreCircuitEvent(*this);
actionFlag=true;
}
}
void Analyzer::Action ()
{
// Lese Eingangssignale
std::cout.width(10);
std::cout << Sim.GetTime();
for (int i=n-1; i>=0; i=i-1)
if (a[i]!=0)
{
if (a[i]->GetState()==low) std::cout << " 0";
if (a[i]->GetState()==high) std::cout << " 1";
if (a[i]->GetState()==unknown) std::cout << " U";
}
else std::cout << " ";
std::cout << std::endl;
// Selbstaktivierung im naechsten Zeitschritt
if (c->GetState()==unknown) c->ChangeState(Sim.GetTime()+1,high);
if (c->GetState()==low) c->ChangeState(Sim.GetTime()+1,high);
if (c->GetState()==high) c->ChangeState(Sim.GetTime()+1,low);
// erlaube neue Auswertung
actionFlag=false;
}
void Analyzer::ConnectInput (Wire& w, int pin)
{
// Wird von Connect-Funktion des Drahtes aufgerufen
if (pin>=0 && pin<n) a[pin] = &w;
if (pin==n) b = &w;
}
void Analyzer::ConnectOutput (Wire& w, int pin)
{
// Wird von Connect-Funktion des Drahtes aufgerufen
c = &w;
}