|
- 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;
- }
|