public void Transitize() { Queue <Flow> q = new Queue <Flow>(_flows.Values); // DEBUG only // var copy = new List<KeyValuePair<SignalBase, Flow>>(_flows); while (q.Any()) { var flow = q.Dequeue(); SignalFlow sflow = flow as SignalFlow; if (sflow != null) { Flow trflow; if (_flows.TryGetValue(sflow.Source, out trflow)) { SignalFlow strflow = trflow as SignalFlow; if (strflow != null) { trflow = new SignalFlow(strflow.Source, sflow.Target); } ValueFlow vtrflow = trflow as ValueFlow; if (vtrflow != null) { trflow = new ValueFlow(vtrflow.Value, sflow.Target); } _flows[sflow.Target] = trflow; if (trflow.Equals(sflow)) { throw new InvalidOperationException("Cyclic dataflow"); } q.Enqueue(trflow); } } } }
/// <summary> /// Tells whether a given signal-flow is between real signals, with no virtual register involved. /// </summary> /// <param name="flow">signal-flow to query</param> /// <returns>whether both endpoints are non-virtual</returns> public static bool IsEndToEnd(this SignalFlow flow) { return(!flow.Source.IsTemporary() && !flow.Target.IsTemporary()); }
public void Transitize() { Queue<Flow> q = new Queue<Flow>(_flows.Values); // DEBUG only // var copy = new List<KeyValuePair<SignalBase, Flow>>(_flows); while (q.Any()) { var flow = q.Dequeue(); SignalFlow sflow = flow as SignalFlow; if (sflow != null) { Flow trflow; if (_flows.TryGetValue(sflow.Source, out trflow)) { SignalFlow strflow = trflow as SignalFlow; if (strflow != null) { trflow = new SignalFlow(strflow.Source, sflow.Target); } ValueFlow vtrflow = trflow as ValueFlow; if (vtrflow != null) { trflow = new ValueFlow(vtrflow.Value, sflow.Target); } _flows[sflow.Target] = trflow; if (trflow.Equals(sflow)) throw new InvalidOperationException("Cyclic dataflow"); q.Enqueue(trflow); } } } }