public IEnumerable<TAVerb> Add(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> r)
 {
     IProcess action = _host.A.Dual.Drive(a).Par(
         _host.B.Dual.Drive(b));
     if (_host.HasCE)
         action = action.Par(_host.CE.Dual.Stick<StdLogic>('1'));
     if (_host.HasSCLR)
         action = action.Par(_host.SCLR.Dual.Stick<StdLogic>('0'));
     if (_host.HasBypass)
         action = action.Par(_host.BYPASS.Dual.Stick<StdLogic>(_host.BypassSense == ESense.ActiveHigh ? StdLogic._0 : StdLogic._1));
     if (_host.HasCarryIn)
         action = action.Par(_host.C_in.Dual.Stick<StdLogic>('0'));
     if (_host.AddMode == EAddMode.AddSubtract)
         action = action.Par(_host.ADD.Dual.Stick<StdLogic>('1'));
     if (_host.Latency == 0)
     {
         action = action.Par(r.Comb.Connect(_host.S.Dual.AsSignalSource()));
         yield return Verb(ETVMode.Locked, action);
     }
     else
     {
         yield return Verb(ETVMode.Locked, action);
         for (int i = 1; i < _host.Latency; i++)
             yield return Verb(ETVMode.Shared);
         yield return Verb(ETVMode.Shared, r.Comb.Connect(_host.S.Dual.AsSignalSource()));
     }
 }
예제 #2
0
            public IEnumerable <TAVerb> LShift(ISignalSource <StdLogicVector> x, ISignalSource <StdLogicVector> s, ISignalSink <StdLogicVector> y)
            {
                if (_host.PipelineDepth == 0)
                {
                    yield return(Verb(ETVMode.Locked,
                                      _host.X.Dual.Drive(x),
                                      _host.Shift.Dual.Drive(s),
                                      _host.Dir.Dual.Stick("0"),
                                      y.Comb.Connect(_host.Y.Dual.AsSignalSource())));
                }
                else
                {
                    yield return(Verb(ETVMode.Locked,
                                      _host.X.Dual.Drive(x),
                                      _host.Shift.Dual.Drive(s),
                                      _host.Dir.Dual.Stick("0")));

                    for (int i = 0; i < _host.PipelineDepth; i++)
                    {
                        yield return(Verb(ETVMode.Shared));
                    }
                    yield return(Verb(ETVMode.Shared,
                                      y.Comb.Connect(_host.Y.Dual.AsSignalSource())));
                }
            }
예제 #3
0
 public IEnumerable <TAVerb> BranchIfNot(ISignalSource <StdLogicVector> cond, BranchLabel target)
 {
     yield return(Verb(ETVMode.Locked,
                       _brAltFlagP.Drive(SignalSource.Create <StdLogicVector>("0")),
                       _brAltFlagN.Drive(cond),
                       GetStateDriver(target)));
 }
예제 #4
0
            public IEnumerable <TAVerb> Multiply(ISignalSource <StdLogicVector> a, ISignalSource <StdLogicVector> b, ISignalSink <StdLogicVector> r)
            {
                IProcess action = _host.A.Dual.Drive(a).Par(
                    _host.B.Dual.Drive(b));

                if (_host.HasCE)
                {
                    action = action.Par(_host.CE.Dual.Stick <StdLogic>('1'));
                }
                if (_host.HasSCLR)
                {
                    action = action.Par(_host.SCLR.Dual.Stick <StdLogic>('0'));
                }
                if (_host.PipeStages == 0)
                {
                    action = action.Par(r.Comb.Connect(_host.P.Dual.AsSignalSource()));
                    yield return(Verb(ETVMode.Locked, action));
                }
                else
                {
                    yield return(Verb(ETVMode.Locked, action));

                    for (int i = 1; i < _host.PipeStages; i++)
                    {
                        yield return(Verb(ETVMode.Shared));
                    }
                    yield return(Verb(ETVMode.Shared, r.Comb.Connect(_host.P.Dual.AsSignalSource())));
                }
            }
