Example #1
0
        private void InstantiateControlLogic()
        {
            var regTypes = new TypeDescriptor[_regsCur.Length];

            for (int i = 0; i < _regIndices.Length; i++)
            {
                int rindex = _regIndices[i];
                if (rindex < 0)
                {
                    continue;
                }

                regTypes[rindex] = _tempRegTypes[i];
            }

            for (int i = 0; i < _regsCur.Length; i++)
            {
                string name = "R" + i + "_cur";
                _regsCur[i]  = _binder.GetSignal(EPortUsage.Default, name, null, regTypes[i].GetSampleInstance());
                name         = "R" + i + "_next";
                _regsNext[i] = _binder.GetSignal(EPortUsage.Default, name, null, regTypes[i].GetSampleInstance());
            }

            var syncTempl             = new SyncTemplate(this);
            var syncFunc              = syncTempl.GetAlgorithm();
            Signal <StdLogic> clkInst = _binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');

            _host.Descriptor.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkInst.Descriptor);
        }
Example #2
0
        public void CreateControlpath(FlowMatrix flowSpec, string procName)
        {
            int    ncsteps = flowSpec.NumCSteps;
            string report  = _mcd.ComputeEncoding(flowSpec, _maxSelWidth);

            _curCW = (SLVSignal)_binder.GetSignal <StdLogicVector>(EPortUsage.Default, "CurCW", null,
                                                                   StdLogicVector._0s(_mcd.CWWidth));
            var clkInst = _binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');

            if (_staged)
            {
                _mcd.CreateStagedDecoder(_binder, _curCW, (SLSignal)clkInst, _registered);
            }
            else
            {
                _mcd.CreateDecoder(_binder, _curCW);
            }
            CreateROM(ncsteps);
            for (int cstep = 0; cstep < ncsteps; cstep++)
            {
                var cw = _mcd.Encode(cstep, flowSpec.GetFlow(cstep));
                _romIf.PreWrite(StdLogicVector.FromUInt((uint)cstep, _pc.Size), cw);
            }

            var syncTempl = new SyncTemplate(this);
            var syncFunc  = syncTempl.GetAlgorithm();

            _binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkInst.Descriptor);

            _host.Descriptor.GetDocumentation().Documents.Add(new Document(procName + "_HMA_report.txt", report));
        }
Example #3
0
        private void InstantiateControlLogic()
        {
            var syncTempl             = new SyncTemplate(this);
            var syncFunc              = syncTempl.GetAlgorithm();
            Signal <StdLogic> clkInst = _binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');

            _host.Descriptor.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkInst.Descriptor);
        }
Example #4
0
 private void InstantiateControlLogic()
 {
     var syncTempl = new SyncTemplate(this);
     var syncFunc = syncTempl.GetAlgorithm();
     Signal<StdLogic> clkInst = _binder.GetSignal<StdLogic>(EPortUsage.Clock, "Clk", null, '0');
     _host.Descriptor.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkInst.Descriptor);
 }
Example #5
0
        private void InstantiateControlLogic()
        {
            int scount = _flowSpec.FlowTargets.Select(t => t.GetTemporaryIndex()).Max() + 1;

            _regIndices = new int[scount];
            for (int i = 0; i < scount; i++)
            {
                _regIndices[i] = -1;
            }

            int curReg = 0;

            for (int i = 0; i < _flowSpec.NumCSteps; i++)
            {
                var pflow = _flowSpec.GetFlow(i);
                foreach (var flow in pflow.Flows)
                {
                    var sflow = flow as SignalFlow;

                    var target = flow.Target;
                    int tindex = flow.Target.GetTemporaryIndex();
                    if (sflow != null)
                    {
                        var source = sflow.Source;
                        int sindex = sflow.Source.GetTemporaryIndex();
                        if (sindex >= 0 && _regIndices[sindex] < 0)
                        {
                            _regIndices[sindex] = curReg++;
                        }
                    }
                }
            }

            int numRegs = curReg;

            _regsCur  = new SignalBase[numRegs];
            _regsNext = new SignalBase[numRegs];
            foreach (var target in _flowSpec.FlowTargets)
            {
                if (!target.IsTemporary())
                {
                    continue;
                }
                int index  = target.GetTemporaryIndex();
                int rindex = _regIndices[index];
                if (rindex < 0)
                {
                    continue;
                }
                if (_regsCur[rindex] != null)
                {
                    continue;
                }

                string name = "R" + rindex + "_cur";
                _regsCur[rindex]  = _binder.GetSignal(EPortUsage.Default, name, null, target.Desc.InitialValue);
                name              = "R" + rindex + "_next";
                _regsNext[rindex] = _binder.GetSignal(EPortUsage.Default, name, null, target.Desc.InitialValue);
            }

            var syncTempl             = new SyncTemplate(this);
            var syncFunc              = syncTempl.GetAlgorithm();
            Signal <StdLogic> clkInst = _binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');

            _host.Descriptor.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkInst.Descriptor);
        }
