예제 #1
0
 private void MakeVectors(int value1, int width1, int value2, int width2,
     out StdLogicVector r1, out StdLogicVector r2)
 {
     StdLogicVector v1 = StdLogicVector.FromLong(value1, width1);
     StdLogicVector v2 = StdLogicVector.FromLong(value2, width2);
     StdLogicVector v = v1.Concat(v2).Concat(StdLogicVector._0s(2 * MaxWidth - width1 - width2));
     r1 = v[2 * MaxWidth - 1, MaxWidth];
     r2 = v[MaxWidth - 1, 0];
 }
예제 #2
0
 private StdLogicVector CreateVector()
 {
     StdLogicVector[] r = new StdLogicVector[4];
     r[0] = StdLogicVector._0s(MaxWidth);
     r[1] = StdLogicVector._1s(MaxWidth);
     r[2] = StdLogicVector.DCs(MaxWidth);
     r[3] = StdLogicVector.Xs(MaxWidth);
     return r[0].Concat(r[1].Concat(r[2].Concat(r[3])));
 }
예제 #3
0
            public override IEnumerable <TAVerb> DoNothing()
            {
                if (_wrEnI != null)
                {
                    // Memory used as RAM

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

                    yield return(Verb(ETVMode.Locked,
                                      _addrI.Stick(StdLogicVector.DCs(_addrBits))));
                }
            }
예제 #4
0
        /// <summary>
        /// Replaces any don't-care symbol with the high-impedance symbol.
        /// </summary>
        public void ReplaceDontCaresByTriStates()
        {
            var allGraphs = _graphs.Concat(Enumerable.Repeat(_neutral, 1));

            foreach (FlowGraph g in allGraphs)
            {
                var pflow = g.ToFlow();
                foreach (Flow flow in pflow.Flows)
                {
                    if (IsDontCareFlow(flow))
                    {
                        var oflow = flow as ValueFlow;
                        var slv   = (StdLogicVector)oflow.Value;
                        var zslv  = StdLogicVector.Zs(slv.Size);
                        var nflow = new ValueFlow(zslv, flow.Target);
                        g.Add(nflow);
                    }
                }
            }
        }
예제 #5
0
 private async void StimulateAndTest()
 {
     for (int i = 0; i < 10; i++)
     {
         for (int j = 0; j < 10; j++)
         {
             _x.Next = StdLogicVector.FromInt(i, 32);
             _y.Next = StdLogicVector.FromInt(j, 32);
             while (_rdy.Cur != '0')
             {
                 await _rdy;
             }
             while (_rdy.Cur != '1')
             {
                 await _rdy;
             }
             Console.WriteLine("The GCD of " + i + " and " + j + " is " + _z.Cur.IntValue);
         }
     }
 }
예제 #6
0
            public override void Establish(IAutoBinder binder)
            {
                if (_realized)
                {
                    return;
                }

                _inSignals = _argWidths.Select((w, i) =>
                                               (SLVSignal)binder.GetSignal(EPortUsage.Default, "concat" + i, null,
                                                                           StdLogicVector.Us(w))).ToArray();
                int total = _argWidths.Sum();

                _outSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "concout", null, StdLogicVector.Us(total));
                var pb  = new ConcatProcessBuilder(this);
                var alg = pb.GetAlgorithm();

                alg.Name = "concatenize";
                binder.CreateProcess(Process.EProcessKind.Triggered, alg, _inSignals.Select(s => s.Descriptor).ToArray());
                _realized = true;
            }
예제 #7
0
        public override StdLogicVector[] SerializeInstance(object instance)
        {
            StdLogicVector plain = StdLogicVector.Serialize(instance);

            StdLogicVector[] result = new StdLogicVector[Size];
            for (int i = 0; i < (int)Size; i++)
            {
                int upper = (i + 1) * WordSize - 1;
                if (upper >= plain.Size)
                {
                    result[i] = StdLogicVector._0s(upper - plain.Size + 1).Concat(plain[plain.Size - 1, i * WordSize]);
                }
                else
                {
                    result[i] = plain[(i + 1) * WordSize - 1, i *WordSize];
                }
            }

            return(result);
        }
예제 #8
0
        private async void Computation()
        {
            await Tick;

            while (true)
            {
                ProgramFlow.DoNotUnroll();
                ProgramFlow.IOBarrier();
                Rdy.Next = '0';
                int x = X.Cur.IntValue;
                int y = Y.Cur.IntValue;
                int z;
                if (x == 0)
                {
                    z = y;
                }
                else
                {
                    while (y != 0)
                    {
                        ProgramFlow.DoNotUnroll();

                        if (x > y)
                        {
                            x -= y;
                        }
                        else
                        {
                            y -= x;
                        }
                    }
                    z = x;
                }
                Z.Next = StdLogicVector.FromInt(z, 32);
                await 63.Ticks();
                ProgramFlow.IOBarrier();
                Rdy.Next = '1';
                ProgramFlow.IOBarrier();
                await Tick;
            }
        }
예제 #9
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>())));
            }
