Added machine plugin project to repository
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / isa / AsmIntegerOperand.java
1 package net.mograsim.machine.isa;\r
2 \r
3 import java.math.BigInteger;\r
4 \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
9 \r
10 public class AsmIntegerOperand implements AsmOperand\r
11 {\r
12         private final int size;\r
13 \r
14         public AsmIntegerOperand(int size)\r
15         {\r
16                 this.size = size;\r
17         }\r
18 \r
19         @Override\r
20         public int getSize()\r
21         {\r
22                 return size;\r
23         }\r
24 \r
25         @Override\r
26         public BitVector parse(String s) throws AsmNumberFormatException\r
27         {\r
28                 String cleaned = s.replace("_", "").toLowerCase();\r
29                 int len = cleaned.length();\r
30                 BigInteger res;\r
31                 try\r
32                 {\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
43                         else\r
44                                 res = new BigInteger(cleaned);\r
45                 }\r
46                 catch (NumberFormatException e)\r
47                 {\r
48                         throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s);\r
49                 }\r
50                 return bigIntToBitVector(res);\r
51         }\r
52 \r
53         BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException\r
54         {\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
62         }\r
63 \r
64         public static void main(String[] args) throws AsmNumberFormatException\r
65         {\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
94         }\r
95 }\r