Beispiel #1
0
 public static IAutoFaker Create(IAutoBinder binder)
 {
     return(Create(builder =>
     {
         builder.WithBinder(binder);
     }));
 }
Beispiel #2
0
            public override void Establish(IAutoBinder binder)
            {
                if (_realized)
                {
                    return;
                }

                _addrBits = MathExt.CeilLog2(_array.ArrayObj.Length);
                _dataBits = Marshal.SerializeForHW(_array.ElementType.GetSampleInstance()).Size;

                _clkI     = (SLSignal)binder.GetSignal(EPortUsage.Clock, "Clk", null, null);
                _dataOutI = (SLVSignal)binder.GetSignal(EPortUsage.Default, "memIf_dataOut", null, StdLogicVector._0s(_dataBits));
                _addrI    = (SLVSignal)binder.GetSignal(EPortUsage.Default, "memIf_addr", null, StdLogicVector._0s(_addrBits));
                _clk      = _clkI.Descriptor;
                _addr     = _addrI.Descriptor;
                _dataOut  = _dataOutI.Descriptor;

                if (NeedWriteAccess)
                {
                    _wrEnI   = (SLSignal)binder.GetSignal(EPortUsage.Default, "memIf_wrEn", null, StdLogic._0);
                    _dataInI = (SLVSignal)binder.GetSignal(EPortUsage.Default, "memIf_dataIn", null, StdLogicVector._0s(_dataBits));
                    _wrEn    = _wrEnI.Descriptor;
                    _dataIn  = _dataInI.Descriptor;
                }

                var memIfBuilder = new MemIfBuilder(this);
                var memIfAlg     = memIfBuilder.GetAlgorithm();

                memIfAlg.Name = "MemIf";
                binder.CreateProcess(Process.EProcessKind.Triggered, memIfAlg, _clk);

                _realized = true;
            }
        protected ServiceFixture(ITestOutputHelper output, IAutoBinder binder)
        {
            _faker = AutoFaker.Create(builder =>
            {
                builder.WithOverride(new ProductGeneratorOverride());

                if (binder != null)
                {
                    builder.WithBinder(binder);
                }
            });

            // Setup
            var id        = _faker.Generate <Guid>();
            var generator = new AutoFaker <Item>(binder)
                            .RuleFor(item => item.Id, () => id)
                            .RuleFor(item => item.Name, faker => faker.Person.FullName)
                            .RuleFor(item => item.Amendments, faker => new HashSet <string> {
                "1", "2", "3"
            });

            _item  = generator;
            _items = generator.Generate(5);

            _repository = Substitute.For <IRepository>();

            _repository.Get(id).Returns(_item);
            _repository.GetAll().Returns(_items);

            _service = new Service(_repository);
            _output  = output;
        }
Beispiel #4
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;
            }
        }
Beispiel #5
0
            public override void Establish(IAutoBinder binder)
            {
                if (_allocated)
                {
                    return;
                }

                _brAltFlagP = (SLVSignal)binder.GetSignal(EPortUsage.Default, "BCU_BrP", null, StdLogicVector._0s(1));
                _brAltFlagN = (SLVSignal)binder.GetSignal(EPortUsage.Default, "BCU_BrN", null, StdLogicVector._1s(1));

                _curState = binder.GetSignal(EPortUsage.State, "BCU_CurState", null, null).Descriptor;
                _tState   = _curState.ElementType.CILType;
                Array  enumValues   = _tState.GetEnumValues();
                int    numStates    = enumValues.Length;
                object defaultState = Activator.CreateInstance(_tState);

                _incState  = binder.GetSignal(EPortUsage.Default, "BCU_IncState", null, defaultState).Descriptor;
                _altState  = binder.GetSignal(EPortUsage.Default, "BCU_AltState", null, defaultState).Descriptor;
                _nextState = binder.GetSignal(EPortUsage.Default, "BCU_NextState", null, defaultState).Descriptor;
                IncStateProcessBuilder ispb = new IncStateProcessBuilder(this);
                Function incStateFn         = ispb.GetAlgorithm();

                incStateFn.Name = "BCU_IncState";
                binder.CreateProcess(Process.EProcessKind.Triggered, incStateFn, _curState);
                SyncProcessBuilder spb         = new SyncProcessBuilder(this, binder);
                Function           syncStateFn = spb.GetAlgorithm();

                syncStateFn.Name = "BCU_FSM";
                ISignalOrPortDescriptor sdClock = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0').Descriptor;

                binder.CreateProcess(Process.EProcessKind.Triggered, syncStateFn, sdClock);

                _allocated = true;
            }
 public override void Establish(IAutoBinder binder)
 {
     if (_host.Latency > 0)
     {
         _host.CLK = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');
     }
     _host.A = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(_host.Awidth));
     _host.B = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(_host.Bwidth));
     _host.S = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "S", null, StdLogicVector._0s(_host.OutWidth));
     if (_host.HasBypass)
     {
         _host.BYPASS = binder.GetSignal <StdLogic>(EPortUsage.Default, "bypass", null, '0');
     }
     if (_host.HasCarryIn)
     {
         _host.C_in = binder.GetSignal <StdLogic>(EPortUsage.Default, "c_in", null, '0');
     }
     if (_host.HasCarryOut)
     {
         _host.C_out = binder.GetSignal <StdLogic>(EPortUsage.Default, "c_out", null, '0');
     }
     if (_host.HasCE)
     {
         _host.CE = binder.GetSignal <StdLogic>(EPortUsage.Default, "ce", null, '0');
     }
     if (_host.HasSCLR)
     {
         _host.SCLR = binder.GetSignal <StdLogic>(EPortUsage.Default, "sclr", null, '0');
     }
     if (_host.HasSSET)
     {
         _host.SSET = binder.GetSignal <StdLogic>(EPortUsage.Default, "sset", null, '0');
     }
     //FIXME: What about SINIT?
 }
