internal void AssembleDecoder(IAlgorithmBuilder pbuilder, SLVSignal cwSignal, HashSet <ISignalOrPortDescriptor> sensitivity) { if (_encFlow.NumSymbols == 0) { foreach (var target in _targets) { pbuilder.Store(target, LiteralReference.CreateConstant(target.Desc.InitialValue)); } } else if (_encFlow.NumSymbols == 1) { var pflow = _encFlow.BwdEnc[0]; foreach (var flow in pflow.Flows) { ImplementFlow(flow, pbuilder, cwSignal, sensitivity); } } else { var lrCWSelSlice = new LiteralReference( ((ISignal)cwSignal[SelOffset + SelWidth - 1, SelOffset]) .ToSignalRef(SignalRef.EReferencedProperty.Cur)); pbuilder.Switch(lrCWSelSlice); for (int i = 0; i < _encFlow.NumSymbols; i++) { var selValue = StdLogicVector.FromUInt((uint)i, SelWidth); var pflow = _encFlow.BwdEnc[i]; if (i + 1 == _encFlow.NumSymbols) { pbuilder.DefaultCase(); } else { pbuilder.Case(LiteralReference.CreateConstant(selValue)); } foreach (var flow in pflow.Flows) { ImplementFlow(flow, pbuilder, cwSignal, sensitivity); } pbuilder.EndCase(); } pbuilder.EndSwitch(); } }
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(); }
internal void AssembleDecoder(IAlgorithmBuilder pbuilder, SLVSignal cwSignal, HashSet<ISignalOrPortDescriptor> sensitivity) { if (_encFlow.NumSymbols == 0) { foreach (var target in _targets) { pbuilder.Store(target, LiteralReference.CreateConstant(target.Desc.InitialValue)); } } else if (_encFlow.NumSymbols == 1) { var pflow = _encFlow.BwdEnc[0]; foreach (var flow in pflow.Flows) { ImplementFlow(flow, pbuilder, cwSignal, sensitivity); } } else { var lrCWSelSlice = new LiteralReference( ((ISignal)cwSignal[SelOffset + SelWidth - 1, SelOffset]) .ToSignalRef(SignalRef.EReferencedProperty.Cur)); pbuilder.Switch(lrCWSelSlice); for (int i = 0; i < _encFlow.NumSymbols; i++) { var selValue = StdLogicVector.FromUInt((uint)i, SelWidth); var pflow = _encFlow.BwdEnc[i]; if (i + 1 == _encFlow.NumSymbols) pbuilder.DefaultCase(); else pbuilder.Case(LiteralReference.CreateConstant(selValue)); foreach (var flow in pflow.Flows) { ImplementFlow(flow, pbuilder, cwSignal, sensitivity); } pbuilder.EndCase(); } pbuilder.EndSwitch(); } }
public virtual void AssembleStagedDecoderComb( ValueFlowCoder vfc, LiteralReference lrCWSelSlice, IAlgorithmBuilder pbuilder, SLVSignal cwSignal, HashSet<ISignalOrPortDescriptor> sensitivity, bool registered) { if (NumSymbols == 0) { foreach (var target in Targets) { pbuilder.Store(target, LiteralReference.CreateConstant(target.Desc.InitialValue)); } } else if (NumSymbols == 1) { var pflow = BwdEnc[0]; foreach (var flow in pflow.Flows) { ImplementFlow(vfc, flow, pbuilder, cwSignal, sensitivity); } } else { var symbol = registered ? _symbold : _symbol; pbuilder.Switch(symbol.SignalInstance.ToSignalRef(SignalRef.EReferencedProperty.Cur)); for (int i = 0; i < NumSymbols; i++) { var selValue = _selSymbols.GetValue(i); var pflow = BwdEnc[i]; pbuilder.Case(LiteralReference.CreateConstant(selValue)); foreach (var flow in pflow.Flows) { ImplementFlow(vfc, flow, pbuilder, cwSignal, sensitivity); } pbuilder.EndCase(); } var nulls = StdLogicVector._0s(NumSymbols); pbuilder.Case(LiteralReference.CreateConstant(nulls)); { foreach (var target in Targets) { int width = Marshal.SerializeForHW(target.Desc.InitialValue).Size; pbuilder.Store(target, LiteralReference.CreateConstant(StdLogicVector._0s(width))); } } pbuilder.EndCase(); pbuilder.DefaultCase(); { foreach (var target in Targets) { int width = Marshal.SerializeForHW(target.Desc.InitialValue).Size; pbuilder.Store(target, LiteralReference.CreateConstant(StdLogicVector.Xs(width))); } } pbuilder.EndCase(); pbuilder.EndSwitch(); } }
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(); }
public virtual void AssembleStagedDecoderComb( ValueFlowCoder vfc, LiteralReference lrCWSelSlice, IAlgorithmBuilder pbuilder, SLVSignal cwSignal, HashSet <ISignalOrPortDescriptor> sensitivity, bool registered) { if (NumSymbols == 0) { foreach (var target in Targets) { pbuilder.Store(target, LiteralReference.CreateConstant(target.Desc.InitialValue)); } } else if (NumSymbols == 1) { var pflow = BwdEnc[0]; foreach (var flow in pflow.Flows) { ImplementFlow(vfc, flow, pbuilder, cwSignal, sensitivity); } } else { var symbol = registered ? _symbold : _symbol; pbuilder.Switch(symbol.SignalInstance.ToSignalRef(SignalRef.EReferencedProperty.Cur)); for (int i = 0; i < NumSymbols; i++) { var selValue = _selSymbols.GetValue(i); var pflow = BwdEnc[i]; pbuilder.Case(LiteralReference.CreateConstant(selValue)); foreach (var flow in pflow.Flows) { ImplementFlow(vfc, flow, pbuilder, cwSignal, sensitivity); } pbuilder.EndCase(); } var nulls = StdLogicVector._0s(NumSymbols); pbuilder.Case(LiteralReference.CreateConstant(nulls)); { foreach (var target in Targets) { int width = Marshal.SerializeForHW(target.Desc.InitialValue).Size; pbuilder.Store(target, LiteralReference.CreateConstant(StdLogicVector._0s(width))); } } pbuilder.EndCase(); pbuilder.DefaultCase(); { foreach (var target in Targets) { int width = Marshal.SerializeForHW(target.Desc.InitialValue).Size; pbuilder.Store(target, LiteralReference.CreateConstant(StdLogicVector.Xs(width))); } } pbuilder.EndCase(); pbuilder.EndSwitch(); } }