예제 #10
0
            public IEnumerable <TAVerb> LdelemFixAFixI(ISignalSink <StdLogicVector> data, long[] indices)
            {
                if (_wrEnI != null)
                {
                    // Memory used as RAM

                    yield return(Verb(ETVMode.Locked,
                                      _wrEnI.Stick(StdLogic._0),
                                      _addrI.Stick(StdLogicVector.FromULong((ulong)indices[0], _addrBits)),
                                      _dataInI.Stick(StdLogicVector._0s(_dataBits))));
                }
                else
                {
                    // Memory used as ROM

                    yield return(Verb(ETVMode.Locked,
                                      _addrI.Stick(StdLogicVector.FromULong((ulong)indices[0], _addrBits))));
                }
                yield return(Verb(ETVMode.Shared,
                                  data.Comb.Connect(_dataOutI.AsSignalSource <StdLogicVector>())));
            }
예제 #11
0
        /// <summary>
        /// Returns a wire-level type for <paramref name="otype"/>.
        /// </summary>
        /// <exception cref="ArgumentNullException">If <paramref name="otype"/> is <c>null</c>.</exception>
        /// <exception cref="ArgumentException">If <paramref name="otype"/> is incomplete or is not convertible to a wire-level type.</exception>
        public TypeDescriptor GetWireType(TypeDescriptor otype)
        {
            Contract.Requires <ArgumentNullException>(otype != null, "otype");
            Contract.Requires <ArgumentException>(otype.IsUnconstrained || otype.IsComplete, "Incomplete type");

            TypeLoweringInfo tli;

            if (_tiLookup.TryGetValue(otype.CILType, out tli))
            {
                if (!tli.HasWireType)
                {
                    throw new ArgumentException("Not convertible to a wire type " + otype.Name);
                }
                return(tli.MakeWireType(otype));
            }
            else
            {
                MemoryLayout layout = Marshal.Layout(otype, HWMarshalInfo.Instance);
                return(TypeDescriptor.GetTypeOf(StdLogicVector._0s((long)layout.SizeInBits)));
            }
        }
예제 #12
0
        public Mod2TestDesign(int inIntWidth, int fracWidth, int outIntWidth)
        {
            _clk = new SLSignal();
            _x   = new SLVSignal(inIntWidth + fracWidth)
            {
                InitialValue = StdLogicVector._0s(inIntWidth + fracWidth)
            };
            _r = new SLVSignal(outIntWidth + fracWidth)
            {
                InitialValue = StdLogicVector._0s(outIntWidth + fracWidth)
            };

            _clkGen = new Clock(new Time(10.0, ETimeUnit.ns));
            Bind(() => _clkGen.Clk = _clk);

            _mod2 = new FixFPMod1(inIntWidth, fracWidth, outIntWidth)
            {
                X = _x,
                R = _r
            };
        }
예제 #13
0
        /// <summary>
        /// Checks whether a given dataflow transfers the don't care literal to its destination.
        /// </summary>
        /// <param name="flow">a dataflow</param>
        public static bool IsDontCareFlow(Flow flow)
        {
            ValueFlow vflow = flow as ValueFlow;

            if (vflow == null)
            {
                return(false);
            }
            StdLogicVector?slvdata = vflow.Value as StdLogicVector?;
            StdLogic?      sldata  = vflow.Value as StdLogic?;

            if (slvdata.HasValue)
            {
                return(slvdata.Value.Equals(StdLogicVector.DCs(slvdata.Value.Size)));
            }
            if (sldata.HasValue)
            {
                return(sldata.Value.Equals(StdLogic.DC));
            }
            return(false);
        }
예제 #14
0
        /// <summary>
        /// Constructs a new instance.
        /// </summary>
        /// <param name="mappedVariable">variable to be hardware-mapped</param>
        /// <param name="directFeed"><c>true</c>, if write-trough semantics hold, i.e. input is combinatorially routed to output during write access</param>
        public LocalStorageUnit(Variable mappedVariable, bool directFeed)
        {
            MappedVariable = mappedVariable;
            _directFeed    = directFeed;
            DataWidth      = (int)TypeLowering.Instance.GetWireType(mappedVariable.Type).Constraints[0].Size;
            StdLogicVector initial;

            if (mappedVariable.InitialValue == null)
            {
                initial = StdLogicVector._0s(TypeLowering.Instance.GetWireWidth(mappedVariable.Type));
            }
            else
            {
                initial = Marshal.SerializeForHW(mappedVariable.InitialValue);
            }
            _stg = new SLVSignal(DataWidth)
            {
                InitialValue = initial
            };
            _taSite = new LocalStorageUnitTransactionSite(this);
        }
예제 #15
0
        /// <summary>
        /// Converts <paramref name="src"/> to <paramref name="dstType"/> datatype, possibly with loss of precision or overflow.
        /// </summary>
        /// <remarks>Currently, conversions between all primitive numeric CIL types, enum types, and System#-intrinsic datatypes
        /// Signed, Unsigned, SFix, UFix and StdLogicVector are supported.</remarks>
        /// <exception cref="ArgumentNullException">if <paramref name="dstType"/> is null</exception>
        /// <exception cref="NotImplementedException">if there is no known conversion to <paramref name="dstType"/></exception>
        public static object ConvertUFix(UFix src, TypeDescriptor dstType)
        {
            Contract.Requires <ArgumentNullException>(dstType != null, "dstType");

            if (dstType.CILType.Equals(typeof(UFix)))
            {
                return(src.Resize(UFix.GetFormat(dstType).IntWidth, UFix.GetFormat(dstType).FracWidth));
            }
            else if (dstType.CILType.Equals(typeof(Unsigned)))
            {
                return(src.UnsignedValue.Resize(UFix.GetFormat(dstType).IntWidth));
            }
            else if (dstType.CILType.Equals(typeof(StdLogicVector)))
            {
                return(src.SLVValue[StdLogicVector.GetLength(dstType) - 1, 0]);
            }
            else
            {
                return(ConvertUFix(src, dstType.CILType));
            }
        }