Beispiel #7
0
 public static void SetBinder(IAutoBinder binder)
 {
     Configure(builder =>
     {
         builder.WithBinder(binder);
     });
 }
Beispiel #8
0
 public override void Establish(IAutoBinder binder)
 {
     var mux2 = _host;
     mux2.A = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(mux2.Width));
     mux2.B = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(mux2.Width));
     mux2.Sel = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "Sel", null, StdLogicVector._0s(1));
     mux2.R = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(mux2.Width));
 }
Beispiel #9
0
 public override void AssembleStagedDecoderSync(int[] syms, int selWidth, LiteralReference lrCWSelSlice,
                                                IAutoBinder binder, IAlgorithmBuilder pbuilder, bool registered)
 {
     int[] syms0 = syms.Select(i => _encMap0[i - 1]).ToArray();
     int[] syms1 = syms.Select(i => _encMap1[i - 1]).ToArray();
     _encFlow0.AssembleStagedDecoderSync(syms0, selWidth, lrCWSelSlice, binder, pbuilder, registered);
     _encFlow1.AssembleStagedDecoderSync(syms1, selWidth, lrCWSelSlice, binder, pbuilder, registered);
 }
Beispiel #10
0
        internal AutoGenerateContext(Faker faker, IEnumerable <string> ruleSets, IAutoBinder binder)
        {
            Faker    = faker;
            RuleSets = ruleSets;
            Binder   = binder;

            Types = new Stack <Type>();
        }
Beispiel #11
0
        public override void Establish(IAutoBinder binder)
        {
            var lsu = _host;

            lsu.Clk  = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');
            lsu.EnIn = binder.GetSignal <StdLogic>(EPortUsage.Default, _host.MappedVariableName + "_StEn", null, '0');
            lsu.DIn  = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, _host.MappedVariableName + "_In", null, StdLogicVector._0s(lsu.DataWidth));
            lsu.DOut = binder.GetSignal <StdLogicVector>(EPortUsage.Result, _host.MappedVariableName + "_Out", null, StdLogicVector._0s(lsu.DataWidth));
        }
Beispiel #12
0
 public static IAutoFaker Create(string locale, IAutoBinder binder)
 {
     return(Create(builder =>
     {
         builder
         .WithLocale(locale)
         .WithBinder(binder);
     }));
 }
Beispiel #13
0
            public override void Establish(IAutoBinder binder)
            {
                var mux2 = _host;

                mux2.A   = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(mux2.Width));
                mux2.B   = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(mux2.Width));
                mux2.Sel = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "Sel", null, StdLogicVector._0s(1));
                mux2.R   = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(mux2.Width));
            }
Beispiel #14
0
        /// <summary>
        /// Instantiates an instance of the <see cref="AutoFaker{TType}"/> class.
        /// </summary>
        /// <param name="locale">The locale to use for value generation.</param>
        /// <param name="binder">The <see cref="IAutoBinder"/> instance to use for the generation request.</param>
        public AutoFaker(string locale = null, IAutoBinder binder = null)
            : base(locale ?? AutoConfig.DefaultLocale, binder)
        {
            Binder = binder;

            // Ensure the default create action is cleared
            // This is so we can check whether it has been set externally
            DefaultCreateAction           = CreateActions[currentRuleSet];
            CreateActions[currentRuleSet] = null;
        }
Beispiel #15
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                    return;

                _host.X = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "X", null, StdLogicVector._0s(_host.InIntWidth + _host.FracWidth));
                _host.R = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(_host.OutIntWidth + _host.FracWidth));

                _established = true;
            }
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                    return;

                _host.DIn = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "DIn", null, StdLogicVector._0s(_host.FloatWidth));
                _host.DOut = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "DOut", null, StdLogicVector._0s(_host.OutFormat.TotalWidth));

                _established = true;
            }
Beispiel #17
0
            public override void Establish(IAutoBinder binder)
            {
                var shifter = _host;

                shifter.Clk   = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');
                shifter.X     = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "X", null, StdLogicVector._0s(shifter.DataWidth));
                shifter.Shift = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "S", null, StdLogicVector._0s(shifter.ShiftWidth));
                shifter.Dir   = binder.GetSignal <StdLogicVector>(EPortUsage.Default, "Dir", null, StdLogicVector._0s(1));
                shifter.Y     = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "Y", null, StdLogicVector._0s(shifter.DataWidth));
            }
Beispiel #18
0
 private MicrocodeControlpathBuilder(Component host, IAutoBinder binder, int romLatency, int maxSelWidth, bool staged, bool registered)
 {
     _host        = host;
     _binder      = binder;
     _mcd         = new MicrocodeDesigner();
     _romLatency  = romLatency;
     _maxSelWidth = maxSelWidth;
     _staged      = staged;
     _registered  = registered;
 }
