Ejemplo n.º 1
0
        private IEnumerable <ITimedFlow> ConstructNetwork(SignalRef target, IEnumerable <ITimedFlow> flows)
        {
            var groupedByDelay = flows
                                 .GroupBy(tf => tf is TimedSignalFlow ? ((TimedSignalFlow)tf).Delay : 0)
                                 .OrderBy(grp => grp.Key);
            var  curTarget      = target;
            int  remainingFanIn = flows.Count();
            long generation     = 0;
            var  pumpOut        = new List <SignalFlow>();

            foreach (var delayGroup in groupedByDelay)
            {
                foreach (var tflow in delayGroup)
                {
                    var tsf = tflow as TimedSignalFlow;
                    var tvf = tflow as TimedValueFlow;
                    if (tsf != null)
                    {
                        long flowDelay = tsf.Delay - generation;
                        if (flowDelay == 0)
                        {
                            yield return(new TimedSignalFlow(tsf.Source, curTarget, tsf.Time, 0));
                        }
                        else
                        {
                            SignalBase tmpSig = Signals.CreateInstance(tsf.Source.Desc.InitialValue);
                            tmpSig.Descriptor.TagTemporary(_tmpIdx++);
                            yield return(new TimedSignalFlow(
                                             tsf.Source,
                                             tmpSig.ToSignalRef(SignalRef.EReferencedProperty.Next),
                                             tsf.Time, 0));

                            yield return(new TimedSignalFlow(
                                             tmpSig.ToSignalRef(SignalRef.EReferencedProperty.Cur),
                                             curTarget,
                                             tsf.Time + flowDelay, 0));
                        }
                        long start = tsf.Time + tsf.Delay;
                        foreach (var pump in pumpOut)
                        {
                            yield return(new TimedSignalFlow(pump.Source, pump.Target, start, 0));

                            start--;
                        }
                    }
                    else
                    {
                        // remark: as of now, delay is always 0
                        yield return(new TimedValueFlow(tvf.Value, curTarget, tvf.Time));
                    }
                }
                long delay = delayGroup.Key;
                remainingFanIn -= delayGroup.Count();
#if false
                if (remainingFanIn > 1)
                {
                    var stageInSignal = _binder.GetSignal(EPortUsage.Default,
                                                          "icn_" + target.Desc.Name + "_" + generation + "_in",
                                                          null,
                                                          target.Desc.InitialValue);
                    var stageOutSignal = _binder.GetSignal(EPortUsage.Default,
                                                           "icn_" + target.Desc.Name + "_" + generation + "_out",
                                                           null,
                                                           target.Desc.InitialValue);
                    _stageInSignals.Add(stageInSignal);
                    _stageOutSignals.Add(stageOutSignal);
                    var pumpSource = new SignalRef(stageOutSignal.ToSignalRef(SignalRef.EReferencedProperty.Cur));
                    pumpOut.Add(new SignalFlow(pumpSource, curTarget));
                    curTarget = new SignalRef(stageInSignal.ToSignalRef(SignalRef.EReferencedProperty.Next));
                    ++generation;
                }
#endif
            }
        }