예제 #16
0
        private async void TestProcess()
        {
            await Tick;
            int   curNumber = 0x12345678;

            do
            {
                _syncIn.Next = '1';
                StdLogicVector next = StdLogicVector.FromLong(curNumber, Design.DataWidth);
                _parIn.Next = next;
                Console.WriteLine(DesignContext.Instance.CurTime + ": input number " + next.IntValue);
                await Tick;
                _syncIn.Next = '0';
                while (!_syncOut.Cur)
                {
                    await Tick;
                }
                Console.WriteLine(DesignContext.Instance.CurTime + ": output number " + _parOut.Cur.IntValue);
                curNumber *= 2;
            } while (true);
        }
예제 #17
0
            public override IEnumerable <TAVerb> DoNothing()
            {
                IProcess ctrl =
                    _host.DIVIDEND.Dual.Stick(StdLogicVector.DCs(_host.DividendAndQuotientWidth)).Par(
                        _host.DIVISOR.Dual.Stick(StdLogicVector.DCs(_host.DivisorWidth)));

                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('0'));
                }

                yield return(Verb(ETVMode.Locked, ctrl));
            }
예제 #18
0
        private StdLogicVector GetOffset()
        {
            switch (PhaseOffset)
            {
            case EPhaseOffset.Fixed:
                return(poff1);

            case EPhaseOffset.None:
                return(StdLogicVector._0s(PhaseWidth));

            case EPhaseOffset.programmable:

                return(GetPhaseOffProgrammable());

            case EPhaseOffset.Streaming:

                return(POFF_IN.Cur);

            default:
                throw new NotImplementedException();
            }
        }
예제 #19
0
        private void HandleLoadVar(XILSInstr xilsi)
        {
            var      var         = (Variable)xilsi.StaticOperand;
            var      mms         = GetVariableLayout(var);
            Unsigned addr        = mms.BaseAddress;
            var      addrType    = TypeDescriptor.GetTypeOf(addr);
            int      addrSize    = addr.Size;
            var      rawWordType = Mapper.MarshalInfo.GetRawWordType();
            var      stackTypes  = new TypeDescriptor[mms.Size + 1];

            for (ulong k = 0; k < mms.Size; k++)
            {
                Emit(_iset.RdMemFix(Mapper.DefaultRegion, addr)
                     .CreateStk(RemapPreds(xilsi.Preds), 0, rawWordType));
                addr          = (addr + Unsigned.FromULong(1, 1)).Resize(addrSize);
                stackTypes[k] = rawWordType;
            }
            uint concatSize = (uint)(mms.Size * Mapper.MarshalInfo.WordSize);
            var  concatType = TypeDescriptor.GetTypeOf(StdLogicVector._0s(concatSize));

            if (mms.Size > 1)
            {
                stackTypes[mms.Size] = concatType;
                Emit(_iset.Concat().CreateStk(stackTypes.Length, stackTypes));
            }
            var valueType    = var.Type;
            var slvValue     = Marshal.SerializeForHW(valueType.GetSampleInstance());
            var rawValueType = TypeDescriptor.GetTypeOf(slvValue);

            if (!rawValueType.Equals(concatType))
            {
                Emit(_iset.Convert().CreateStk(1, concatType, rawValueType));
            }
            if (!rawValueType.Equals(valueType))
            {
                Emit(_iset.Convert().CreateStk(1, rawValueType, valueType));
            }
        }
예제 #20
0
        private async void Computation()
        {
            await Tick;

            while (true)
            {
                ProgramFlow.IOBarrier();
                Rdy.Next  = '0';
                Sum.Next  = StdLogicVector.FromInt(A.Cur.IntValue + B.Cur.IntValue, 32);
                Diff.Next = StdLogicVector.FromInt(A.Cur.IntValue - B.Cur.IntValue, 32);
                Prod.Next = StdLogicVector.FromInt(A.Cur.IntValue * B.Cur.IntValue, 32);
                Quot.Next = StdLogicVector.FromInt(B.Cur.IntValue / A.Cur.IntValue, 32);
                Neg.Next  = StdLogicVector.FromInt(-A.Cur.IntValue, 32);
                Abs.Next  = StdLogicVector.FromInt(Math.Abs(A.Cur.IntValue), 32);
                //await 9.Ticks();
                await NTicks(9);

                ProgramFlow.IOBarrier();
                Rdy.Next = '1';
                ProgramFlow.IOBarrier();
                await Tick;
            }
        }
