1 package net.mograsim.machine.isa;
\r
3 import java.math.BigDecimal;
\r
4 import java.math.BigInteger;
\r
6 import net.mograsim.logic.core.types.Bit;
\r
7 import net.mograsim.logic.core.types.BitVector;
\r
8 import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
\r
9 import net.mograsim.machine.isa.types.AsmNumberFormatException;
\r
11 public class AsmFloatOperand implements AsmOperand
\r
13 private final int size;
\r
14 private final int mantissa;
\r
15 private final int exponent;
\r
17 public AsmFloatOperand(int size)
\r
43 if (size > 128 && size % 32 == 0)
\r
45 exponent = (int) Math.round(Math.log(size) / Math.log(2)) - 13;
\r
46 mantissa = size - exponent - 1;
\r
49 throw new IllegalArgumentException("Illegal floating point size: " + size);
\r
54 public AsmFloatOperand(int exponent, int mantissa)
\r
56 if (exponent < 1 || mantissa < 1)
\r
57 throw new IllegalArgumentException("illegal floating point specification: e=" + exponent + ", m=" + mantissa);
\r
58 this.exponent = exponent;
\r
59 this.mantissa = mantissa;
\r
60 this.size = exponent + mantissa + 1;
\r
64 public int getSize()
\r
70 public BitVector parse(String s) throws AsmNumberFormatException
\r
72 String cleaned = s.replace("_", "").toLowerCase();
\r
73 int len = cleaned.length();
\r
77 return bigDecToBitVector(new BigDecimal(cleaned));
\r
79 catch (NumberFormatException e)
\r
81 throw new AsmNumberFormatException(e, "Error parsing %s: no valid float format", s);
\r
85 BitVector bigDecToBitVector(BigDecimal bi) throws AsmNumberFormatException
\r
87 BigInteger raw = bi.unscaledValue();
\r
88 int mantLen = raw.bitLength();
\r
90 int bitLength = raw.bitLength() - (bi.signum() - 1) / 2;
\r
91 if (bitLength > size)
\r
92 throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size);
\r
93 BitVectorMutator bvm = BitVectorMutator.ofLength(size);
\r
94 for (int i = 0; i < size; i++)
\r
95 bvm.setLSBit(i, Bit.of(raw.testBit(i)));
\r
96 return bvm.toBitVector();
\r