/// <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 ConvertUnsigned(Unsigned src, TypeDescriptor dstType) { Contract.Requires <ArgumentNullException>(dstType != null, "dstType"); if (dstType.CILType.Equals(typeof(Unsigned))) { return(src.Resize(UFix.GetFormat(dstType).IntWidth)); } else if (dstType.CILType.Equals(typeof(UFix))) { return(UFix.FromUnsigned(src.Resize(UFix.GetFormat(dstType).TotalWidth), UFix.GetFormat(dstType).FracWidth)); } else { return(ConvertUnsigned(src, dstType.CILType)); } }
private Unsigned ComputeConstAddress(Array array, long[] indices, uint nword) { MemoryMappedStorage mms = GetDataLayout(array); ArrayMemoryLayout layout = mms.Layout as ArrayMemoryLayout; if (layout.ElementsPerWord > 1) { throw new NotImplementedException("Multiple elements per word not yet implemented"); } MemoryRegion region = mms.Region; IMarshalInfo minfo = region.MarshalInfo; Unsigned addr = mms.BaseAddress; for (int i = 0; i < indices.Length; i++) { Unsigned offs = Unsigned.FromULong((ulong)indices[i] * layout.Strides[i], mms.Region.AddressWidth); addr += offs; } addr += Unsigned.FromUInt(nword, mms.Region.AddressWidth); addr = addr.Resize(mms.Region.AddressWidth); return(addr); }
private static FixFormat Equalize(UFix a, UFix b, out Unsigned an, out Unsigned bn) { an = a._value; bn = b._value; FixFormat dfmt; switch (DesignContext.Instance.FixPoint.ArithSizingMode) { case EArithSizingMode.Safe: dfmt = new FixFormat(false, Math.Max(a.Format.IntWidth, b.Format.IntWidth) + 1, Math.Max(a.Format.FracWidth, b.Format.FracWidth)); an = an.Resize(dfmt.TotalWidth - 1); bn = bn.Resize(dfmt.TotalWidth - 1); if (a.Format.FracWidth > b.Format.FracWidth) bn = bn << (int)(a.Format.FracWidth - b.Format.FracWidth); else if (b.Format.FracWidth > a.Format.FracWidth) an = an << (int)(b.Format.FracWidth - a.Format.FracWidth); return dfmt; case EArithSizingMode.VHDLCompliant: dfmt = new FixFormat(false, Math.Max(a.Format.IntWidth, b.Format.IntWidth) + 1, Math.Max(a.Format.FracWidth, b.Format.FracWidth)); an = an.Resize(dfmt.TotalWidth); bn = bn.Resize(dfmt.TotalWidth); if (a.Format.FracWidth > b.Format.FracWidth) bn = bn << (int)(a.Format.FracWidth - b.Format.FracWidth); else if (b.Format.FracWidth > a.Format.FracWidth) an = an << (int)(b.Format.FracWidth - a.Format.FracWidth); return dfmt; case EArithSizingMode.InSizeIsOutSize: dfmt = a.Format; bn = bn.Resize(dfmt.TotalWidth); if (a.Format.FracWidth > b.Format.FracWidth) bn = bn << (int)(a.Format.FracWidth - b.Format.FracWidth); else if (b.Format.FracWidth > a.Format.FracWidth) an = an << (int)(b.Format.FracWidth - a.Format.FracWidth); return dfmt; default: throw new NotImplementedException(); } }
/// <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 ConvertUnsigned(Unsigned src, TypeDescriptor dstType) { Contract.Requires<ArgumentNullException>(dstType != null, "dstType"); if (dstType.CILType.Equals(typeof(Unsigned))) return src.Resize(UFix.GetFormat(dstType).IntWidth); else if (dstType.CILType.Equals(typeof(UFix))) return UFix.FromUnsigned(src.Resize(UFix.GetFormat(dstType).TotalWidth), UFix.GetFormat(dstType).FracWidth); else return ConvertUnsigned(src, dstType.CILType); }