예제 #21
0
        /// <summary>
        /// Constructs a new instance.
        /// </summary>
        /// <param name="depth">depth of shift register (i.e. number of stages)</param>
        /// <param name="width">bit-width of shift register</param>
        /// <param name="useEn">whether to use shift enable input</param>
        public RegPipe(int depth, int width, bool useEn = false)
        {
            Contract.Requires <ArgumentOutOfRangeException>(depth >= 0, "depth must be non-negative");
            Contract.Requires <ArgumentOutOfRangeException>(width > 0, "width must be positive");
            Contract.Requires <ArgumentOutOfRangeException>(depth > 0 || !useEn, "need at least 1 stage if using enable input.");

            _width = width;
            _depth = depth;
            UseEn  = useEn;
            if (depth > 1)
            {
                int bits = width * depth;
                _belowbit = bits - width - 1;
                _stages   = new SLVSignal(bits)
                {
                    InitialValue = StdLogicVector._0s(bits)
                };
            }
            else if (depth < 0)
            {
                throw new ArgumentException("Depth must be >= 0");
            }
        }
예제 #22
0
 private async void StimulateAndTest()
 {
     for (int i = 1; i < 10; i++)
     {
         for (int j = 1; j < 10; j++)
         {
             _a.Next = StdLogicVector.FromInt(i, 32);
             _b.Next = StdLogicVector.FromInt(j, 32);
             do
             {
                 await RisingEdge(_clk);
             } while (_rdy.Cur != '0');
             do
             {
                 await RisingEdge(_clk);
             } while (_rdy.Cur != '1');
             Console.WriteLine(i + " + " + j + " = " + _sum.Cur.IntValue);
             Console.WriteLine(i + " - " + j + " = " + _diff.Cur.IntValue);
             Console.WriteLine(i + " * " + j + " = " + _prod.Cur.IntValue);
             Console.WriteLine(i + " / " + j + " = " + _quot.Cur.IntValue);
         }
     }
 }
예제 #23
0
        private void ImplementLdConst(object value)
        {
            var      mms         = GetDataLayout(value);
            Unsigned addr        = mms.BaseAddress;
            var      addrType    = TypeDescriptor.GetTypeOf(addr);
            int      addrSize    = addr.Size;
            var      rawWordType = Mapper.MarshalInfo.GetRawWordType();
            var      stackTypes  = new TypeDescriptor[mms.Size + 1];

            for (ulong k = 0; k < mms.Size; k++)
            {
                Emit(_iset.RdMemFix(Mapper.DefaultRegion, addr).CreateStk(0, rawWordType));
                addr          = (addr + Unsigned.FromULong(1, 1)).Resize(addrSize);
                stackTypes[k] = rawWordType;
            }
            uint concatSize = (uint)(mms.Size * Mapper.MarshalInfo.WordSize);
            var  concatType = TypeDescriptor.GetTypeOf(StdLogicVector._0s(concatSize));

            if (mms.Size > 1)
            {
                stackTypes[mms.Size] = concatType;
                Emit(_iset.Concat().CreateStk(stackTypes.Length, stackTypes));
            }
            var valueType    = TypeDescriptor.GetTypeOf(value);
            var slvValue     = StdLogicVector.Serialize(value);
            var rawValueType = TypeDescriptor.GetTypeOf(slvValue);

            if (!rawValueType.Equals(concatType))
            {
                Emit(_iset.Convert().CreateStk(1, concatType, rawValueType));
            }
            if (!rawValueType.Equals(valueType))
            {
                Emit(_iset.Convert().CreateStk(1, rawValueType, valueType));
            }
        }
예제 #24
0
        private void ReadProcess()
        {
            StdLogicVector result = StdLogicVector._0s(SLVDWidth);

            for (int reg = 0; reg < NumRegs; reg++)
            {
                ProgramFlow.Unroll();

                if (Bus2IP_RdCE.Cur[NumRegs - reg - 1] == '1')
                {
                    for (int bit = 0; bit < SLVDWidth; bit++)
                    {
                        ProgramFlow.Unroll();

                        if (IsReadBitPresent(reg, bit))
                        {
                            result[bit] |= GetReadBit(reg, bit).Cur;
                        }
                    }
                }
            }

            IP2Bus_Data.Next = result;
        }
예제 #25
0
        protected async void MasterWrite(StdLogicVector addr, StdLogicVector data)
        {
            ip2bus_mstrd_req.Next       = '0';
            ip2bus_mstwr_req.Next       = '1';
            ip2bus_mst_type.Next        = '0';
            ip2bus_mst_addr.Next        = addr;
            ip2bus_mst_be.Next          = StdLogicVector._1s(NativeDataWidth / 8);
            ip2bus_mst_length.Next      = StdLogicVector._0s(LengthWidth);
            ip2bus_mst_lock.Next        = '0';
            ip2bus_mst_reset.Next       = '0';
            ip2bus_mstwr_d.Next         = data;
            ip2bus_mstwr_rem.Next       = StdLogicVector._0s(NativeDataWidth / 8);
            ip2bus_mstwr_sof_n.Next     = '0';
            ip2bus_mstwr_eof_n.Next     = '0';
            ip2bus_mstwr_src_rdy_n.Next = '0';
            ip2bus_mstwr_src_dsc_n.Next = '1';
            do
            {
                await Tick;
            } while (bus2ip_mst_cmdack.Cur != '1');
            do
            {
                ip2bus_mstwr_req.Next = '0';
                if (bus2ip_mstwr_dst_rdy_n.Cur == '0')
                {
                    break;
                }
                await Tick;
            } while (true);
            ip2bus_mstwr_src_rdy_n.Next = '1';
            ip2bus_mstwr_sof_n.Next     = '1';
            ip2bus_mstwr_eof_n.Next     = '1';
            await Tick;

            ProgramFlow.IOBarrier();
        }
