1 package net.mograsim.machine.isa;
\r
3 import java.math.BigInteger;
\r
5 import net.mograsim.logic.core.types.Bit;
\r
6 import net.mograsim.logic.core.types.BitVector;
\r
7 import net.mograsim.logic.core.types.BitVector.BitVectorMutator;
\r
8 import net.mograsim.machine.isa.types.AsmNumberFormatException;
\r
10 public class AsmIntegerOperand implements AsmOperand
\r
12 private final int size;
\r
14 public AsmIntegerOperand(int size)
\r
20 public int getSize()
\r
26 public BitVector parse(String s) throws AsmNumberFormatException
\r
28 String cleaned = s.replace("_", "").toLowerCase();
\r
29 int len = cleaned.length();
\r
33 if (cleaned.startsWith("0x"))
\r
34 res = new BigInteger(cleaned.substring(2), 16);
\r
35 else if (cleaned.endsWith("h"))
\r
36 res = new BigInteger(cleaned.substring(0, len - 1), 16);
\r
37 else if (cleaned.startsWith("0b"))
\r
38 res = new BigInteger(cleaned.substring(2), 2);
\r
39 else if (cleaned.endsWith("b"))
\r
40 res = new BigInteger(cleaned.substring(2), 2);
\r
41 else if (cleaned.endsWith("q"))
\r
42 res = new BigInteger(cleaned.substring(0, len - 1), 8);
\r
44 res = new BigInteger(cleaned);
\r
46 catch (NumberFormatException e)
\r
48 throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s);
\r
50 return bigIntToBitVector(res);
\r
53 BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException
\r
55 int bitLength = bi.bitLength() - (bi.signum() - 1) / 2;
\r
56 if (bitLength > size)
\r
57 throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size);
\r
58 BitVectorMutator bvm = BitVectorMutator.ofLength(size);
\r
59 for (int i = 0; i < size; i++)
\r
60 bvm.setLSBit(i, Bit.of(bi.testBit(i)));
\r
61 return bvm.toBitVector();
\r
64 public static void main(String[] args) throws AsmNumberFormatException
\r
66 AsmIntegerOperand aio = new AsmIntegerOperand(4);
\r
67 System.out.println(aio.parse("0"));
\r
68 System.out.println(aio.parse("1"));
\r
69 System.out.println(aio.parse("2"));
\r
70 System.out.println(aio.parse("3"));
\r
71 System.out.println(aio.parse("4"));
\r
72 System.out.println(aio.parse("5"));
\r
73 System.out.println(aio.parse("6"));
\r
74 System.out.println(aio.parse("7"));
\r
75 System.out.println(aio.parse("8"));
\r
76 System.out.println(aio.parse("9"));
\r
77 System.out.println(aio.parse("10"));
\r
78 System.out.println(aio.parse("11"));
\r
79 System.out.println(aio.parse("12"));
\r
80 System.out.println(aio.parse("13"));
\r
81 System.out.println(aio.parse("14"));
\r
82 System.out.println(aio.parse("15"));
\r
83 // System.out.println(aio.parse("16"));
\r
84 System.out.println(aio.parse("-0"));
\r
85 System.out.println(aio.parse("-1"));
\r
86 System.out.println(aio.parse("-2"));
\r
87 System.out.println(aio.parse("-3"));
\r
88 System.out.println(aio.parse("-4"));
\r
89 System.out.println(aio.parse("-5"));
\r
90 System.out.println(aio.parse("-6"));
\r
91 System.out.println(aio.parse("-7"));
\r
92 System.out.println(aio.parse("-8"));
\r
93 // System.out.println(aio.parse("-9"));
\r