예제 #5
0
            public IEnumerable <TAVerb> Divide(ISignalSource <StdLogicVector> dividend, ISignalSource <StdLogicVector> divisor,
                                               ISignalSink <StdLogicVector> quotient, ISignalSink <StdLogicVector> fractional)
            {
                IProcess ctrl =
                    _host.DIVIDEND.Dual.Drive(dividend).Par(
                        _host.DIVISOR.Dual.Drive(divisor));

                if (_host.HasCE)
                {
                    ctrl = ctrl.Par(_host.CE.Dual.Stick('1'));
                }
                if (_host.HasSCLR)
                {
                    ctrl = ctrl.Par(_host.SCLR.Dual.Stick('0'));
                }
                if (_host.HasND)
                {
                    ctrl = ctrl.Par(_host.ND.Dual.Stick('1'));
                }
                for (int i = 0; i < _host.ClocksPerDivision; i++)
                {
                    yield return(Verb(ETVMode.Locked, ctrl));
                }
                for (int i = _host.ClocksPerDivision; i < _host.Latency; i++)
                {
                    yield return(Verb(ETVMode.Shared));
                }
                yield return(Verb(ETVMode.Shared,
                                  quotient.Comb.Connect(_host.QUOTIENT.Dual.AsSignalSource()),
                                  fractional.Comb.Connect(_host.FRACTIONAL.Dual.AsSignalSource())));
            }
예제 #6
0
            public override void Init(object[] argumentObjects)
            {
                Router router = argumentObjects[0] as Router;

                if (router == null)
                {
                    CurrentValue = "?";
                    return;
                }

                output = router.GetOutput((int)argumentObjects[1]);
                if (output == null)
                {
                    CurrentValue = "?";
                    return;
                }
                output.CurrentSourceChanged += currentSourceChangedHandler;

                labelset = argumentObjects[2] as Labelset;
                if (labelset == null)
                {
                    CurrentValue = "?";
                    return;
                }
                labelset.LabelTextChanged += labelsetTextChangedHandler;

                currentSource = output.CurrentSource;
                if (currentSource == null)
                {
                    CurrentValue = "?";
                    return;
                }
                CurrentValue = labelset.GetLabel(currentSource).Text ?? "?";
            }
예제 #7
0
 public DrivingProcess(ISignal drivenSignal, ISignalSource source)
 {
     DrivenSignal  = drivenSignal;
     Source        = source;
     Operation     = () => DrivenSignal.NextObject = source.Operation();
     DrivenSignals = new ISignal[] { drivenSignal };
 }
예제 #8
0
 public IEnumerable <TAVerb> Neg(ISignalSource <StdLogicVector> operand, ISignalSink <StdLogicVector> result)
 {
     if (_host.Operation != EOperation.Neg)
     {
         throw new NotSupportedException();
     }
     return(Do(operand, result));
 }
예제 #9
0
 public IEnumerable<TAVerb> Concat(ISignalSource<StdLogicVector>[] ops, ISignalSink<StdLogicVector> r)
 {
     IProcess[] actions = new IProcess[_host.NumWords + 1];
     for (int i = 0; i < _host.NumWords; i++)
         actions[i] = _host.Ops[i].Drive(ops[i]);
     actions[_host.NumWords] = r.Comb.Connect(_host.R.Dual.AsSignalSource());
     yield return Verb(ETVMode.Locked, actions);
 }
예제 #10
0
 private void sourcesRegisteredSourceSignalNameChanged(ISignalSource signal, string newName, List <object> recursionChain = null)
 {
     if (recursionChain?.Contains(this) == true)
     {
         return;
     }
     RegisteredSourceSignalNameChanged?.Invoke(this, newName, recursionChain.ExtendRecursionChain(this));
 }
예제 #11
0
파일: MUX2.cs 프로젝트: cephdon/systemsharp
 public IEnumerable <TAVerb> Select(ISignalSource <StdLogicVector> a, ISignalSource <StdLogicVector> b,
                                    ISignalSource <StdLogicVector> sel, ISignalSink <StdLogicVector> r)
 {
     yield return(Verb(ETVMode.Locked,
                       _host.A.Dual.Drive(a),
                       _host.B.Dual.Drive(b),
                       _host.Sel.Dual.Drive(sel),
                       r.Comb.Connect(_host.R.Dual.AsSignalSource())));
 }
 public BidirectionalPassthroughSignalTally(ISignalSource parentSignalSource)
 {
     ParentSignalSource       = parentSignalSource;
     tallyState               = new PassthroughSignalTallyState(ParentSignalSource);
     tallyReceiver            = new PassthroughSignalTallyReceiver();
     tallyState.StateChanged += tallyStateChanged;
     tallyReceiver.Got       += (r, rc) => Got?.Invoke(r, rc);
     tallyReceiver.Revoked   += (r, rc) => Revoked?.Invoke(r, rc);
 }
