/// <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())); } }
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); }
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 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 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)); }
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 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 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>()))); }
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())); } }
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())); } }
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()))); } }
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())); } }
public IEnumerable<TAVerb> Id(ISignalSource<StdLogicVector> operand, ISignalSink<StdLogicVector> result) { yield return Verb(ETVMode.Shared, result.Comb.Connect(operand)); }
public override IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results) { return _host.TASite.Concat(operands, results[0]); }
public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results) { return _fu.TASite.Abs(operands[0], results[0]); }
public void AddSink(ISignalSink sink) { sinks.Add(sink); sinkBuffers = new float[sinks.Count][]; }
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())); }
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); } }
public IEnumerable <TAVerb> Id(ISignalSource <StdLogicVector> operand, ISignalSink <StdLogicVector> result) { yield return(Verb(ETVMode.Shared, result.Comb.Connect(operand))); }
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]); }
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); }
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]); }
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())); } }
public IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results) { return _site.Select(operands[1], operands[0], operands[2], results[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"); }
public override IEnumerable<TAVerb> Realize(ISignalSource<StdLogicVector>[] operands, ISignalSink<StdLogicVector>[] results) { return _site.Id(operands[0], results[0]); }