예제 #26
0
 public override IEnumerable <TAVerb> DoNothing()
 {
     yield return(Verb(ETVMode.Locked,
                       _host.Operand.Dual.Stick(StdLogicVector.DCs(_host.InputWidth))));
 }
예제 #27
0
        //********************************************************************************************************************

        private StdLogicVector Getpipe( StdLogicVector x)
        {
            Dat_in.Next = x;
            //Latency = y;
            return Dat_outOff.Cur;
        }
예제 #28
0
 protected async void WriteBus(int reg, StdLogicVector be, StdLogicVector data)
 {
     _sig_Bus2IP_WrCE.Next = StdLogicVector.OneHot(user_logic.NumRegs, user_logic.NumRegs - reg - 1);
     _sig_Bus2IP_BE.Next = be;
     _sig_Bus2IP_Data.Next = data;
     for (int t = 0; t < 100; t++)
     {
         await Tick;
         if (_sig_IP2Bus_WrAck.Cur == '1' ||
              _sig_IP2Bus_Error.Cur == '1')
             break;
     }
     if (_sig_IP2Bus_Error.Cur == '1')
         Console.WriteLine("Bus write error @reg " + reg);
     if (_sig_IP2Bus_Error.Cur == '0' &&
         _sig_IP2Bus_WrAck.Cur == '0')
         Console.WriteLine("Timeout @reg " + reg);
     _sig_Bus2IP_WrCE.Next = StdLogicVector._0s(user_logic.NumRegs);
     _sig_Bus2IP_BE.Next = StdLogicVector._0s(user_logic.SLVDWidth / 8);
     _sig_Bus2IP_Data.Next = StdLogicVector.Xs(user_logic.SLVDWidth);
 }
예제 #29
0
        public void InitialWrite(StdLogicVector addr, StdLogicVector data)
        {
            if (InitialImage == null)
            {
                InitialImage = new StdLogicVector[WriteDepthA];
                for (int i = 0; i < WriteDepthA; i++)
                    InitialImage[i] = StdLogicVector.FromLong(RemainingMemoryLocations, (int)WriteWidthA);
            }

            ulong laddr = addr.ULongValue;
            if (data.Size != WriteWidthA)
                throw new ArgumentException("Wrong data size");
            InitialImage[laddr] = data;
        }
예제 #30
0
 public void PreWrite(StdLogicVector addr, StdLogicVector data)
 {
     throw new NotImplementedException();
 }
예제 #31
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);
                }

            }
예제 #32
0
 public async Task<StdLogicVector> Read(StdLogicVector addr)
 {
     AddrIn.Dual.Next = addr;
     await RisingEdge(Clk);
     return DataOut.Dual.Cur;
 }
예제 #33
0
            public override void Establish(IAutoBinder binder)
            {
                var divider = _host;

                divider.CLK      = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');
                divider.DIVIDEND = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "dividend", null, StdLogicVector._0s(divider.DividendAndQuotientWidth));
                divider.DIVISOR  = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "divisor", null, StdLogicVector._0s(divider.DivisorWidth));
                divider.QUOTIENT = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "quotient", null, StdLogicVector._0s(divider.DividendAndQuotientWidth));
                if (divider.FractionWidth != 0)
                {
                    divider.FRACTIONAL = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "fractional", null, StdLogicVector._0s(divider.FractionWidth));
                }
                divider.RDY = binder.GetSignal <StdLogic>(EPortUsage.Default, "rdy", null, '0');
                divider.RFD = binder.GetSignal <StdLogic>(EPortUsage.Default, "rfd", null, '0');
                divider.ND  = binder.GetSignal <StdLogic>(EPortUsage.Default, "nd", null, '0');
            }
예제 #34
0
파일: LERP.cs 프로젝트: cephdon/systemsharp
 public IEnumerable <TAVerb> DoNothing()
 {
     yield return(new TAVerb(this, ETVMode.Locked, () => { },
                             _host.X.Dual.Drive(SignalSource.Create(StdLogicVector.DCs(_host.XIntWidth + _host.XFracWidth)))));
 }
예제 #35
0
        public void Encode(int cstep, ParFlow pflow, ref StdLogicVector cw)
        {
            foreach (var flow in pflow.Flows)
            {
                if (FlowMatrix.IsDontCareFlow(flow))
                    continue;

                var vflow = flow as ValueFlow;
                if (vflow != null)
                {
                    int offs = _vfc.GetValueWordOffset(flow.Target);
                    var ser = Marshal.SerializeForHW(vflow.Value);
                    cw[offs + ser.Size - 1, offs] = ser;
                }
            }

            if (SelWidth <= 0)
                return;

            int symbol = _encFlow.EncodedSymbols[cstep];
            if (symbol == 0)
                symbol = 1;
            uint index = (uint)(symbol - 1);
            cw[SelOffset + SelWidth - 1, SelOffset] = StdLogicVector.FromUInt(index, SelWidth);
        }