예제 #13
0
 private void currentSourceChangedHandler(ISignalDestination signalDestination, ISignalSource newSource)
 {
     if (signalDestination != output)
     {
         return;
     }
     currentSource = newSource;
     CurrentValue  = labelset.GetLabel(currentSource).Text ?? "?";
 }
예제 #14
0
            public IEnumerable <TAVerb> StelemFixAFixI(ISignalSource <StdLogicVector> data, long[] indices)
            {
                Contract.Requires(NeedWriteAccess);

                yield return(Verb(ETVMode.Locked,
                                  _wrEnI.Stick(StdLogic._1),
                                  _addrI.Stick(StdLogicVector.FromULong((ulong)indices[0], _addrBits)),
                                  _dataInI.Drive(data)));
            }
예제 #15
0
 public IEnumerable<TAVerb> Select(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, 
     ISignalSource<StdLogicVector> sel, ISignalSink<StdLogicVector> r)
 {
     yield return Verb(ETVMode.Locked,
         _host.A.Dual.Drive(a),
         _host.B.Dual.Drive(b),
         _host.Sel.Dual.Drive(sel),
         r.Comb.Connect(_host.R.Dual.AsSignalSource()));
 }
예제 #16
0
            public IEnumerable <TAVerb> StelemFixA(ISignalSource <StdLogicVector> addr,
                                                   ISignalSource <StdLogicVector> data)
            {
                Contract.Requires(NeedWriteAccess);

                yield return(Verb(ETVMode.Locked,
                                  _wrEnI.Stick(StdLogic._1),
                                  _addrI.Drive(addr),
                                  _dataInI.Drive(data)));
            }
        private void OnTriggerEnter(Collider other)
        {
            ISignalSource source = other.GetComponent <ISignalSource>();

            if (source != null && !signals.Contains(source))
            {
                signals.Add(source);
                foreach (Activateable activateable in activateables)
                {
                    activateable.Activate(source);
                }
            }
        }
        private void OnTriggerExit(Collider other)
        {
            ISignalSource source = other.GetComponent <ISignalSource>();

            if (source != null)
            {
                signals.Remove(source);
                foreach (Activateable activateable in activateables)
                {
                    activateable.Deactivate(source);
                }
            }
        }
예제 #19
0
 public IEnumerable<TAVerb> Slice(ISignalSource<StdLogicVector> data, ISignalSink<StdLogicVector> result)
 {
     if (result.Sync != null)
     {
         yield return Verb(ETVMode.Locked, _host.DIn.Dual.Drive(data));
         yield return Verb(ETVMode.Locked, result.Comb.Connect(_host.DOut.Dual.AsSignalSource()));
     }
     else if (result.Comb != null)
     {
         yield return Verb(ETVMode.Locked, 
             _host.DIn.Dual.Drive(data),
             result.Comb.Connect(_host.DOut.Dual.AsSignalSource()));
     }
 }
예제 #20
0
            public IEnumerable <TAVerb> Slice(ISignalSource <StdLogicVector> data, ISignalSink <StdLogicVector> result)
            {
                if (result.Sync != null)
                {
                    yield return(Verb(ETVMode.Locked, _host.DIn.Dual.Drive(data)));

                    yield return(Verb(ETVMode.Locked, result.Comb.Connect(_host.DOut.Dual.AsSignalSource())));
                }
                else if (result.Comb != null)
                {
                    yield return(Verb(ETVMode.Locked,
                                      _host.DIn.Dual.Drive(data),
                                      result.Comb.Connect(_host.DOut.Dual.AsSignalSource())));
                }
            }
        public static IBidirectionalSignalTally GetTally(this ISignalSource signalSource, SignalTallyColor color)
        {
            switch (color)
            {
            case SignalTallyColor.Red:
                return(signalSource.RedTally);

            case SignalTallyColor.Yellow:
                return(signalSource.YellowTally);

            case SignalTallyColor.Green:
                return(signalSource.GreenTally);
            }
            return(null);
        }