Beispiel #19
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                {
                    return;
                }

                _host.X = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "X", null, StdLogicVector._0s(_host.InIntWidth + _host.FracWidth));
                _host.R = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(_host.OutIntWidth + _host.FracWidth));

                _established = true;
            }
Beispiel #20
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                {
                    return;
                }

                _host.DIn  = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "DIn", null, StdLogicVector._0s(_host.FloatWidth));
                _host.DOut = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "DOut", null, StdLogicVector._0s(_host.OutFormat.TotalWidth));

                _established = true;
            }
Beispiel #21
0
            public override void Establish(IAutoBinder binder)
            {
                var mul = _host;

                if (mul.PipeStages > 0)
                {
                    mul.CLK = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');
                }
                mul.A = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(mul.PortAWidth));
                mul.B = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(mul.PortBWidth));
                mul.P = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "P", null, StdLogicVector._0s(mul.OutputWidthHigh - mul.OutputWidthLow + 1));
            }
Beispiel #22
0
        public void CreateStagedDecoder(IAutoBinder binder, SLVSignal cwSignal, SLSignal clkSignal, bool registered)
        {
            var       valWordInit   = StdLogicVector._0s(_vcf.ValueWordWidth);
            var       rcwSignal     = (SLVSignal)binder.GetSignal(EPortUsage.Default, "D1_CW", null, valWordInit);
            var       rcwSignalDesc = rcwSignal.Descriptor;
            SLVSignal rrcwSignal    = null;

            if (registered)
            {
                rrcwSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "D2_CW", null, valWordInit);
            }

            var syncBuilder = new DefaultAlgorithmBuilder();

            syncBuilder.If(clkSignal.ToSignalRef(SignalRef.EReferencedProperty.RisingEdge));

            syncBuilder.Store(rcwSignal.ToSignalRef(SignalRef.EReferencedProperty.Next),
                              ((ISignal)cwSignal[_vcf.ValueWordWidth - 1, 0]).ToSignalRef(SignalRef.EReferencedProperty.Cur));
            if (registered)
            {
                syncBuilder.Store(rrcwSignal.ToSignalRef(SignalRef.EReferencedProperty.Next),
                                  rcwSignal.ToSignalRef(SignalRef.EReferencedProperty.Cur));
            }

            foreach (var ms in _strings)
            {
                ms.AssembleStagedDecoderSync(binder, syncBuilder, cwSignal, registered);
            }
            syncBuilder.EndIf();
            var syncFunc = syncBuilder.Complete();

            syncFunc.Name = "cwdecode_sync";
            binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkSignal.Descriptor);

            var combBuilder = new DefaultAlgorithmBuilder();
            var sensitivity = new HashSet <ISignalOrPortDescriptor>();

            sensitivity.Add(cwSignal.Descriptor);
            sensitivity.Add(rcwSignalDesc);
            if (registered)
            {
                sensitivity.Add(rrcwSignal.Descriptor);
            }
            foreach (var ms in _strings)
            {
                ms.AssembleStagedDecoderComb(combBuilder, registered ? rrcwSignal : rcwSignal, sensitivity, registered);
            }
            var combFunc = combBuilder.Complete();

            combFunc.Name = "cwdecode_comb";
            binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, combFunc, sensitivity.ToArray());
        }
Beispiel #23
0
        internal void AssembleStagedDecoderSync(IAutoBinder binder, IAlgorithmBuilder pbuilder, SLVSignal cwSignal, bool registered)
        {
            LiteralReference lrCWSelSlice = null;

            if (SelWidth != 0)
            {
                lrCWSelSlice = new LiteralReference(
                    ((ISignal)cwSignal[SelOffset + SelWidth - 1, SelOffset])
                    .ToSignalRef(SignalRef.EReferencedProperty.Cur));
            }
            _encFlow.AssembleStagedDecoderSync(Enumerable.Range(1, _encFlow.NumSymbols).ToArray(),
                                               SelWidth, lrCWSelSlice, binder, pbuilder, registered);
        }
Beispiel #24
0
 public SlimMuxInterconnectHelper(IAutoBinder binder)
 {
     _binder     = binder;
     _signal2Idx = new CacheDictionary <SignalRef, int>(CreateFUSignalIndex);
     _dep        = new DelegatePropMap <TimedSignalFlow, int>(tf => _signal2Idx[tf.Source]);
     _dst        = new DelegatePropMap <TimedSignalFlow, int>(tf => _signal2Idx[tf.Target]);
     _pipeSource = new DelegatePropMap <int, int>(GetPipeSource);
     _pipeSink   = new DelegatePropMap <int, int>(GetPipeSink);
     _pipeDelay  = new DelegatePropMap <int, long>(GetPipeDelay);
     _pmPreds    = new DelegatePropMap <int, IEnumerable <int> >(GetPreds);
     _pmSuccs    = new DelegatePropMap <int, IEnumerable <int> >(GetSuccs);
     _isFixed    = new DelegatePropMap <int, bool>(GetIsFixed);
 }
