public void Tick() { List <string> valid = new List <string>(); List <Gate> toActivate = Gates.Select(g => g).ToList(); while (toActivate.Count > 0) { List <Gate> activable = toActivate.Where(g => IsActivable(g, valid)).ToList(); foreach (Gate gate in activable) { gate.Tick(_registers); valid.Add(gate.Output); toActivate.Remove(gate); } } }