예제 #22
0
            public IEnumerable <TAVerb> BranchIfNot(ISignalSource <StdLogicVector> cond, BranchLabel target)
            {
                yield return(Verb(ETVMode.Locked,
                                  _host.BrP.Dual.Drive(SignalSource.Create <StdLogicVector>("0")),
                                  _host.BrN.Dual.Drive(cond),
                                  _host.AltAddr.Dual.Drive(
                                      SignalSource.Create(
                                          StdLogicVector.FromUInt(
                                              (uint)target.CStep, _host.AddrWidth)))));

                for (int i = 1; i < _host.Latency; i++)
                {
                    yield return(NopVerb());
                }
            }
예제 #23
0
 private IEnumerable<TAVerb> Do(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result)
 {
     if (_host.PipelineDepth == 0)
     {
         yield return new TAVerb(this, ETVMode.Locked, () => { },
             _host.DIn.Dual.Drive(operand).Par(result.Comb.Connect(_host.DOut.Dual.AsSignalSource())));
     }
     else
     {
         yield return new TAVerb(this, ETVMode.Locked, () => { },
             _host.DIn.Dual.Drive(operand));
         for (int i = 1; i < _host.PipelineDepth; i++)
             yield return new TAVerb(this, ETVMode.Shared, () => { });
         yield return new TAVerb(this, ETVMode.Shared, () => { }, result.Comb.Connect(_host.DOut.Dual.AsSignalSource()));
     }
 }
예제 #24
0
            public IEnumerable <TAVerb> Write(ISignalSource <StdLogicVector> data)
            {
                var fref = _literal as FieldRef;

                if (fref != null)
                {
                    if (!fref.FieldDesc.IsWrittenInCurrentContext(Host.Context))
                    {
                        throw new InvalidOperationException("Field is marked as not being written");
                    }
                }

                yield return(Verb(ETVMode.Locked,
                                  _wrEnI.Stick(StdLogic._1),
                                  _dataInI.Drive(data)));
            }
예제 #25
0
        ///<inheritdoc/>
        public override void Activate(ISignalSource source)
        {
            if (TargetTeam != Teams.Both && TargetTeam != source.Team)
            {
                return;
            }

            if (!signals.Contains(source))
            {
                signals.Add(source);
            }

            if (Active && once)
            {
                done = true;
            }
        }
예제 #26
0
 public IEnumerable<TAVerb> Abs(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result)
 {
     if (_host.Latency == 0)
     {
         yield return Verb(ETVMode.Locked,
             _host.Operand.Dual.Drive(operand),
             result.Comb.Connect(_host.Result.Dual.AsSignalSource()));
     }
     else
     {
         yield return Verb(ETVMode.Locked,
             _host.Operand.Dual.Drive(operand));
         for (int i = 1; i < _host.Latency; i++)
             yield return Verb(ETVMode.Shared);
         yield return Verb(ETVMode.Shared,
             result.Comb.Connect(_host.Result.Dual.AsSignalSource()));
     }
 }
예제 #27
0
            private IEnumerable <TAVerb> Do(ISignalSource <StdLogicVector> operand, ISignalSink <StdLogicVector> result)
            {
                if (_host.PipelineDepth == 0)
                {
                    yield return(new TAVerb(this, ETVMode.Locked, () => { },
                                            _host.DIn.Dual.Drive(operand).Par(result.Comb.Connect(_host.DOut.Dual.AsSignalSource()))));
                }
                else
                {
                    yield return(new TAVerb(this, ETVMode.Locked, () => { },
                                            _host.DIn.Dual.Drive(operand)));

                    for (int i = 1; i < _host.PipelineDepth; i++)
                    {
                        yield return(new TAVerb(this, ETVMode.Shared, () => { }));
                    }
                    yield return(new TAVerb(this, ETVMode.Shared, () => { }, result.Comb.Connect(_host.DOut.Dual.AsSignalSource())));
                }
            }
예제 #28
0
파일: LERP.cs 프로젝트: cephdon/systemsharp
 public IEnumerable <TAVerb> Cos(ISignalSource <StdLogicVector> x, ISignalSink <StdLogicVector> y)
 {
     if (_host.Latency == 0)
     {
         yield return(new TAVerb(this, ETVMode.Locked, () => { },
                                 _host.X.Dual.Drive(x).Par(y.Comb.Connect(_host.Cos.Dual.AsSignalSource()))));
     }
     else
     {
         for (int i = 0; i < _host.InitiationInterval; i++)
         {
             yield return(new TAVerb(this, ETVMode.Locked, () => { }, _host.X.Dual.Drive(x)));
         }
         for (int i = _host.InitiationInterval; i < _host.Latency; i++)
         {
             yield return(new TAVerb(this, ETVMode.Shared, () => { }));
         }
         yield return(new TAVerb(this, ETVMode.Shared, () => { }, y.Comb.Connect(_host.Cos.Dual.AsSignalSource())));
     }
 }