Beispiel #25
0
            public void Establish(IAutoBinder binder)
            {
                if (_established)
                {
                    return;
                }

                var fna = _host;

                fna.Clk  = binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, StdLogic._0);
                fna.DIn  = binder.GetSignal <StdLogicVector>(EPortUsage.Operand, "DIn", null, StdLogicVector._0s(fna.TotalWidth));
                fna.DOut = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "DOut", null, StdLogicVector._0s(fna.TotalWidth));

                _established = true;
            }
Beispiel #26
0
        public void CreateDecoder(IAutoBinder binder, SLVSignal cwSignal)
        {
            var pbuilder    = new DefaultAlgorithmBuilder();
            var sensitivity = new HashSet <ISignalOrPortDescriptor>();

            sensitivity.Add(cwSignal.Descriptor);
            foreach (var ms in _strings)
            {
                ms.AssembleDecoder(pbuilder, cwSignal, sensitivity);
            }
            var decFunc = pbuilder.Complete();

            decFunc.Name = "cwdecode";
            binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, decFunc, sensitivity.ToArray());
        }
Beispiel #27
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;
            }
Beispiel #28
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                {
                    return;
                }

                var cc = _host;

                cc.Ops = (XIn <StdLogicVector[], InOut <StdLogicVector> >)binder.GetSignal(EPortUsage.Operand, "Ops", null,
                                                                                           Enumerable.Repeat(StdLogicVector._0s(cc.WordWidth), cc.NumWords).ToArray());
                cc.R = binder.GetSignal <StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(cc.OutputWidth));

                _established = true;
            }
Beispiel #29
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');
            }
Beispiel #30
0
            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;
            }
Beispiel #31
0
 public override void Establish(IAutoBinder binder)
 {
     if (_createSignal)
     {
         _constSignal = Host.Descriptor
             .GetSignals()
             .Where(s => s.HasAttribute<ConstLoadingTransactionSite>() &&
                 s.InitialValue.Equals(_constValue))
             .Select(s => s.Instance)
             .Cast<SLVSignal>()
             .SingleOrDefault();
         if (_constSignal == null)
         {
             _constSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "const_" + _constValue.ToString(), null, _constValue);
             _constSignal.Descriptor.AddAttribute(this);
         }
     }
 }
Beispiel #32
0
 public override void Establish(IAutoBinder binder)
 {
     if (_createSignal)
     {
         _constSignal = Host.Descriptor
                        .GetSignals()
                        .Where(s => s.HasAttribute <ConstLoadingTransactionSite>() &&
                               s.InitialValue.Equals(_constValue))
                        .Select(s => s.Instance)
                        .Cast <SLVSignal>()
                        .SingleOrDefault();
         if (_constSignal == null)
         {
             _constSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "const_" + _constValue.ToString(), null, _constValue);
             _constSignal.Descriptor.AddAttribute(this);
         }
     }
 }
Beispiel #33
0
        public virtual void AssembleStagedDecoderSync(int[] syms, int selWidth,
                                                      LiteralReference lrCWSelSlice, IAutoBinder binder, IAlgorithmBuilder pbuilder,
                                                      bool registered)
        {
            if (NumSymbols < 2)
            {
                return;
            }

            CreateSelSymbol(binder, registered);

            pbuilder.Switch(lrCWSelSlice);

            for (int i = 0; i < syms.Length; i++)
            {
                var selValue = StdLogicVector.FromUInt((uint)i, selWidth);
                pbuilder.Case(LiteralReference.CreateConstant(selValue));

                int sym    = syms[i];
                var symbol = _selSymbols.GetValue(sym - 1);
                pbuilder.Store(
                    _symbol.SignalInstance.ToSignalRef(SignalRef.EReferencedProperty.Next),
                    LiteralReference.CreateConstant(symbol));

                pbuilder.EndCase();
            }

            pbuilder.DefaultCase();
            {
                pbuilder.Store(
                    _symbol.SignalInstance.ToSignalRef(SignalRef.EReferencedProperty.Next),
                    LiteralReference.CreateConstant(StdLogicVector.Xs(NumSymbols)));
            }
            pbuilder.EndCase();

            if (registered)
            {
                pbuilder.Store(
                    _symbold.SignalInstance.ToSignalRef(SignalRef.EReferencedProperty.Next),
                    _symbol.SignalInstance.ToSignalRef(SignalRef.EReferencedProperty.Cur));
            }

            pbuilder.EndSwitch();
        }
Beispiel #34
0
        public override void Establish(IAutoBinder binder)
        {
            if (_established)
            {
                return;
            }

            _clk        = binder.GetSignal(EPortUsage.Clock, null, null, null).Descriptor;
            _enI        = (SLSignal)binder.GetSignal(EPortUsage.Default, _port.Name + "_en", null, StdLogic._1);
            _en         = _enI.Descriptor;
            _slvSignalI = (SLVSignal)binder.GetSignal(EPortUsage.Default, _port.Name + "_in", null, StdLogicVector._0s(_dataWidth));
            _slvSignal  = _slvSignalI.Descriptor;
            var templ = new ConvProcessBuilder(this);
            var alg   = templ.GetAlgorithm();

            binder.CreateProcess(Process.EProcessKind.Triggered, alg, _clk, _en);

            _established = true;
        }
 public void CreateDecoder(IAutoBinder binder, SLVSignal cwSignal)
 {
     var pbuilder = new DefaultAlgorithmBuilder();
     var sensitivity = new HashSet<ISignalOrPortDescriptor>();
     sensitivity.Add(cwSignal.Descriptor);
     foreach (var ms in _strings)
     {
         ms.AssembleDecoder(pbuilder, cwSignal, sensitivity);
     }
     var decFunc = pbuilder.Complete();
     decFunc.Name = "cwdecode";
     binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, decFunc, sensitivity.ToArray());
 }
