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

60 lines
1.3 KiB
C++

Clock::Clock (int m, State initial)
{
init = initial; // Merken
n = m; // Merke Taktrate
a = b = c = 0; // nix angeschlossen
actionFlag=false; // nix aktiviert
w.ConnectInput(*this,1); // Ich -> Draht
w.ConnectOutput(*this,0); // Draht->Ich
Sim.StoreCircuitEvent(*this);
}
Clock::~Clock() {}
void Clock::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 Clock::Action ()
{
// Selbstaktivierung nach n Takten
if (c->GetState()==unknown)
{
c->ChangeState(Sim.GetTime()+1,init);
b->ChangeState(Sim.GetTime()+1,init);
}
if (c->GetState()==low)
{
c->ChangeState(Sim.GetTime()+n,high);
b->ChangeState(Sim.GetTime()+n,high);
}
if (c->GetState()==high)
{
c->ChangeState(Sim.GetTime()+n,low);
b->ChangeState(Sim.GetTime()+n,low);
}
// erlaube neue Auswertung
actionFlag=false;
}
void Clock::ConnectInput (Wire& w, int pin)
{
// Wird von Connect-Funktion des Drahtes aufgerufen
a = &w;
}
void Clock::ConnectOutput (Wire& w, int pin)
{
// Wird von Connect-Funktion des Drahtes aufgerufen
if (pin==0) b = &w;
if (pin==1) c = &w;
}