+package net.mograsim.machine.isa;\r
+\r
+import java.math.BigInteger;\r
+\r
+import net.mograsim.logic.core.types.Bit;\r
+import net.mograsim.logic.core.types.BitVector;\r
+import net.mograsim.logic.core.types.BitVector.BitVectorMutator;\r
+import net.mograsim.machine.isa.types.AsmNumberFormatException;\r
+\r
+public class AsmIntegerOperand implements AsmOperand\r
+{\r
+ private final int size;\r
+\r
+ public AsmIntegerOperand(int size)\r
+ {\r
+ this.size = size;\r
+ }\r
+\r
+ @Override\r
+ public int getSize()\r
+ {\r
+ return size;\r
+ }\r
+\r
+ @Override\r
+ public BitVector parse(String s) throws AsmNumberFormatException\r
+ {\r
+ String cleaned = s.replace("_", "").toLowerCase();\r
+ int len = cleaned.length();\r
+ BigInteger res;\r
+ try\r
+ {\r
+ if (cleaned.startsWith("0x"))\r
+ res = new BigInteger(cleaned.substring(2), 16);\r
+ else if (cleaned.endsWith("h"))\r
+ res = new BigInteger(cleaned.substring(0, len - 1), 16);\r
+ else if (cleaned.startsWith("0b"))\r
+ res = new BigInteger(cleaned.substring(2), 2);\r
+ else if (cleaned.endsWith("b"))\r
+ res = new BigInteger(cleaned.substring(2), 2);\r
+ else if (cleaned.endsWith("q"))\r
+ res = new BigInteger(cleaned.substring(0, len - 1), 8);\r
+ else\r
+ res = new BigInteger(cleaned);\r
+ }\r
+ catch (NumberFormatException e)\r
+ {\r
+ throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s);\r
+ }\r
+ return bigIntToBitVector(res);\r
+ }\r
+\r
+ BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException\r
+ {\r
+ int bitLength = bi.bitLength() - (bi.signum() - 1) / 2;\r
+ if (bitLength > size)\r
+ throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size);\r
+ BitVectorMutator bvm = BitVectorMutator.ofLength(size);\r
+ for (int i = 0; i < size; i++)\r
+ bvm.setLSBit(i, Bit.of(bi.testBit(i)));\r
+ return bvm.toBitVector();\r
+ }\r
+\r
+ public static void main(String[] args) throws AsmNumberFormatException\r
+ {\r
+ AsmIntegerOperand aio = new AsmIntegerOperand(4);\r
+ System.out.println(aio.parse("0"));\r
+ System.out.println(aio.parse("1"));\r
+ System.out.println(aio.parse("2"));\r
+ System.out.println(aio.parse("3"));\r
+ System.out.println(aio.parse("4"));\r
+ System.out.println(aio.parse("5"));\r
+ System.out.println(aio.parse("6"));\r
+ System.out.println(aio.parse("7"));\r
+ System.out.println(aio.parse("8"));\r
+ System.out.println(aio.parse("9"));\r
+ System.out.println(aio.parse("10"));\r
+ System.out.println(aio.parse("11"));\r
+ System.out.println(aio.parse("12"));\r
+ System.out.println(aio.parse("13"));\r
+ System.out.println(aio.parse("14"));\r
+ System.out.println(aio.parse("15"));\r
+// System.out.println(aio.parse("16"));\r
+ System.out.println(aio.parse("-0"));\r
+ System.out.println(aio.parse("-1"));\r
+ System.out.println(aio.parse("-2"));\r
+ System.out.println(aio.parse("-3"));\r
+ System.out.println(aio.parse("-4"));\r
+ System.out.println(aio.parse("-5"));\r
+ System.out.println(aio.parse("-6"));\r
+ System.out.println(aio.parse("-7"));\r
+ System.out.println(aio.parse("-8"));\r
+// System.out.println(aio.parse("-9"));\r
+ }\r
+}\r