Beispiel #36
0
 public override void Establish(IAutoBinder binder)
 {
     var shifter = _host;
     shifter.Clk = binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, '0');
     shifter.X = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "X", null, StdLogicVector._0s(shifter.DataWidth));
     shifter.Shift = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "S", null, StdLogicVector._0s(shifter.ShiftWidth));
     shifter.Dir = binder.GetSignal<StdLogicVector>(EPortUsage.Default, "Dir", null, StdLogicVector._0s(1));
     shifter.Y = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "Y", null, StdLogicVector._0s(shifter.DataWidth));
 }
Beispiel #37
0
 /// <summary>
 /// Connects the underlying hardware to its environment by binding its ports to signals
 /// created by a binder service. The default implementation does nothing.
 /// </summary>
 /// <param name="binder">binder service</param>
 public virtual void Establish(IAutoBinder binder)
 {
 }
Beispiel #38
0
            public void Establish(IAutoBinder binder)
            {
                if (_established)
                    return;

                var fna = _host;
                fna.Clk = binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, StdLogic._0);
                fna.DIn = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "DIn", null, StdLogicVector._0s(fna.TotalWidth));
                fna.DOut = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "DOut", null, StdLogicVector._0s(fna.TotalWidth));

                _established = true;
            }
 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');
 }
 public IControlpathBuilder Create(Component host, IAutoBinder binder)
 {
     return new TristateBusFSMControlpathBuilder(host, binder);
 }
Beispiel #41
0
            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;
            }
Beispiel #42
0
 public IInterconnectBuilder Create(Component host, IAutoBinder binder)
 {
     return new StagePlexInterconnectBuilder(host, binder);
 }
Beispiel #43
0
 public SyncProcessBuilder(InlineBCUTransactionSite taSite, IAutoBinder binder)
 {
     _taSite = taSite;
     _binder = binder;
 }
Beispiel #44
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                    return;
                
                var alu = _host;
                alu.Clk = binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, '0');
                alu.A = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(alu.AWidth));
                if (alu.Arity > 1)
                    alu.B = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(alu.BWidth));
                if (alu.FuncSel == ALU.EFunction.Compare)
                {
                    alu.CmpLt = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "IsLt", null, StdLogicVector._0s(1));
                    alu.CmpLte = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "IsLte", null, StdLogicVector._0s(1));
                    alu.CmpEq = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "IsEq", null, StdLogicVector._0s(1));
                    alu.CmpNeq = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "IsNEq", null, StdLogicVector._0s(1));
                    alu.CmpGte = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "IsGte", null, StdLogicVector._0s(1));
                    alu.CmpGt = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "IsGt", null, StdLogicVector._0s(1));
                }
                else
                {
                    alu.R = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(alu.RWidth));
                }

                _established = true;
            }
Beispiel #45
0
 /// <summary>
 /// Classifies a given XIL instruction, such that all instructions which may be mapped to the same type of hardware functional unit
 /// belong to the same group.
 /// </summary>
 /// <param name="instr">XIL instruction</param>
 /// <param name="operandTypes">types of instruction operands</param>
 /// <param name="resultTypes">types of instruction results</param>
 /// <param name="binder">binder service</param>
 /// <returns>Opaque group identifier. Do not make any assumptions on the content or type of the returned object.
 /// The important thing is that any instructions belonging to the same group will see the same object.</returns>
 public object Classify(XILInstr instr, TypeDescriptor[] operandTypes, TypeDescriptor[] resultTypes, IAutoBinder binder)
 {
     var mapping = TryMap(instr, operandTypes, resultTypes, binder);
     if (mapping == null)
         return null;
     if (mapping.ResourceKind == EMappingKind.ExclusiveResource ||
         mapping.ResourceKind == EMappingKind.LightweightResource)
     {
         return new ClassifyCookie(instr);
     }
     else
     {
         return mapping.TASite;
     }
 }
 public override void Establish(IAutoBinder binder)
 {
     var fpu = _host;
     bool haveClk = fpu.Latency > 0;
     if (fpu.Function == EFunction.Multiply)
         haveClk = true;
     if (fpu.Latency > 0)
     {
         fpu.Clk = binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, '0');
     }
     if ((fpu.Function == FloatingPointCore.EFunction.AddSubtract && fpu.AddSubSel == FloatingPointCore.EAddSub.Both) ||
         (fpu.Function == FloatingPointCore.EFunction.Compare && fpu.CompareSel == FloatingPointCore.ECompareOp.Programmable))
         fpu.Operation = binder.GetSignal<StdLogicVector>(EPortUsage.Default, "Operation", null, StdLogicVector._0s(6));
     fpu.A = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(fpu.OperandWidth));
     if (fpu.Arity > 1)
         fpu.B = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(fpu.OperandWidth));
     fpu.Result = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(fpu.ResultWidth));
     if (fpu.HasCE)
         fpu.CE = binder.GetSignal<StdLogic>(EPortUsage.Default, "CE", null, '0');
     if (fpu.HasDivideByZero)
         fpu.DivideByZero = binder.GetSignal<StdLogic>(EPortUsage.Result, "DivideByZero", null, '0');
     if (fpu.HasInvalidOp)
         fpu.InvalidOp = binder.GetSignal<StdLogic>(EPortUsage.Result, "InvalidOp", null, '0');
     if (fpu.HasOperationND)
         fpu.OperationND = binder.GetSignal<StdLogic>(EPortUsage.Default, "OperationND", null, '0');
     if (fpu.HasOperationRFD)
         fpu.OperationRFD = binder.GetSignal<StdLogic>(EPortUsage.Default, "OperationRFD", null, '0');
     if (fpu.HasOverflow)
         fpu.Overflow = binder.GetSignal<StdLogic>(EPortUsage.Result, "Overflow", null, '0');
     if (fpu.HasRdy)
         fpu.Rdy = binder.GetSignal<StdLogic>(EPortUsage.Default, "Rdy", null, '0');
     if (fpu.HasSCLR)
         fpu.SCLR = binder.GetSignal<StdLogic>(EPortUsage.Reset, "SCLR", null, '0');
 }