예제 #36
0
 private void Encode(int cstep, ParFlow pflow, ref StdLogicVector cword)
 {
     foreach (var ms in _strings)
     {
         var projflow = new ParFlow();
         foreach (var target in ms.Targets)
         {
             var flow = pflow.LookupTarget(target);
             if (flow != null)
                 projflow.Add(flow);
         }
         ms.Encode(cstep, projflow, ref cword);
     }
 }
예제 #37
0
        //********************************Hier wird das angegebene Binaere Vektor in Dezimal umgewandelt************************
        private double Getradian(StdLogicVector x)
        {
            StdLogicVector phse = x; // N bits
            long iphase = phse.SignedValue.LongValue;
            double dphase = (double)iphase * Math.Pow(2.0, -(PhaseWidth - 1)) * Math.PI; // hier wird die Phase skaliert und damit kann Sinus berechnet werden

            return dphase;
        }
예제 #38
0
 /// <summary>
 /// Constructs a new instance
 /// </summary>
 /// <param name="host">hosting component</param>
 /// <param name="constValue">constant value to load</param>
 /// <param name="createSignal">true if a separate constant-valued signal should be created to provide the constant</param>
 public ConstLoadingTransactionSite(Component host, StdLogicVector constValue, bool createSignal) :
     base(host)
 {
     _constValue = constValue;
     _createSignal = createSignal;
 }
예제 #39
0
 public object Deserialize(StdLogicVector slv, TypeDescriptor targetType)
 {
     var fmt = UFix.GetFormat(targetType);
     return UFix.FromUnsigned(slv.UnsignedValue, fmt.FracWidth);
 }
예제 #40
0
        private void CreateSelSymbol(IAutoBinder binder, bool registered)
        {
            int count = NumSymbols;
            if (count < 2)
                return;

            // This code will create a one-hot decoding
            var selSymbols = new StdLogicVector[NumSymbols];
            _selSymbols = selSymbols;
            for (int i = 0; i < NumSymbols; i++)
            {
                StdLogicVector sym = StdLogicVector._0s(NumSymbols);
                sym[i] = '1';
                selSymbols[i] = sym;
            }
            var signal = binder.GetSignal(EPortUsage.Default, "MUXSymbol" + Order, null, selSymbols[0]);
            _symbol = signal.Descriptor;
            if (registered)
            {
                var dsignal = binder.GetSignal(EPortUsage.Default, "MUXReg" + Order, null, selSymbols[0]);
                _symbold = dsignal.Descriptor;
            }
        }
예제 #41
0
        /// <summary>
        /// Constructs a new instance.
        /// </summary>
        /// <param name="floatWidth">total bit-width of input floating-point number
        /// (actual partitioning between exponent and mantissa bits does not matter)</param>
        /// <param name="outFormat">desired fixed-point output format</param>
        public FloatSignAsSigned(int floatWidth, FixFormat outFormat)
        {
            FloatWidth = floatWidth;
            OutFormat = outFormat;

            _outM1 = SFix.FromDouble(-1.0, outFormat.IntWidth, outFormat.FracWidth).SLVValue;
            _out0 = SFix.FromDouble(0.0, outFormat.IntWidth, outFormat.FracWidth).SLVValue;
            _out1 = SFix.FromDouble(1.0, outFormat.IntWidth, outFormat.FracWidth).SLVValue;
            _zeros = StdLogicVector._0s(floatWidth - 1);

            TASite = new TransactionSite(this);
        }
예제 #42
0
        /// <summary>
        /// Constructs a new instance.
        /// </summary>
        /// <param name="inIntWidth">operand integer bits</param>
        /// <param name="fracWidth">operand and result fractional bits
        /// (operand and result automatically have same number of fractional bits)</param>
        /// <param name="outIntWidth">result integer bits</param>
        public FixFPMod1(int inIntWidth, int fracWidth, int outIntWidth)
        {
            Contract.Requires(inIntWidth >= 2 && outIntWidth >= 2);

            InIntWidth = inIntWidth;
            OutIntWidth = outIntWidth;
            FracWidth = fracWidth;

            _zeroes = StdLogicVector._0s(FracWidth);
            _padZeroes = StdLogicVector._0s(OutIntWidth - 1);
            _padOnes = StdLogicVector._1s(OutIntWidth - 1);
            TASite = new FPMod1TransactionSite(this);
        }
예제 #43
0
 public void PreWrite(StdLogicVector addr, StdLogicVector data)
 {
     Contract.Requires<ArgumentOutOfRangeException>(addr.ULongValue < Depth, "addr beyond ROM capacity");
     Contract.Requires<ArgumentException>(data.Size == Width, "wrong data word size");
 }
예제 #44
0
        /// <summary>
        /// Pre-initializes the RAM with word <paramref name="data"/> at address <paramref name="addr"/>.
        /// Called during elaboration, never at model runtime.
        /// </summary>
        public void PreWrite(StdLogicVector addr, StdLogicVector data)
        {
            Contract.Requires<ArgumentOutOfRangeException>(addr.Size == AddrWidth, "invalid address width");
            Contract.Requires<ArgumentOutOfRangeException>(addr.ULongValue < Depth, "address beyond RAM capacity");
            Contract.Requires<ArgumentOutOfRangeException>(data.Size == Width, "invalid data width");

            _content[addr.ULongValue] = data;
        }
