protected override void DoTraverse(Signal rootSignal, IScanVisitor visitor, bool ignoreHold) { if(rootSignal.BehavesAsBeingDriven(ignoreHold)) { List<Guid> ports = new List<Guid>(); TraversePort(ports, rootSignal.DrivenByPort, rootSignal, ignoreHold, visitor); } }
private bool TraverseSignal(List<Guid> signals, Signal signal, Port target, bool ignoreHold, IScanVisitor visitor) { if(signal == null || signals.Contains(signal.InstanceId)) return true; signals.Add(signal.InstanceId); if(visitor.EnterSignal(signal, target, false, target == null)) { if(signal.BehavesAsBeingDriven(ignoreHold)) { Port port = signal.DrivenByPort; foreach(Signal input in port.InputSignals) if(!TraverseSignal(signals, input, port, ignoreHold, visitor)) return false; // finished } } return visitor.LeaveSignal(signal, target, false, target == null); }
private bool TraverseSignal(List<Guid> signals, List<Guid> ports, List<Guid> buses, Signal signal, Port target, bool ignoreHold, IScanVisitor visitor) { if(signal == null || signals.Contains(signal.InstanceId)) return true; signals.Add(signal.InstanceId); if(visitor.EnterSignal(signal, target, false, target == null)) { // LEAF SIGNAL? if(!signal.BehavesAsBeingDriven(ignoreHold)) { if(!visitor.VisitLeaf(signal, false)) return false; // finished } else // HANDLE PORT { TraversePort(signals, ports, buses, signal.DrivenByPort, signal, ignoreHold, visitor); } } return visitor.LeaveSignal(signal, target, false, target == null); }