Beispiel #47
0
            public override void Establish(IAutoBinder binder)
            {
                if (_realized)
                    return;

                _addrBits = MathExt.CeilLog2(_array.ArrayObj.Length);
                _dataBits = Marshal.SerializeForHW(_array.ElementType.GetSampleInstance()).Size;

                _clkI = (SLSignal)binder.GetSignal(EPortUsage.Clock, "Clk", null, null);
                _dataOutI = (SLVSignal)binder.GetSignal(EPortUsage.Default, "memIf_dataOut", null, StdLogicVector._0s(_dataBits));
                _addrI = (SLVSignal)binder.GetSignal(EPortUsage.Default, "memIf_addr", null, StdLogicVector._0s(_addrBits));
                _clk = _clkI.Descriptor;
                _addr = _addrI.Descriptor;
                _dataOut = _dataOutI.Descriptor;

                if (NeedWriteAccess)
                {
                    _wrEnI = (SLSignal)binder.GetSignal(EPortUsage.Default, "memIf_wrEn", null, StdLogic._0);
                    _dataInI = (SLVSignal)binder.GetSignal(EPortUsage.Default, "memIf_dataIn", null, StdLogicVector._0s(_dataBits));
                    _wrEn = _wrEnI.Descriptor;
                    _dataIn = _dataInI.Descriptor;
                }

                var memIfBuilder = new MemIfBuilder(this);
                var memIfAlg = memIfBuilder.GetAlgorithm();
                memIfAlg.Name = "MemIf";
                binder.CreateProcess(Process.EProcessKind.Triggered, memIfAlg, _clk);

                _realized = true;
            }
Beispiel #48
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;
            }
Beispiel #49
0
 public override void Establish(IAutoBinder binder)
 {
     _host.DIn = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "DIn", null, StdLogicVector._0s(_host.InputWidth));
     _host.DOut = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "DOut", null, StdLogicVector._0s(_host.HiOffset - _host.LoOffset + 1));
 }
 public override void AssembleStagedDecoderSync(int[] syms, int selWidth, LiteralReference lrCWSelSlice, 
     IAutoBinder binder, IAlgorithmBuilder pbuilder, bool registered)
 {
     int[] syms0 = syms.Select(i => _encMap0[i - 1]).ToArray();
     int[] syms1 = syms.Select(i => _encMap1[i - 1]).ToArray();
     _encFlow0.AssembleStagedDecoderSync(syms0, selWidth, lrCWSelSlice, binder, pbuilder, registered);
     _encFlow1.AssembleStagedDecoderSync(syms1, selWidth, lrCWSelSlice, binder, pbuilder, registered);
 }
Beispiel #51
0
            public override void Establish(IAutoBinder binder)
            {
                if (_allocated)
                    return;

                _brAltFlagP = (SLVSignal)binder.GetSignal(EPortUsage.Default, "BCU_BrP", null, StdLogicVector._0s(1));
                _brAltFlagN = (SLVSignal)binder.GetSignal(EPortUsage.Default, "BCU_BrN", null, StdLogicVector._1s(1));

                _curState = binder.GetSignal(EPortUsage.State, "BCU_CurState", null, null).Descriptor;
                _tState = _curState.ElementType.CILType;
                Array enumValues = _tState.GetEnumValues();
                int numStates = enumValues.Length;
                object defaultState = Activator.CreateInstance(_tState);
                _incState = binder.GetSignal(EPortUsage.Default, "BCU_IncState", null, defaultState).Descriptor;
                _altState = binder.GetSignal(EPortUsage.Default, "BCU_AltState", null, defaultState).Descriptor;
                _nextState = binder.GetSignal(EPortUsage.Default, "BCU_NextState", null, defaultState).Descriptor;
                IncStateProcessBuilder ispb = new IncStateProcessBuilder(this);
                Function incStateFn = ispb.GetAlgorithm();
                incStateFn.Name = "BCU_IncState";
                binder.CreateProcess(Process.EProcessKind.Triggered, incStateFn, _curState);
                SyncProcessBuilder spb = new SyncProcessBuilder(this, binder);
                Function syncStateFn = spb.GetAlgorithm();
                syncStateFn.Name = "BCU_FSM";
                ISignalOrPortDescriptor sdClock = binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, '0').Descriptor;
                binder.CreateProcess(Process.EProcessKind.Triggered, syncStateFn, sdClock);

                _allocated = true;
            }
 private TristateBusFSMControlpathBuilder(Component host, IAutoBinder binder)
 {
     _host = host;
     _binder = binder;
 }
