public MinAndMax(IntegerBitWidth bitWidth, bool isSigned)
 {
     Mask = BigInteger.Pow(2, (int)bitWidth) - 1;
     if (isSigned)
     {
         var num = BigInteger.Pow(2, (int)bitWidth - 1);
         Min = -num;
         Max = num - 1;
     }
     else
     {
         Min = 0;
         Max = Mask;
     }
 }
Esempio n. 2
0
        public static LimitedIntegerToken Parse(string value, IntegerBase numBase, IntegerBitWidth bitWidth, bool isSigned, bool isNeg, string rawToken, SourcePosition position, IConfiguration configuration)
        {
            BigInteger val;

            switch (numBase)
            {
            case IntegerBase.Binary: val = value.Replace("b", "").Replace("B", "").BigIntegerFromBinary(); break;

            case IntegerBase.Octal: val = value.Replace("o", "").Replace("O", "").BigIntegerFromOctal(); break;

            case IntegerBase.Decimal: val = BigInteger.Parse(value, NumberStyles.Integer); break;

            case IntegerBase.Hexadecimal: val = BigInteger.Parse(value.Replace("0x", "00").Replace("0X", "00"), NumberStyles.HexNumber); break;

            default:
                throw new ParseException($"Unhandled integer base {numBase}.");
            }
            return(new LimitedIntegerToken(val, bitWidth, isSigned, isNeg, $"{(isNeg ? "-" : "")}{rawToken}", position, configuration));
        }
Esempio n. 3
0
        private LimitedIntegerToken(BigInteger typedValue, IntegerBitWidth bitWidth, bool isSigned, bool isNeg, string rawToken, SourcePosition position, IConfiguration configuration)
            : base(LiteralTokenType.LimitedInteger, (isNeg ? typedValue * -1 : typedValue), rawToken, position)
        {
            if (isNeg)
            {
                typedValue *= -1;
            }
            SignAndBitWidth = new BitWidthAndSignPair(bitWidth, isSigned);
            _minAndMax      = MinAndMaxMap.Instance[SignAndBitWidth];

            if (!(configuration?.IgnoreLimitedIntegerMaxMinRange ?? false))
            {
                if (typedValue < _minAndMax.Min)
                {
                    throw new ParseException($"{typedValue} is less than the minimum of {_minAndMax.Min} for a {bitWidth.GetEnumDescription()}-bit {(isSigned ? "signed" : "unsigned")} {nameof(LimitedIntegerToken)} ");
                }
                else if (typedValue > _minAndMax.Max)
                {
                    throw new ParseException($"{typedValue} is greater than the maximum of {_minAndMax.Max} for a {bitWidth.GetEnumDescription()}-bit {(isSigned ? "signed" : "unsigned")} {nameof(LimitedIntegerToken)} ");
                }
            }
        }
 public BitWidthAndSignPair(IntegerBitWidth bitWidth, bool isSigned = true)
 {
     BitWidth = bitWidth;
     IsSigned = isSigned;
 }