예제 #29
0
            public IEnumerable <TAVerb> Add(ISignalSource <StdLogicVector> a, ISignalSource <StdLogicVector> b, ISignalSink <StdLogicVector> r)
            {
                IProcess action = _host.A.Dual.Drive(a).Par(
                    _host.B.Dual.Drive(b));

                if (_host.HasCE)
                {
                    action = action.Par(_host.CE.Dual.Stick <StdLogic>('1'));
                }
                if (_host.HasSCLR)
                {
                    action = action.Par(_host.SCLR.Dual.Stick <StdLogic>('0'));
                }
                if (_host.HasBypass)
                {
                    action = action.Par(_host.BYPASS.Dual.Stick <StdLogic>(_host.BypassSense == ESense.ActiveHigh ? StdLogic._0 : StdLogic._1));
                }
                if (_host.HasCarryIn)
                {
                    action = action.Par(_host.C_in.Dual.Stick <StdLogic>('0'));
                }
                if (_host.AddMode == EAddMode.AddSubtract)
                {
                    action = action.Par(_host.ADD.Dual.Stick <StdLogic>('1'));
                }
                if (_host.Latency == 0)
                {
                    action = action.Par(r.Comb.Connect(_host.S.Dual.AsSignalSource()));
                    yield return(Verb(ETVMode.Locked, action));
                }
                else
                {
                    yield return(Verb(ETVMode.Locked, action));

                    for (int i = 1; i < _host.Latency; i++)
                    {
                        yield return(Verb(ETVMode.Shared));
                    }
                    yield return(Verb(ETVMode.Shared, r.Comb.Connect(_host.S.Dual.AsSignalSource())));
                }
            }
예제 #30
0
            public IEnumerable <TAVerb> LdelemFixA(ISignalSource <StdLogicVector> addr,
                                                   ISignalSink <StdLogicVector> data)
            {
                if (_wrEnI != null)
                {
                    // Memory used as RAM

                    yield return(Verb(ETVMode.Locked,
                                      _wrEnI.Stick(StdLogic._0),
                                      _addrI.Drive(addr),
                                      _dataInI.Stick(StdLogicVector._0s(_dataBits))));
                }
                else
                {
                    // Memory used as ROM

                    yield return(Verb(ETVMode.Locked, _addrI.Drive(addr)));
                }
                yield return(Verb(ETVMode.Shared,
                                  data.Comb.Connect(_dataOutI.AsSignalSource <StdLogicVector>())));
            }
예제 #31
0
            public IEnumerable <TAVerb> Abs(ISignalSource <StdLogicVector> operand, ISignalSink <StdLogicVector> result)
            {
                if (_host.Latency == 0)
                {
                    yield return(Verb(ETVMode.Locked,
                                      _host.Operand.Dual.Drive(operand),
                                      result.Comb.Connect(_host.Result.Dual.AsSignalSource())));
                }
                else
                {
                    yield return(Verb(ETVMode.Locked,
                                      _host.Operand.Dual.Drive(operand)));

                    for (int i = 1; i < _host.Latency; i++)
                    {
                        yield return(Verb(ETVMode.Shared));
                    }
                    yield return(Verb(ETVMode.Shared,
                                      result.Comb.Connect(_host.Result.Dual.AsSignalSource())));
                }
            }
