Example #1
0
 /// <summary>
 /// Returns a transaction which loads a constant to the specified signal sink.
 /// </summary>
 /// <param name="target">signal sink to receive constant</param>
 public IEnumerable<TAVerb> LoadConstant(ISignalSink<StdLogicVector> target)
 {
     if (_constSignal != null)
         yield return Verb(ETVMode.Shared, target.Comb.Connect(_constSignal.AsSignalSource<StdLogicVector>()));
     else
         yield return Verb(ETVMode.Shared, target.Comb.Connect(SignalSource.Create(_constValue)));
 }
 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()));
     }
 }
Example #3
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);
 }
Example #4
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())));
 }
Example #5
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()));
 }
Example #6
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));
 }
Example #7
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()));
     }
 }
Example #8
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())));
                }
            }
Example #9
0
            public IEnumerable <TAVerb> Read(ISignalSink <StdLogicVector> dest)
            {
                var fref = _literal as FieldRef;

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

                yield return(Verb(ETVMode.Shared,
                                  dest.Comb.Connect(_dataOutI.AsSignalSource <StdLogicVector>())));
            }
Example #10
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()));
     }
 }
Example #11
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()));
     }
 }
Example #12
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())));
                }
            }
Example #13
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()));
     }
 }
Example #14
0
 public IEnumerable<TAVerb> Id(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result)
 {
     yield return Verb(ETVMode.Shared, result.Comb.Connect(operand));
 }
Example #15
0
 public override IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _host.TASite.Concat(operands, results[0]);
 }
Example #16
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _fu.TASite.Abs(operands[0], results[0]);
 }
Example #17
0
 public void AddSink(ISignalSink sink)
 {
     sinks.Add(sink);
     sinkBuffers = new float[sinks.Count][];
 }
Example #18
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()));
 }
Example #19
0
 public void RemoveSink(ISignalSink sink)
 {
     sinks.Remove(sink);
     sinkBuffers = new float[sinks.Count][];
 }
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _taSite.Write(operands[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);
            }
            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();
                }
            }
 public IEnumerable<TAVerb> DoBinOp1(ISignalSource<StdLogicVector> a, ISignalSource<StdLogicVector> b, ISignalSink<StdLogicVector> result)
 {
     return DoBinOp1("000000", a, b, result);
 }
            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);
                }

            }
            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);
                }
            }
Example #26
0
 public IEnumerable <TAVerb> Id(ISignalSource <StdLogicVector> operand, ISignalSink <StdLogicVector> result)
 {
     yield return(Verb(ETVMode.Shared, result.Comb.Connect(operand)));
 }
Example #27
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _site.Nop(_latency);
 }
            public IEnumerable<TAVerb> Read(ISignalSink<StdLogicVector> dest)
            {
                var fref = _literal as FieldRef;
                if (fref != null)
                {
                    if (!fref.FieldDesc.IsReadInCurrentContext(Host.Context))
                        throw new InvalidOperationException("Field is marked as not being read");
                }

                yield return Verb(ETVMode.Shared,
                    dest.Comb.Connect(_dataOutI.AsSignalSource<StdLogicVector>()));
            }
            public IEnumerable<TAVerb> Float2Float(ISignalSource<StdLogicVector> x, ISignalSink<StdLogicVector> result)
            {
                if (_host.Function != EFunction.FloatToFloat)
                    throw new InvalidOperationException();

                return DoUnOp(x, 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]);
 }
Example #31
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);
            }
Example #32
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]);
 }
Example #33
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()));
     }
 }
Example #34
0
 public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _site.Select(operands[1], operands[0], operands[2], results[0]);
 }
Example #35
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);
 }
            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())));
                }
            }
 /// <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);
            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");
            }
Example #39
0
 public override IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results)
 {
     return _site.Id(operands[0], results[0]);
 }