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); }
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)); }
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); }
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); }
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); }
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); }