Example #6
0
        private void InstantiateControlLogic()
        {
            if (_memLookup == null)
            {
                // All registers unused, nothing to instantiate
                return;
            }

            int rcount          = 0;
            int mcount          = 0;
            var regsCur         = new List <SignalBase>();
            var regsNext        = new List <SignalBase>();
            var memInstances    = new List <SimpleDPRAM>();
            var memAddrRSignals = new List <SignalBase>();
            var memAddrWSignals = new List <SignalBase>();
            var memDInSignals   = new List <SignalBase>();
            var memDOutSignals  = new List <SignalBase>();
            var memWrEnSignals  = new List <SignalBase>();

            int scount = _tempRegTypes.Length;

            _idxMap   = Arrays.Same(-1, scount);
            _isMemMap = Arrays.Same(false, scount);

            foreach (var grp in _memLookup)
            {
                if (grp.Count() <= 800000)
                {
                    // Implement as register
                    foreach (int slot in grp)
                    {
                        if (IsUnused(slot))
                        {
                            continue;
                        }

                        _idxMap[slot] = rcount;

                        var    regType = _tempRegTypes[slot];
                        string name    = "R" + rcount + "_cur";
                        var    regCur  = _binder.GetSignal(EPortUsage.Default, name, null, regType.GetSampleInstance());
                        //regCur.Descriptor.TagTemporary(rcount);
                        name = "R" + rcount + "_next";
                        var regNext = _binder.GetSignal(EPortUsage.Default, name, null, regType.GetSampleInstance());
                        //regNext.Descriptor.TagTemporary(rcount);

                        regsCur.Add(regCur);
                        regsNext.Add(regNext);

                        ++rcount;
                    }
                }
                else
                {
                    // Implement as memory
                    foreach (int slot in grp)
                    {
                        _isMemMap[slot] = true;
                        _idxMap[slot]   = mcount;
                    }

                    int rep = grp.Key;

                    string name     = "M" + rcount + "_AddrR";
                    var    sigAddrR = _binder.GetSignal <StdLogicVector>(EPortUsage.Default, name, null, _memAddrs[rep]);
                    name = "M" + rcount + "_AddrW";
                    var sigAddrW = _binder.GetSignal <StdLogicVector>(EPortUsage.Default, name, null, _memAddrs[rep]);
                    name = "M" + rcount + "_DIn";
                    var regType = _tempRegTypes[rep];
                    var sigDIn  = _binder.GetSignal <StdLogicVector>(EPortUsage.Default, name, null, (StdLogicVector)regType.GetSampleInstance());
                    name = "M" + rcount + "_DOut";
                    var sigDOut = _binder.GetSignal <StdLogicVector>(EPortUsage.Default, name, null, (StdLogicVector)regType.GetSampleInstance());
                    name = "M" + rcount + "_WrEn";
                    var sigWrEn = _binder.GetSignal <StdLogic>(EPortUsage.Default, name, null, StdLogic._0);

                    var mem = new SimpleDPRAM(
                        (uint)grp.Count(),
                        (uint)TypeLowering.Instance.GetWireWidth(regType))
                    {
                        Clk     = _binder.GetSignal <StdLogic>(EPortUsage.Clock, null, null, StdLogic._0),
                        RdAddr  = sigAddrR,
                        WrAddr  = sigAddrW,
                        DataIn  = sigDIn,
                        DataOut = sigDOut,
                        WrEn    = sigWrEn
                    };
                    _host.Descriptor.AddChild(mem.Descriptor, "Mem" + rcount);

                    memInstances.Add(mem);
                    memAddrRSignals.Add(sigAddrR);
                    memAddrWSignals.Add(sigAddrW);
                    memDInSignals.Add(sigDIn);
                    memDOutSignals.Add(sigDOut);
                    memWrEnSignals.Add(sigWrEn);

                    ++mcount;
                }
            }

            _regsCur  = regsCur.ToArray();
            _regsNext = regsNext.ToArray();

            _memInstances    = memInstances.ToArray();
            _memAddrRSignals = memAddrRSignals.ToArray();
            _memAddrWSignals = memAddrWSignals.ToArray();
            _memDInSignals   = memDInSignals.ToArray();
            _memDOutSignals  = memDOutSignals.ToArray();
            _memWrSignals    = memWrEnSignals.ToArray();

            var syncTempl             = new SyncTemplate(this);
            var syncFunc              = syncTempl.GetAlgorithm();
            Signal <StdLogic> clkInst = _binder.GetSignal <StdLogic>(EPortUsage.Clock, "Clk", null, '0');

            _binder.CreateProcess(SystemSharp.Components.Process.EProcessKind.Triggered, syncFunc, clkInst.Descriptor);
        }