public Signal Manipulate(Signal rootSignal, IManipulationVisitor visitor, bool ignoreHold) { IScanStrategy allPathsStrat = Binder.GetSpecificInstance <IScanStrategy>(new MathIdentifier("AllPathsStrategy", "Traversing")); Dictionary <Guid, ManipulationPlan> plans = new Dictionary <Guid, ManipulationPlan>(); Dictionary <Guid, Signal> signalReplacements = new Dictionary <Guid, Signal>(); Dictionary <Guid, Signal> sentinels = new Dictionary <Guid, Signal>(); // ## ESTIMATE MANIPULATION PLAN _scanner.ForEachPort(rootSignal, delegate(Port p) { if (!plans.ContainsKey(p.InstanceId)) { plans.Add(p.InstanceId, visitor.EstimatePlan(p)); } return(true); }, ignoreHold); // ## OPTIMIZE MANIPULATION PLAN (cycle analysis) ManipulatorPlanReducer reducer = new ManipulatorPlanReducer(plans, ignoreHold); allPathsStrat.Traverse(rootSignal, reducer, ignoreHold); // ## EXECUTE MANIPULATION ManipulatorPlanExecutor executor = new ManipulatorPlanExecutor(plans, signalReplacements, sentinels, visitor); allPathsStrat.Traverse(rootSignal, executor, ignoreHold); // ## SELECT NEW SYSTEM Signal ret; if (!signalReplacements.TryGetValue(rootSignal.InstanceId, out ret)) { ret = rootSignal; } // ## FIX SENTINELS ON SELECTED NEW SYSTEM _scanner.ForEachPort(ret, delegate(Port p) { // look for sentinels on all input signals ReadOnlySignalSet inputs = p.InputSignals; for (int i = 0; i < inputs.Count; i++) { Signal input = inputs[i]; if (FixSentinel(ref input, sentinels, signalReplacements)) { p.ReplaceInputSignalBinding(i, input); } } return(true); }, ignoreHold); FixSentinel(ref ret, sentinels, signalReplacements); // ## RETURN SELECTED NEW SYSTEM AS RESULT return(ret); }
public IList <Port> FindAllPorts(IEnumerable <Signal> rootSignals, Predicate <Port> match, bool ignoreHold) { ICollectVisitor visitor = Binder.GetInstance <ICollectVisitor, Predicate <Port> >(match); IScanStrategy strategy = Binder.GetSpecificInstance <IScanStrategy>(new MathIdentifier("AllPortsStrategy", "Traversing")); strategy.Traverse(rootSignals, visitor, ignoreHold); return(visitor.Ports); }
public IList <Signal> FindAllSignals(Port rootPort, Predicate <Signal> match, bool ignoreHold) { ICollectVisitor visitor = Binder.GetInstance <ICollectVisitor, Predicate <Signal> >(match); IScanStrategy strategy = Binder.GetSpecificInstance <IScanStrategy>(new MathIdentifier("AllSignalsStrategy", "Traversing")); strategy.Traverse(rootPort, visitor, ignoreHold); return(visitor.Signals); }
public IList <Port> FindAllPorts(Port rootPort, bool ignoreHold) { ICollectVisitor visitor = Binder.GetInstance <ICollectVisitor>(); IScanStrategy strategy = Binder.GetSpecificInstance <IScanStrategy>(new MathIdentifier("AllPortsStrategy", "Traversing")); strategy.Traverse(rootPort, visitor, ignoreHold); return(visitor.Ports); }
public IList <Signal> FindAllSignals(IEnumerable <Signal> rootSignals, bool ignoreHold) { ICollectVisitor visitor = Binder.GetInstance <ICollectVisitor>(); IScanStrategy strategy = Binder.GetSpecificInstance <IScanStrategy>(new MathIdentifier("AllSignalsStrategy", "Traversing")); strategy.Traverse(rootSignals, visitor, ignoreHold); return(visitor.Signals); }
public void Traverse(IEnumerable <Signal> rootSignals, IScanStrategy strategy, IScanVisitor visitor, bool ignoreHold) { if (visitor == null) { throw new ArgumentNullException("visitor"); } if (strategy == null) { throw new ArgumentNullException("strategy"); } strategy.Traverse(rootSignals, visitor, ignoreHold); }
public void Traverse(Port rootPort, IScanStrategy strategy, IScanVisitor visitor, bool ignoreHold) { if (visitor == null) { throw new ArgumentNullException("visitor"); } if (strategy == null) { throw new ArgumentNullException("strategy"); } strategy.Traverse(rootPort, visitor, ignoreHold); }
public void Traverse(IEnumerable<Signal> rootSignals, IScanStrategy strategy, IScanVisitor visitor, bool ignoreHold) { if(visitor == null) throw new ArgumentNullException("visitor"); if(strategy == null) throw new ArgumentNullException("strategy"); strategy.Traverse(rootSignals, visitor, ignoreHold); }
public void Traverse(Port rootPort, IScanStrategy strategy, IScanVisitor visitor, bool ignoreHold) { if(visitor == null) throw new ArgumentNullException("visitor"); if(strategy == null) throw new ArgumentNullException("strategy"); strategy.Traverse(rootPort, visitor, ignoreHold); }