예제 #32
0
        public virtual void AssignSource(ISignalSource source)
        {
            ISignalSource oldSource = currentSource;

            if (currentSource != null)
            {
                currentSource.RegisteredSourceSignalChanged     -= sourcesRegisteredSourceSignalChanged;
                currentSource.RegisteredSourceSignalNameChanged -= sourcesRegisteredSourceSignalNameChanged;
            }

            currentSource = source;
            if (currentSource != null)
            {
                currentSource.RegisteredSourceSignalChanged     += sourcesRegisteredSourceSignalChanged;
                currentSource.RegisteredSourceSignalNameChanged += sourcesRegisteredSourceSignalNameChanged;
            }

            CurrentSourceChanged?.Invoke(this, source);

            ISignalSourceRegistered currentRegisteredSourceSignal = currentSource?.RegisteredSourceSignal;
            ISignalSourceRegistered oldRegisteredSourceSignal     = oldSource?.RegisteredSourceSignal;

            if (currentRegisteredSourceSignal != oldRegisteredSourceSignal)
            {
                RegisteredSourceSignalChanged?.Invoke(this, currentRegisteredSourceSignal, RecursionChainHelpers.CreateRecursionChain(this));
            }

            string currentRegisteredSourceSignalName = currentRegisteredSourceSignal?.RegisteredSourceSignalName;
            string oldRegisteredSourceSignalName     = oldRegisteredSourceSignal?.RegisteredSourceSignalName;

            if (!string.Equals(currentRegisteredSourceSignalName, oldRegisteredSourceSignalName))
            {
                RegisteredSourceSignalNameChanged?.Invoke(this, currentRegisteredSourceSignalName, RecursionChainHelpers.CreateRecursionChain(this));
            }

            ((BidirectionalPassthroughSignalTally)RedTally).PreviousElement    = source?.RedTally;
            ((BidirectionalPassthroughSignalTally)YellowTally).PreviousElement = source?.YellowTally;
            ((BidirectionalPassthroughSignalTally)GreenTally).PreviousElement  = source?.GreenTally;
        }
        private void btnSigOpen_Click(object sender, RoutedEventArgs e)
        {
            SignalSourceType type = (SignalSourceType)(this.cmbSigType.SelectedIndex);
            string           addr = this.tbSigAddr.Text;

            if (!isSignalSourceConnected)
            {
                signalSource            = SignalSource.GetInstance(type);
                isSignalSourceConnected = signalSource.Connect(addr);
                if (isSignalSourceConnected)
                {
                    this.btnSigOpen.Background = sucessColor;
                }
                else
                {
                    this.btnSigOpen.Background = normalColor;
                }
            }
            else
            {
                this.btnSigOpen.Background = sucessColor;
            }
        }
예제 #34
0
 public IEnumerable<TAVerb> LShift(ISignalSource<StdLogicVector> x, ISignalSource<StdLogicVector> s, ISignalSink<StdLogicVector> y)
 {
     if (_host.PipelineDepth == 0)
     {
         yield return Verb(ETVMode.Locked,
             _host.X.Dual.Drive(x),
             _host.Shift.Dual.Drive(s),
             _host.Dir.Dual.Stick("0"),
             y.Comb.Connect(_host.Y.Dual.AsSignalSource()));
     }
     else
     {
         yield return Verb(ETVMode.Locked,
             _host.X.Dual.Drive(x),
             _host.Shift.Dual.Drive(s),
             _host.Dir.Dual.Stick("0"));
         for (int i = 0; i < _host.PipelineDepth; i++)
         {
             yield return Verb(ETVMode.Shared);
         }
         yield return Verb(ETVMode.Shared,
             y.Comb.Connect(_host.Y.Dual.AsSignalSource()));
     }
 }
예제 #35
0
 public IEnumerable<TAVerb> Do(ISignalSource<StdLogicVector> a, ISignalSink<StdLogicVector> r)
 {
     if (_host.PipelineDepth == 0)
     {
         yield return Verb(ETVMode.Locked,
             _host.A.Dual.Drive(a)
                 .Par(r.Comb.Connect(_host.R.Dual.AsSignalSource())));
     }
     else
     {
         yield return Verb(ETVMode.Locked,
             _host.A.Dual.Drive(a));
         for (int i = 1; i < _host.PipelineDepth; i++)
         {
             yield return Verb(ETVMode.Shared);
         }
         yield return Verb(ETVMode.Shared,
             r.Comb.Connect(_host.R.Dual.AsSignalSource()));
     }
 }
예제 #36
0
 public override IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _host.TASite.Concat(operands, results[0]);
 }
예제 #37
0
 public IEnumerable<TAVerb> Mod1(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result)
 {
     yield return Verb(ETVMode.Locked,
         _host.X.Dual.Drive(operand),
         result.Comb.Connect(_host.R.Dual.AsSignalSource()));
 }