Beispiel #53
0
        /// <summary>
        /// Tries to map the given XIL instruction to any suitable functional unit. This call will not create any actual hardware. It is used by the
        /// scheduler to query basic instruction metrics, namely initiation interval and latency.
        /// </summary>
        /// <param name="instr">XIL instruction</param>
        /// <param name="operandTypes">operand types of XIL instruction</param>
        /// <param name="resultTypes">result types of XIL instruction</param>
        /// <param name="binder">binder service</param>
        /// <returns>a hardware mapping for the supplied instruction or null if no such exists</returns>
        public IXILMapping TryMap(XILInstr instr, TypeDescriptor[] operandTypes, TypeDescriptor[] resultTypes, IAutoBinder binder)
        {
            var xilsi = instr.CreateStk(new InstructionDependency[0], operandTypes, resultTypes);

            IXILMapping mapping;
            if (_xilMappings.TryGetValue(xilsi, out mapping))
            {
                return mapping;
            }
            IEnumerable<IXILMapper> mappers = _xmm.LookupMappers(instr);
            foreach (IXILMapper mapper in mappers)
            {
                var tas = _taMapLookup.Get(mapper);
                foreach (var ta in tas)
                {
                    var mappings = mapper.TryMap(ta, instr, operandTypes, resultTypes);
                    if (mappings.Any())
                    {
                        mapping = mappings.First();
                        _xilMappings[xilsi] = mapping;
                        return mapping;
                    }
                }
            }
            foreach (IXILMapper mapper in mappers)
            {
                mapping = mapper.TryAllocate(_host, instr, operandTypes, resultTypes, _targetProject);
                if (mapping != null)
                {
                    _taMapLookup.Add(mapper, mapping.TASite);
                    _xilMappings[xilsi] = mapping;
                    return mapping;
                }
            }
            return null;
        }
            public override void Establish(IAutoBinder binder)
            {
                if (_realized)
                    return;

                object constValue;
                var literal = (Literal)_literal;
                if (literal.IsConst(out constValue))
                {
                    var slv = Marshal.SerializeForHW(constValue);
                    _dataOutI = (SLVSignal)binder.GetSignal(EPortUsage.Default, "constSignal_" + constValue.ToString(), null, slv);
                    _dataOut = _dataOutI.Descriptor;
                }
                else
                {
                    bool needRead = true, needWrite = true;
                    var fref = _literal as FieldRef;
                    if (fref != null)
                    {
                        needRead = fref.FieldDesc.IsReadInCurrentContext(Host.Context);
                        needWrite = fref.FieldDesc.IsWrittenInCurrentContext(Host.Context);
                    }

                    var stlit = (IStorableLiteral)_literal;
                    string name = stlit.Name;
                    var valueSample = _literal.Type.GetSampleInstance();
                    _dataBits = Marshal.SerializeForHW(valueSample).Size;

                    _clkI = (SLSignal)binder.GetSignal(EPortUsage.Clock, null, null, null);
                    _clk = _clkI.Descriptor;
                    if (needWrite)
                    {
                        _wrEnI = (SLSignal)binder.GetSignal(EPortUsage.Default, name + "_wrEn", null, StdLogic._0);
                        _wrEn = _wrEnI.Descriptor;
                        _dataInI = (SLVSignal)binder.GetSignal(EPortUsage.Default, name + "_dataIn", null, StdLogicVector._0s(_dataBits));
                        _dataIn = _dataInI.Descriptor;
                    }
                    if (needRead)
                    {
                        _dataOutI = (SLVSignal)binder.GetSignal(EPortUsage.Default, name + "_dataOut", null, StdLogicVector._0s(_dataBits));
                        _dataOut = _dataOutI.Descriptor;
                    }

                    //var apb = new AccessProcessBuilder(this, needRead, needWrite);
                    //var alg = apb.GetAlgorithm();
                    //alg.Name = name + "_process";
                    //binder.CreateProcess(Process.EProcessKind.Triggered, alg, _clk);
                    CommonClockProcess ccp = null;
                    string algName = name + "_process";
                    if (Host.Descriptor.HasAttribute<CommonClockProcess>())
                    {
                        ccp = Host.Descriptor.QueryAttribute<CommonClockProcess>();
                        Host.Descriptor.RemoveChild(ccp.CCProc);
                    }
                    else
                    {
                        ccp = new CommonClockProcess(_clk);
                        Host.Descriptor.AddAttribute(ccp);
                    }
                    ccp.AddAccessor(this, needRead, needWrite);
                    var alg = ccp.FrameBuilder.Complete();
                    alg.Name = algName;
                    ccp.CCProc = binder.CreateProcess(Process.EProcessKind.Triggered, alg, _clk);
                }

                _realized = true;
            }