예제 #45
0
        /// <summary>
        /// Constructs a new instance.
        /// </summary>
        /// <param name="inputWidth">bit-width of operand</param>
        /// <param name="hiOffset">high slice offset</param>
        /// <param name="loOffset">low slice offset</param>
        /// <param name="signed">whether operand is signed</param>
        public Slicer(int inputWidth, int hiOffset, int loOffset, bool signed)
        {
            Contract.Requires<ArgumentOutOfRangeException>(hiOffset - loOffset >= -1);

            InputWidth = inputWidth;
            HiOffset = hiOffset;
            LoOffset = loOffset;
            IsSigned = signed;
            TASite = new SlicerTransactionSite(this);

            int msb = signed ? inputWidth - 2 : inputWidth - 1;
            int hiPadWidth = Math.Max(hiOffset, msb) - Math.Max(loOffset, msb + 1) + 1;
            int loPadWidth = Math.Min(hiOffset, -1) - Math.Min(loOffset, 0) + 1;
            _hiSlice = Math.Min(msb, hiOffset);
            _loSlice = Math.Max(0, loOffset);
            
            if (_loSlice > _hiSlice)
            {
                // degenerate case: actually no portion of input word is used
                _hiSlice = -1;
                _loSlice = 0;
            }            

            _hiPad0 = StdLogicVector._0s(hiPadWidth);
            _hiPad1 = StdLogicVector._1s(hiPadWidth);
            _loPad = StdLogicVector._0s(loPadWidth);

            Debug.Assert(hiPadWidth + loPadWidth + _hiSlice - _loSlice == hiOffset - loOffset);
        }
예제 #46
0
 protected async void MasterWrite(StdLogicVector addr, StdLogicVector data)
 {
     ip2bus_mstrd_req.Next = '0';
     ip2bus_mstwr_req.Next = '1';
     ip2bus_mst_type.Next = '0';
     ip2bus_mst_addr.Next = addr;
     ip2bus_mst_be.Next = StdLogicVector._1s(NativeDataWidth / 8);
     ip2bus_mst_length.Next = StdLogicVector._0s(LengthWidth);
     ip2bus_mst_lock.Next = '0';
     ip2bus_mst_reset.Next = '0';
     ip2bus_mstwr_d.Next = data;
     ip2bus_mstwr_rem.Next = StdLogicVector._0s(NativeDataWidth / 8);
     ip2bus_mstwr_sof_n.Next = '0';
     ip2bus_mstwr_eof_n.Next = '0';
     ip2bus_mstwr_src_rdy_n.Next = '0';
     ip2bus_mstwr_src_dsc_n.Next = '1';
     do
     {
         await Tick;
     } while (bus2ip_mst_cmdack.Cur != '1');
     do
     {
         ip2bus_mstwr_req.Next = '0';
         if (bus2ip_mstwr_dst_rdy_n.Cur == '0')
             break;
         await Tick;
     } while (true);
     ip2bus_mstwr_src_rdy_n.Next = '1';
     ip2bus_mstwr_sof_n.Next = '1';
     ip2bus_mstwr_eof_n.Next = '1';
     await Tick;
     ProgramFlow.IOBarrier();
 }
예제 #47
0
        //********************************************************************************************************************

        private StdLogicVector Getpipe(StdLogicVector x)
        {
            Dat_in.Next = x;
            //Latency = y;
            return(Dat_outOff.Cur);
        }
예제 #48
0
 public async void Write(StdLogicVector addr, StdLogicVector data)
 {
     AddrIn.Dual.Next = addr;
     DataIn.Dual.Next = data;
     await RisingEdge(Clk);
 }
예제 #49
0
        protected async Task<StdLogicVector> MasterRead(StdLogicVector addr)
        {
            ip2bus_mstrd_req.Next = '1';
            ip2bus_mstwr_req.Next = '0';
            ip2bus_mst_type.Next = '0';
            ip2bus_mst_addr.Next = addr;
            ip2bus_mst_be.Next = StdLogicVector._1s(NativeDataWidth / 8);
            ip2bus_mst_length.Next = StdLogicVector._0s(LengthWidth);
            ip2bus_mst_lock.Next = '0';
            ip2bus_mst_reset.Next = '0';
            ip2bus_mstrd_dst_rdy_n.Next = '0';
            ip2bus_mstrd_dst_dsc_n.Next = '1';
            do
            {
                await Tick;
            } while (bus2ip_mst_cmdack.Cur != '1');
            ip2bus_mstrd_req.Next = '0';
            do
            {
                await Tick;
            } while (bus2ip_mst_cmplt.Cur != '1');
            ip2bus_mstrd_dst_rdy_n.Next = '1';

            return bus2ip_mstrd_d.Cur;
        }