예제 #38
0
            public IEnumerable<TAVerb> Write(ISignalSource<StdLogicVector> data)
            {
                var fref = _literal as FieldRef;
                if (fref != null)
                {
                    if (!fref.FieldDesc.IsWrittenInCurrentContext(Host.Context))
                        throw new InvalidOperationException("Field is marked as not being written");
                }

                yield return Verb(ETVMode.Locked,
                    _wrEnI.Stick(StdLogic._1),
                    _dataInI.Drive(data));
            }
예제 #39
0
 public IEnumerable <TAVerb> Sign(ISignalSource <StdLogicVector> operand, ISignalSink <StdLogicVector> result)
 {
     yield return(Verb(ETVMode.Locked,
                       _host.DIn.Dual.Drive(operand),
                       result.Comb.Connect(_host.DOut.Dual.AsSignalSource())));
 }
예제 #40
0
            public IEnumerable<TAVerb> IsGt(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> r)
            {
                if (_host.FuncSel != EFunction.Compare)
                    throw new InvalidOperationException();

                return Do(a, b, _host.CmpGt.Dual, r);
            }
예제 #41
0
            public IEnumerable<TAVerb> IsGt(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> result)
            {
                if (_host.Function != EFunction.Compare)
                    throw new InvalidOperationException();

                if (_host.CompareSel == ECompareOp.Programmable)
                    return DoBinOp1("100100", a, b, result);
                else if (_host.CompareSel == ECompareOp.GreaterThan)
                    return DoBinOp1(a, b, result);
                else if (_host.CompareSel == ECompareOp.ConditionCode)
                    throw new NotImplementedException();
                else
                    throw new NotSupportedException("Comparison mode not supported");
            }
예제 #42
0
 public override IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _site.Id(operands[0], results[0]);
 }
예제 #43
0
            public IEnumerable<TAVerb> Div(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> result)
            {
                if (_host.Function != EFunction.Divide)
                    throw new InvalidOperationException();

                return DoBinOp(a, b, result);
            }
예제 #44
0
 public IEnumerable<TAVerb> Id(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result)
 {
     yield return Verb(ETVMode.Shared, result.Comb.Connect(operand));
 }
예제 #45
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _fu.TASite.Abs(operands[0], results[0]);
 }
예제 #46
0
 public IEnumerable<TAVerb> DoBinOp1(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> result)
 {
     return DoBinOp1("000000", a, b, result);
 }
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     int i0 = _swap ? 1 : 0;
     int i1 = _swap ? 0 : 1;
     if (_isAdd)
         return _host.TASite.Add(operands[i0], operands[i1], results[0]);
     else
         return _host.TASite.Subtract(operands[i0], operands[i1], results[0]);
 }
예제 #48
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _taSite.Write(operands[0]);
 }
예제 #49
0
 public PassthroughSignalTallyState(ISignalSource parentSignalSource) => ParentSignalSource = parentSignalSource;
 /// <summary>
 /// Realizes the mapping for given operand sources and result sinks. You must override this method in derived classes.
 /// </summary>
 /// <param name="operands">operand sources</param>
 /// <param name="results">result sinks</param>
 /// <returns>a sequence of transaction verbs which represent the dataflows necessary to perform the mapping</returns>
 public abstract IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results);
예제 #51
0
 ///<inheritdoc/>
 public abstract void Deactivate(ISignalSource source);
예제 #52
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _site.Select(operands[1], operands[0], operands[2], results[0]);
 }
예제 #53
0
            public IEnumerable<TAVerb> Float2Float(ISignalSource<StdLogicVector> x, ISignalSink<StdLogicVector> result)
            {
                if (_host.Function != EFunction.FloatToFloat)
                    throw new InvalidOperationException();

                return DoUnOp(x, result);
            }
예제 #54
0
            public IEnumerable<TAVerb> DoUnOp(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result)
            {
                if (_host.Arity != 1)
                    throw new InvalidOperationException();

                IProcess pr = _host.A.Dual.Drive(operand);
                if (_host.HasOperationND)
                    pr = pr.Par(_host.OperationND.Dual.Drive(SignalSource.Create(StdLogic._1)));
                if (_host.HasSCLR)
                    pr = pr.Par(_host.OperationND.Dual.Drive(SignalSource.Create(StdLogic._0)));
                if (_host.HasCE)
                    pr = pr.Par(_host.OperationND.Dual.Drive(SignalSource.Create(StdLogic._1)));
                var rpr = result.Comb.Connect(_host.Result.Dual.AsSignalSource());
                if (_host.Latency == 0)
                {
                    pr = pr.Par(rpr);
                    yield return Verb(ETVMode.Locked, pr);
                }
                else
                {
                    for (int i = 0; i < _host.CyclesPerOperation; i++)
                        yield return Verb(ETVMode.Locked, pr);
                    for (int i = _host.CyclesPerOperation; i < _host.Latency; i++)
                        yield return Verb(ETVMode.Shared);
                    yield return Verb(ETVMode.Shared, rpr);
                }
            }