Beispiel #55
0
 private StagePlexInterconnectBuilder(Component host, IAutoBinder binder)
 {
     _host = host;
     _binder = binder;
     _hcib = (HClustInterconnectBuilder)HClustInterconnectBuilder.Factory.Create(host, binder);
 }
 public override void Establish(IAutoBinder binder)
 {
     if (_host.Latency > 0)
         _host.CLK = binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, '0');
     _host.A = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "A", null, StdLogicVector._0s(_host.Awidth));
     _host.B = binder.GetSignal<StdLogicVector>(EPortUsage.Operand, "B", null, StdLogicVector._0s(_host.Bwidth));
     _host.S = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "S", null, StdLogicVector._0s(_host.OutWidth));
     if (_host.HasBypass)
         _host.BYPASS = binder.GetSignal<StdLogic>(EPortUsage.Default, "bypass", null, '0');
     if (_host.HasCarryIn)
         _host.C_in = binder.GetSignal<StdLogic>(EPortUsage.Default, "c_in", null, '0');
     if (_host.HasCarryOut)
         _host.C_out = binder.GetSignal<StdLogic>(EPortUsage.Default, "c_out", null, '0');
     if (_host.HasCE)
         _host.CE = binder.GetSignal<StdLogic>(EPortUsage.Default, "ce", null, '0');
     if (_host.HasSCLR)
         _host.SCLR = binder.GetSignal<StdLogic>(EPortUsage.Default, "sclr", null, '0');
     if (_host.HasSSET)
         _host.SSET = binder.GetSignal<StdLogic>(EPortUsage.Default, "sset", null, '0');
     //FIXME: What about SINIT?
 }
 public ICRBinderProxy(DefaultDatapathBuilder dpb, IAutoBinder orgBinder)
 {
     _dpb = dpb;
     _orgBinder = orgBinder;
 }
 internal void AssembleStagedDecoderSync(IAutoBinder binder, IAlgorithmBuilder pbuilder, SLVSignal cwSignal, bool registered)
 {
     LiteralReference lrCWSelSlice = null;
     if (SelWidth != 0)
     {
         lrCWSelSlice = new LiteralReference(
             ((ISignal)cwSignal[SelOffset + SelWidth - 1, SelOffset])
                 .ToSignalRef(SignalRef.EReferencedProperty.Cur));
     }
     _encFlow.AssembleStagedDecoderSync(Enumerable.Range(1, _encFlow.NumSymbols).ToArray(),
         SelWidth, lrCWSelSlice, binder, pbuilder, registered);
 }
Beispiel #59
0
            public override void Establish(IAutoBinder binder)
            {
                if (_established)
                    return;

                var cc = _host;
                cc.Ops = (XIn<StdLogicVector[], InOut<StdLogicVector>>)binder.GetSignal(EPortUsage.Operand, "Ops", null,
                    Enumerable.Repeat(StdLogicVector._0s(cc.WordWidth), cc.NumWords).ToArray());
                cc.R = binder.GetSignal<StdLogicVector>(EPortUsage.Result, "R", null, StdLogicVector._0s(cc.OutputWidth));

                _established = true;
            }
        public void CreateStagedDecoder(IAutoBinder binder, SLVSignal cwSignal, SLSignal clkSignal, bool registered)
        {
            var valWordInit = StdLogicVector._0s(_vcf.ValueWordWidth);
            var rcwSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "D1_CW", null, valWordInit);
            var rcwSignalDesc = rcwSignal.Descriptor;
            SLVSignal rrcwSignal = null;
            if (registered)
            {
                rrcwSignal = (SLVSignal)binder.GetSignal(EPortUsage.Default, "D2_CW", null, valWordInit);
            }

            var syncBuilder = new DefaultAlgorithmBuilder();
            syncBuilder.If(clkSignal.ToSignalRef(SignalRef.EReferencedProperty.RisingEdge));

            syncBuilder.Store(rcwSignal.ToSignalRef(SignalRef.EReferencedProperty.Next),
                ((ISignal)cwSignal[_vcf.ValueWordWidth - 1, 0]).ToSignalRef(SignalRef.EReferencedProperty.Cur));
            if (registered)
            {
                syncBuilder.Store(rrcwSignal.ToSignalRef(SignalRef.EReferencedProperty.Next),
                    rcwSignal.ToSignalRef(SignalRef.EReferencedProperty.Cur));
            }

            foreach (var ms in _strings)
            {
                ms.AssembleStagedDecoderSync(binder, syncBuilder, cwSignal, registered);
            }
            syncBuilder.EndIf();
            var syncFunc = syncBuilder.Complete();
            syncFunc.Name = "cwdecode_sync";
            binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkSignal.Descriptor);

            var combBuilder = new DefaultAlgorithmBuilder();
            var sensitivity = new HashSet<ISignalOrPortDescriptor>();
            sensitivity.Add(cwSignal.Descriptor);
            sensitivity.Add(rcwSignalDesc);
            if (registered)
                sensitivity.Add(rrcwSignal.Descriptor);
            foreach (var ms in _strings)
            {
                ms.AssembleStagedDecoderComb(combBuilder, registered ? rrcwSignal : rcwSignal, sensitivity, registered);
            }
            var combFunc = combBuilder.Complete();
            combFunc.Name = "cwdecode_comb";
            binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, combFunc, sensitivity.ToArray());
        }