예제 #50
0
        private void Processing()
        {
            if (CLK.RisingEdge())
            {
                phase = phase + GetPinc();
                phase2 = phase2 + GetOffset();// hier ist das Problem, die Getpinc() incrementiert sich nicht nur die Getoffset()
                phase4 = phase + phase2;
                //phase5 = Getpipe(phase4);
                //phase6 = GetPhaseIn();
            }
                switch (Partspresent)
                {
                    case EConfigurationOptions.PhaseGeneratorAndSinCosLut:
                        {
                            PHASE_OUT.Next = phase4;
                            SINE.Next = GetSinus(Getradian(phase4));
                            COSINE.Next = GetCosinus(Getradian(phase4));
                        } break;

                    case EConfigurationOptions.PhaseGeneratorOnly:
                        {

                            PHASE_OUT.Next = phase2;

                        } break;
                    case EConfigurationOptions.SinAndCosOnly:
                        {
                            PHASE_OUT.Next = Getpipe(GetPhaseIn());
                            SINE.Next = GetSinus(Getradian(Getpipe(GetPhaseIn())));
                            COSINE.Next = GetCosinus(Getradian(Getpipe(GetPhaseIn())));
                            //PHASE_OUT1 = GetPhaseIn();
                        } break;
                }
            }
예제 #51
0
            public override IEnumerable <TAVerb> DoNothing()
            {
                var inps = _inSignals.Select(s => s.Stick(StdLogicVector.DCs(s.InitialValue.Size)));

                yield return(Verb(ETVMode.Locked, inps.ToArray()));
            }
예제 #52
0
 public void PreWrite(StdLogicVector addr, StdLogicVector data)
 {
     _content[addr.ULongValue] = data;
 }
예제 #53
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                {
                    return;
                }

                if (_host.Latency > 0)
                {
                    _host.Clk = (SLSignal)binder.GetSignal(EPortUsage.Clock, null, null, null);
                }
                _host.Operand = (SLVSignal)binder.GetSignal(EPortUsage.Operand, "Operand", null, StdLogicVector._0s(_host.InputWidth));
                _host.Result  = (SLVSignal)binder.GetSignal(EPortUsage.Result, "Result", null, StdLogicVector._0s(_host.OutputWidth));
                _established  = true;
            }
예제 #54
0
 public object Deserialize(StdLogicVector slv, TypeDescriptor targetType)
 {
     return slv.SignedValue;
 }
예제 #55
0
        public override StdLogicVector[] SerializeInstance(object instance)
        {
            StdLogicVector plain = StdLogicVector.Serialize(instance);
            StdLogicVector[] result = new StdLogicVector[Size];
            for (int i = 0; i < (int)Size; i++)
            {
                int upper = (i + 1) * WordSize - 1;
                if (upper >= plain.Size)
                {
                    result[i] = StdLogicVector._0s(upper - plain.Size + 1).Concat(plain[plain.Size - 1, i * WordSize]);
                }
                else
                {
                    result[i] = plain[(i + 1) * WordSize - 1, i * WordSize];
                }
            }

            return result;
        }
예제 #56
0
        private bool TryGetConstSLV(XILInstr instr, TypeDescriptor rtype, out StdLogicVector constSLV)
        {
            switch (instr.Name)
            {
                case InstructionCodes.LdConst:
                    {
                        object constValue = instr.Operand;
                        constSLV = StdLogicVector.Serialize(constValue);
                    }
                    break;

                case InstructionCodes.Ld0:
                    {
                        object sample = rtype.GetSampleInstance();
                        StdLogicVector slv = StdLogicVector.Serialize(sample);
                        constSLV = StdLogicVector._0s(slv.Size);
                    }
                    break;

                default:
                    {
                        constSLV = "";
                        return false;
                    }
            }
            return true;
        }
예제 #57
0
파일: LERP.cs 프로젝트: cephdon/systemsharp
            public void Establish(IAutoBinder binder)
            {
                if (_established)
                {
                    return;
                }

                var unit = _host;

                unit.Clk = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, StdLogic._0);
                unit.X   = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "X", null, StdLogicVector._0s(unit.XIntWidth + unit.XFracWidth));
                unit.Sin = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "SinOut", null, StdLogicVector._0s(unit.YIntWidth + unit.YFracWidth));
                unit.Cos = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "CosOut", null, StdLogicVector._0s(unit.YIntWidth + unit.YFracWidth));

                _established = true;
            }
예제 #58
0
 public override StdLogicVector[] SerializeInstance(object instance)
 {
     Contract.Assert(instance.GetType().Equals(LayoutedType.CILType));
     var values = LayoutedType.CILType.GetEnumValues();
     int index = Array.IndexOf(values, instance);
     int wsize = (int)_wordSize;
     int alignedNum = (NumBits + wsize - 1) / wsize * wsize;
     StdLogicVector vec = StdLogicVector.FromInt(index, alignedNum);
     StdLogicVector[] result = new StdLogicVector[Size];
     for (int i = 0; i < (int)Size; i++)
     {
         result[i] = vec[i + wsize - 1, i];
     }
     return result;
 }
예제 #59
0
        public override StdLogicVector[] SerializeInstance(object instance)
        {
            StdLogicVector[] result = new StdLogicVector[Size];

            foreach (var kvp in _locations)
            {
                StdLogicVector[] fieldData =
                    kvp.Value.FieldLayout.SerializeInstance(
                        kvp.Key.GetValue(instance));
                Array.Copy(fieldData, 0, result, (int)kvp.Value.Offset, fieldData.Length);
            }

            return result;
        }
예제 #60
0
 public void PreWrite(StdLogicVector addr, StdLogicVector data)
 {
     _mem.InitialWrite(addr, data);
 }