package de.gaalop.codegen_verilog.VerilogIR; public class FPValue { private int fractionlength; private int wordlength; private int binarypointposition; private long binaryvalue; private long one = 1; private long signcheck = one << 63; private boolean negative; public FPValue(double f, int length, int fraction) { this.fractionlength = fraction + 1; this.wordlength = length; this.binarypointposition = fraction + 1; long l = (long) (f * Math.pow(2, fraction + 1)); // SignBit ueberpruefen if ((signcheck & l) >>> 63 == one) { negative = true; } else { negative = false; } // genauigkeit vor dem Komma reduzieren long sl = l << (63 - (length)); // sign bit wieder setzen if (negative == false ) { binaryvalue = sl >>> (63 - (length)); } else { // sl = sl >>> (1); sl = (sl >>> 1 | signcheck); binaryvalue = sl >> (63 - (length) - 1); } } // public FPValue(long l, int length, int fraction){} // public FPValue add (FPValue fp){ // if (this.getBinarypointposition() != fp.getBinarypointposition()) // { // if(this.getBinarypointposition()<fp.getBinarypointposition()) { // binaryvalue = binaryvalue << (fp.getBinarypointposition()-getBinarypointposition()) ; // binarypointposition = binarypointposition + (fp.getBinarypointposition()-getBinarypointposition()); // fractionlength = fractionlength + (fp.getBinarypointposition()-getBinarypointposition()); // wordlength = wordlength + (fp.getBinarypointposition()-getBinarypointposition()); // // } // // // } // // // // long result = this.binaryvalue + fp.getBinaryvalue(); // // return null; // // // // // // // } // public double getFloat() { return (double) (binaryvalue / Math.pow(2, fractionlength)); } public long getBinaryvalue64() { return binaryvalue; } public int getBinaryvalue32() { return (int) binaryvalue; } public String getHexString32() { int r =this.getBinaryvalue32(); return Integer.toHexString(r); } public String getHexString64() { return Long.toHexString(binaryvalue); } public void setBinaryvalue(long binaryvalue) { this.binaryvalue = binaryvalue; } public String getFullString() { return getBitSubString(binaryvalue, fractionlength, 63) + " . " + getBitSubString(binaryvalue, 0, fractionlength - 1); } public String getBitSubString(long value, int pos1, int pos2) { long t = 1; long displayMask = t << (pos2); StringBuffer buf = new StringBuffer(100); for (int c = pos1 ; c <= pos2; c++) { buf.append((value & displayMask) == 0 ? '0' : '1'); // value <<= 1; displayMask >>>= 1; if (c % 8 == 0) buf.append(' '); } return buf.toString(); } public int getFractionlength() { return fractionlength; } public void setFractionlength(int fractionlength) { this.fractionlength = fractionlength; } public int getWordlength() { return wordlength; } // public void setWordlength(int wordlength) { // this.wordlength = wordlength; // } public int getBinarypointposition() { return binarypointposition; } public void setBinarypointposition(int binarypointposition) { this.binarypointposition = binarypointposition; } public boolean isNegative() { return negative; } // public void setNegative(boolean negative) { // this.negative = negative; // } }