예제 #55
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     if (results.Length == 1)
         return _host.TASite.Divide(operands[0], operands[1], results[0]);
     else
         return _host.TASite.Divide(operands[0], operands[1], results[0], results[1]);
 }
예제 #56
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _site.Nop(_latency);
 }
예제 #57
0
 public IEnumerable<TAVerb> Divide(ISignalSource<StdLogicVector> dividend, ISignalSource<StdLogicVector> divisor, 
     ISignalSink<StdLogicVector> quotient)
 {
     IProcess ctrl =
         _host.DIVIDEND.Dual.Drive(dividend).Par(
         _host.DIVISOR.Dual.Drive(divisor));
     if (_host.HasCE)
         ctrl = ctrl.Par(_host.CE.Dual.Stick('1'));
     if (_host.HasSCLR)
         ctrl = ctrl.Par(_host.SCLR.Dual.Stick('0'));
     if (_host.HasND)
         ctrl = ctrl.Par(_host.ND.Dual.Stick('1'));
     for (int i = 0; i < _host.ClocksPerDivision; i++)
         yield return Verb(ETVMode.Locked, ctrl);
     for (int i = _host.ClocksPerDivision; i < _host.Latency; i++)
         yield return Verb(ETVMode.Shared);
     yield return Verb(ETVMode.Shared, quotient.Comb.Connect(_host.QUOTIENT.Dual.AsSignalSource()));
 }
예제 #58
0
            private IEnumerable<TAVerb> DoBinOp1(StdLogicVector op, ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> result)
            {
                if (_host.Arity != 2)
                    throw new InvalidOperationException();

                IProcess pr = _host.A.Dual.Drive(a)
                    .Par(_host.B.Dual.Drive(b));
                if ((_host.Function == EFunction.AddSubtract && _host.AddSubSel == EAddSub.Both) ||
                    (_host.Function == EFunction.Compare && _host.CompareSel == ECompareOp.Programmable))
                    pr = pr.Par(_host.Operation.Dual.Drive(SignalSource.Create(op)));
                if (_host.HasOperationND)
                    pr = pr.Par(_host.OperationND.Dual.Drive(SignalSource.Create(StdLogic._1)));
                if (_host.HasSCLR)
                    pr = pr.Par(_host.OperationND.Dual.Drive(SignalSource.Create(StdLogic._0)));
                if (_host.HasCE)
                    pr = pr.Par(_host.OperationND.Dual.Drive(SignalSource.Create(StdLogic._1)));

                var rpr = result.Comb.Connect(((SLVSignal)_host.Result)[0, 0].AsSignalSource());
                if (_host.Latency == 0)
                {
                    pr = pr.Par(rpr);
                    yield return Verb(ETVMode.Locked, pr);
                }
                else
                {
                    for (int i = 0; i < _host.CyclesPerOperation; i++)
                        yield return Verb(ETVMode.Locked, pr);
                    for (int i = _host.CyclesPerOperation; i < _host.Latency; i++)
                        yield return Verb(ETVMode.Shared);
                    yield return Verb(ETVMode.Shared, rpr);
                }

            }
예제 #59
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     if (_swap)
         return _realize(new ISignalSource<StdLogicVector>[] { operands[1], operands[0] }, results);
     else
         return _realize(operands, results);
 }
예제 #60
0
            public IEnumerable<TAVerb> Sub(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> result)
            {
                if (_host.Function != EFunction.AddSubtract)
                    throw new InvalidOperationException();

                switch (_host.AddSubSel)
                {
                    case EAddSub.Subtract:
                        return DoBinOp(a, b, result);

                    case EAddSub.Both:
                        return DoBinOp("000001", a, b, result);

                    case EAddSub.Add:
                        throw new NotSupportedException("Xilinx floating-point core is configured for addition. Subtraction not supported");

                    default:
                        throw new NotImplementedException();
                }
            }