/*******************************************************************************
* This file is part of logisim-evolution.
*
* logisim-evolution is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* logisim-evolution is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with logisim-evolution. If not, see <http://www.gnu.org/licenses/>.
*
* Original code by Carl Burch (http://www.cburch.com), 2011.
* Subsequent modifications by :
* + Haute École Spécialisée Bernoise
* http://www.bfh.ch
* + Haute École du paysage, d'ingénierie et d'architecture de Genève
* http://hepia.hesge.ch/
* + Haute École d'Ingénierie et de Gestion du Canton de Vaud
* http://www.heig-vd.ch/
* The project is currently maintained by :
* + REDS Institute - HEIG-VD
* Yverdon-les-Bains, Switzerland
* http://reds.heig-vd.ch
*******************************************************************************/
package com.cburch.logisim.circuit;
import com.cburch.logisim.data.Attribute;
import com.cburch.logisim.data.AttributeOption;
import com.cburch.logisim.data.Attributes;
import com.cburch.logisim.data.BitWidth;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.util.StringGetter;
public abstract class RadixOption extends AttributeOption {
private static class Radix10Signed extends RadixOption {
private Radix10Signed() {
super("10signed", Strings.getter("radix10Signed"));
}
@Override
public int getMaxLength(BitWidth width) {
switch (width.getWidth()) {
case 2:
case 3:
case 4:
return 2; // 2..8
case 5:
case 6:
case 7:
return 3; // 16..64
case 8:
case 9:
case 10:
return 4; // 128..512
case 11:
case 12:
case 13:
case 14:
return 5; // 1K..8K
case 15:
case 16:
case 17:
return 6; // 16K..64K
case 18:
case 19:
case 20:
return 7; // 128K..256K
case 21:
case 22:
case 23:
case 24:
return 8; // 1M..8M
case 25:
case 26:
case 27:
return 9; // 16M..64M
case 28:
case 29:
case 30:
return 10; // 128M..512M
case 31:
case 32:
return 11; // 1G..2G
default:
return 1;
}
}
@Override
public String toString(Value value) {
return value.toDecimalString(true);
}
}
private static class Radix10Unsigned extends RadixOption {
private Radix10Unsigned() {
super("10unsigned", Strings.getter("radix10Unsigned"));
}
@Override
public int getMaxLength(BitWidth width) {
switch (width.getWidth()) {
case 4:
case 5:
case 6:
return 2;
case 7:
case 8:
case 9:
return 3;
case 10:
case 11:
case 12:
case 13:
return 4;
case 14:
case 15:
case 16:
return 5;
case 17:
case 18:
case 19:
return 6;
case 20:
case 21:
case 22:
case 23:
return 7;
case 24:
case 25:
case 26:
return 8;
case 27:
case 28:
case 29:
return 9;
case 30:
case 31:
case 32:
return 10;
default:
return 1;
}
}
@Override
public String toString(Value value) {
return value.toDecimalString(false);
}
}
private static class Radix16 extends RadixOption {
private Radix16() {
super("16", Strings.getter("radix16"));
}
@Override
public int getMaxLength(BitWidth width) {
return Math.max(1, (width.getWidth() + 3) / 4);
}
@Override
public String toString(Value value) {
return value.toDisplayString(16);
}
}
private static class Radix2 extends RadixOption {
private Radix2() {
super("2", Strings.getter("radix2"));
}
@Override
public int getMaxLength(BitWidth width) {
int bits = width.getWidth();
if (bits <= 1)
return 1;
return bits + ((bits - 1) / 4);
}
@Override
public int getMaxLength(Value value) {
return value.toDisplayString(2).length();
}
@Override
public String toString(Value value) {
return value.toDisplayString(2);
}
}
private static class Radix8 extends RadixOption {
private Radix8() {
super("8", Strings.getter("radix8"));
}
@Override
public int getMaxLength(BitWidth width) {
return Math.max(1, (width.getWidth() + 2) / 3);
}
@Override
public int getMaxLength(Value value) {
return value.toDisplayString(8).length();
}
@Override
public String toString(Value value) {
return value.toDisplayString(8);
}
}
public static RadixOption decode(String value) {
for (RadixOption opt : OPTIONS) {
if (value.equals(opt.saveName)) {
return opt;
}
}
return RADIX_2;
}
public static final RadixOption RADIX_2 = new Radix2();
public static final RadixOption RADIX_8 = new Radix8();
public static final RadixOption RADIX_10_UNSIGNED = new Radix10Unsigned();
public static final RadixOption RADIX_10_SIGNED = new Radix10Signed();
public static final RadixOption RADIX_16 = new Radix16();
public static final RadixOption[] OPTIONS = { RADIX_2, RADIX_8,
RADIX_10_SIGNED, RADIX_10_UNSIGNED, RADIX_16 };
public static final Attribute<RadixOption> ATTRIBUTE = Attributes
.forOption("radix", Strings.getter("radixAttr"), OPTIONS);
private String saveName;
private StringGetter displayGetter;
private RadixOption(String saveName, StringGetter displayGetter) {
super(saveName, displayGetter);
this.saveName = saveName;
this.displayGetter = displayGetter;
}
public StringGetter getDisplayGetter() {
return displayGetter;
}
public abstract int getMaxLength(BitWidth width);
public int getMaxLength(Value value) {
return getMaxLength(value.getBitWidth());
}
public String getSaveString() {
return saveName;
}
@Override
public String toDisplayString() {
return displayGetter.toString();
}
@Override
public String toString() {
return saveName;
}
public abstract String toString(Value value);
}