X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Ffleet%2Ftwo%2FFleetTwoFleet.java;h=7936ad0dcedf2a24c3c6a94e51f49ca812bcd296;hb=8b1a948e7dd11e188ccbed082791aec6338196f9;hp=da3e2f11265bbc1c9c677588599bdb1a710a1eb3;hpb=42514a734f7539d178763f53d487a79f75428886;p=fleet.git diff --git a/src/edu/berkeley/fleet/two/FleetTwoFleet.java b/src/edu/berkeley/fleet/two/FleetTwoFleet.java index da3e2f1..7936ad0 100644 --- a/src/edu/berkeley/fleet/two/FleetTwoFleet.java +++ b/src/edu/berkeley/fleet/two/FleetTwoFleet.java @@ -10,78 +10,222 @@ import static edu.berkeley.fleet.api.Predicate.*; /** common subclass for the "FleetTwo" generation of processors, all 37-bit wide, with AM33 encoding */ public abstract class FleetTwoFleet extends Fleet { - public static final Mask PACKET_TOKEN = new Mask("v................................................."); - public static final Mask PACKET_DATA = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv............"); - public static final Mask PACKET_SIGNAL = new Mask("......................................v..........."); - public static final Mask PACKET_DEST = new Mask(".......................................vvvvvvvvvvv"); - - public static final Mask CBD_SIZE = new Mask("...............................vvvvvv"); - public static final Mask CBD_OFFSET = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv......"); - - public static final int WIDTH_WORD = PACKET_DATA.valmaskwidth; - public static final int WIDTH_PACKET = PACKET_TOKEN.width; - - public static final Mask WHOLE_WORD = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"); - public static final Mask DISPATCH_PATH = new Mask("vvvvvvvvvvv.........................."); - public static final Mask DISPATCH_INSTR = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv"); - public static final Mask I = new Mask("...........1........................."); - public static final Mask OS = new Mask("............1........................"); - public static final Mask P = new Mask(".............vvv....................."); - public static final Mask P_NOT_A = new Mask(".............000....................."); - public static final Mask P_A = new Mask(".............001....................."); - public static final Mask P_NOT_B = new Mask(".............010....................."); - public static final Mask P_B = new Mask(".............011....................."); - public static final Mask P_UNUSED = new Mask(".............100....................."); - public static final Mask P_OLC_ZERO = new Mask(".............101....................."); - public static final Mask P_OLC_NONZERO = new Mask(".............110....................."); - public static final Mask P_ALWAYS = new Mask(".............111....................."); - - public static final Mask SHIFT = new Mask("................00vvvvvvvvvvvvvvvvvvv"); - - public static final Mask TAIL = new Mask("................11..................."); - - public static final Mask MOVE = new Mask("................01..................."); - public static final Mask TI = new Mask("................011.................."); - public static final Mask DI = new Mask("................01.1................."); - public static final Mask FLUSH = new Mask("................01.01................"); - public static final Mask DC = new Mask("................01.11................"); - public static final Mask DO = new Mask("................01...1..............."); - public static final Mask TO = new Mask("................01....1.............."); - public static final Mask PATH_IMMEDIATE = new Mask("................01.....1vvvvvvvvvvvvv"); - public static final Mask PATH_DATA = new Mask("................01.....01............"); - public static final Mask PATH_NOCHANGE = new Mask("................01.....00............"); - - public static final Mask SET_OLC_FROM_IMMEDIATE = new Mask("................101000100......vvvvvv"); - public static final Mask SET_OLC_FROM_DATA_LATCH = new Mask("................101000010............"); - public static final Mask SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................101000001............"); - - public static final Mask SET_ILC_FROM_IMMEDIATE = new Mask("................10010010......0vvvvvv"); - public static final Mask SET_ILC_FROM_INFINITY = new Mask("................10010010......1......"); - public static final Mask SET_ILC_FROM_DATA_LATCH = new Mask("................10010001............."); - - public static final Mask SET_IMMEDIATE = new Mask("................100010.vvvvvvvvvvvvvv"); - public static final Mask SET_IMMEDIATE_EXTEND = new Mask("................100010v.............."); - - public static final Mask SET_FLAGS = new Mask("................100001..............."); - public static final Mask SET_FLAGS_A = new Mask("................100001...vvvvvv......"); - public static final Mask SET_FLAGS_B = new Mask("................100001.........vvvvvv"); - public static final Mask SET_FLAGS_VALUE_A = new Mask("1....."); - public static final Mask SET_FLAGS_VALUE_NOT_A = new Mask(".1...."); - public static final Mask SET_FLAGS_VALUE_B = new Mask("..1..."); - public static final Mask SET_FLAGS_VALUE_NOT_B = new Mask("...1.."); - public static final Mask SET_FLAGS_VALUE_C = new Mask("....1."); - public static final Mask SET_FLAGS_VALUE_NOT_C = new Mask(".....1"); + private final boolean hack = "true".equals(System.getProperty("inverted-dc-bit-hack", "false")); + + public final Mask PACKET_TOKEN; + public final Mask PACKET_IS_TOKEN; + public final Mask PACKET_DATA; + public final Mask PACKET_SIGNAL; + public final Mask PACKET_DEST; + + public final Mask CBD_SIZE; + public final Mask CBD_OFFSET; + + public final Mask WHOLE_WORD; + public final Mask DISPATCH_PATH; + public final Mask DISPATCH_INSTR; + public final Mask NOT_INTERRUPTIBLE; + public final Mask IS_INTERRUPTIBLE; + public final Mask P; + public final Mask P_NOT_A; + public final Mask P_A; + public final Mask P_NOT_B; + public final Mask P_B; + public final Mask P_UNUSED; + public final Mask P_OLC_ZERO; + public final Mask P_OLC_NONZERO; + public final Mask P_ALWAYS; + + public final Mask SHIFT; + + public final Mask TAIL; + public final Mask HEAD; + public final Mask ABORT; + + public final Mask MOVE; + public final Mask TI; + public final Mask DI; + public final Mask FLUSH; + public final Mask DC; + public final Mask DO; + public final Mask TO; + public final Mask PATH_IMMEDIATE; + public final Mask PATH_DATA; + public final Mask PATH_NOCHANGE; + + public final Mask SET_OLC_FROM_IMMEDIATE; + public final Mask SET_OLC_FROM_DATA_LATCH; + public final Mask SET_OLC_FROM_OLC_MINUS_ONE; + + public final Mask SET_ILC_FROM_IMMEDIATE; + public final Mask SET_ILC_FROM_INFINITY; + public final Mask SET_ILC_FROM_DATA_LATCH; + + public final Mask SET_IMMEDIATE; + public final Mask SET_IMMEDIATE_EXTEND; + + public final Mask SET_FLAGS; + public final Mask SET_FLAGS_A; + public final Mask SET_FLAGS_B; + public final Mask SET_FLAGS_VALUE_A; + public final Mask SET_FLAGS_VALUE_NOT_A; + public final Mask SET_FLAGS_VALUE_B; + public final Mask SET_FLAGS_VALUE_NOT_B; + public final Mask SET_FLAGS_VALUE_C; + public final Mask SET_FLAGS_VALUE_NOT_C; + + public final int WIDTH_WORD; + public final int WIDTH_PACKET; + + public final int DataLatch_WIDTH; + private final long mask; + + public FleetTwoFleet() { this(false); } + + public FleetTwoFleet(boolean useInternalEncoding) { + PACKET_TOKEN = new Mask("v................................................."); + PACKET_IS_TOKEN = new Mask("1................................................."); + PACKET_DATA = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv............"); + PACKET_SIGNAL = new Mask("......................................v..........."); + PACKET_DEST = new Mask(".......................................vvvvvvvvvvv"); + + CBD_SIZE = new Mask("...............................vvvvvv"); + CBD_OFFSET = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv......"); + + WHOLE_WORD = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"); + + if (useInternalEncoding) { + + DISPATCH_PATH = new Mask("v...................................."); + DISPATCH_INSTR = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"); + P = new Mask(".vvvvvv.............................."); + P_NOT_A = new Mask(".010001.............................."); + P_A = new Mask(".010010.............................."); + P_NOT_B = new Mask(".010100.............................."); + P_B = new Mask(".011000.............................."); + P_UNUSED = new Mask(".111111.............................."); + P_OLC_ZERO = new Mask(".100000.............................."); + P_OLC_NONZERO = new Mask(".010000.............................."); + P_ALWAYS = new Mask(".000000.............................."); + + HEAD = new Mask(".......1............................."); + ABORT = new Mask("........1......1.........000100000001"); + TAIL = new Mask(".........1..........................."); + + // actually "is interruptible" + NOT_INTERRUPTIBLE = new Mask("...........0....0...................."); + IS_INTERRUPTIBLE = new Mask("...........1....1...................."); + + SHIFT = new Mask("..........1......1vvvvvvvvvvvvvvvvvvv"); + SET_IMMEDIATE = new Mask("..........1......0.....vvvvvvvvvvvvvv"); + SET_IMMEDIATE_EXTEND = new Mask("..........1......0....v.............."); + MOVE = new Mask("............1........................"); + TI = new Mask("............1.....1.................."); + DI = new Mask("............1......1................."); + FLUSH = new Mask("..........1......0.....011..........."); + DC = new Mask("............1.......1................"); + DO = new Mask("............1........1..............."); + TO = new Mask("............1.........1.............."); + PATH_IMMEDIATE = new Mask("............1..........1vvvvvvvvvvvvv"); + PATH_DATA = new Mask("............1..........00............"); + PATH_NOCHANGE = new Mask("............1..........01............"); + + SET_OLC_FROM_OLC_MINUS_ONE = new Mask(".............1..1...................."); + SET_OLC_FROM_DATA_LATCH = new Mask("..............1.11..................."); + SET_OLC_FROM_IMMEDIATE = new Mask("..............1.10.............vvvvvv"); + + SET_ILC_FROM_DATA_LATCH = new Mask("..............1.01..................."); + SET_ILC_FROM_IMMEDIATE = new Mask("..............1.00...........0.vvvvvv"); + SET_ILC_FROM_INFINITY = new Mask("..............1.0............1......."); + + SET_FLAGS = new Mask("...............1....................."); + SET_FLAGS_A = new Mask("...............1...............vvvvvv"); + SET_FLAGS_B = new Mask("...............1.........vvvvvv......"); + + SET_FLAGS_VALUE_A = new Mask(".....1"); + SET_FLAGS_VALUE_NOT_A = new Mask("....1."); + SET_FLAGS_VALUE_B = new Mask("...1.."); + SET_FLAGS_VALUE_NOT_B = new Mask("..1..."); + SET_FLAGS_VALUE_C = new Mask(".1...."); + SET_FLAGS_VALUE_NOT_C = new Mask("1....."); + + } else { + DISPATCH_PATH = new Mask("vvvvvvvvvvv.........................."); + DISPATCH_INSTR = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv"); + NOT_INTERRUPTIBLE = new Mask("...........1........................."); + IS_INTERRUPTIBLE = new Mask("...........0........................."); + P = new Mask(".............vvv....................."); + P_NOT_A = new Mask(".............000....................."); + P_A = new Mask(".............001....................."); + P_NOT_B = new Mask(".............010....................."); + P_B = new Mask(".............011....................."); + P_UNUSED = new Mask(".............100....................."); + P_OLC_ZERO = new Mask(".............101....................."); + P_OLC_NONZERO = new Mask(".............110....................."); + P_ALWAYS = new Mask(".............111....................."); + + SHIFT = new Mask("................00vvvvvvvvvvvvvvvvvvv"); + + ABORT = new Mask("................1100................."); // note: has a predicate! + + HEAD = new Mask("................1110................."); + TAIL = new Mask("................1111................."); + + MOVE = new Mask("................01..................."); + TI = new Mask("................011.................."); + DI = new Mask("................01.1................."); + FLUSH = new Mask("................01.01................"); + DC = new Mask("................01.11................"); + DO = new Mask("................01...1..............."); + TO = new Mask("................01....1.............."); + PATH_IMMEDIATE = new Mask("................01.....1vvvvvvvvvvvvv"); + PATH_DATA = new Mask("................01.....01............"); + PATH_NOCHANGE = new Mask("................01.....00............"); + + SET_OLC_FROM_IMMEDIATE = new Mask("................101000100......vvvvvv"); + SET_OLC_FROM_DATA_LATCH = new Mask("................101000010............"); + SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................101000001............"); + + SET_ILC_FROM_IMMEDIATE = new Mask("................10010010......0vvvvvv"); + SET_ILC_FROM_INFINITY = new Mask("................10010010......1......"); + SET_ILC_FROM_DATA_LATCH = new Mask("................10010001............."); + + SET_IMMEDIATE = new Mask("................100010.vvvvvvvvvvvvvv"); + SET_IMMEDIATE_EXTEND = new Mask("................100010v.............."); + + SET_FLAGS = new Mask("................100001..............."); + SET_FLAGS_A = new Mask("................100001...vvvvvv......"); + SET_FLAGS_B = new Mask("................100001.........vvvvvv"); + + SET_FLAGS_VALUE_A = new Mask("1....."); + SET_FLAGS_VALUE_NOT_A = new Mask(".1...."); + SET_FLAGS_VALUE_B = new Mask("..1..."); + SET_FLAGS_VALUE_NOT_B = new Mask("...1.."); + SET_FLAGS_VALUE_C = new Mask("....1."); + SET_FLAGS_VALUE_NOT_C = new Mask(".....1"); + } + + WIDTH_WORD = PACKET_DATA.valmaskwidth; + WIDTH_PACKET = PACKET_TOKEN.width; + DataLatch_WIDTH = SET_IMMEDIATE.valmaskmax-SET_IMMEDIATE.valmaskmin+1; // FIXME: this is an abstraction breakage + mask = ~(-1L << DataLatch_WIDTH); + } // Misc ////////////////////////////////////////////////////////////////////////////// - public static final long DataLatch_WIDTH = SET_IMMEDIATE.valmaskmax-SET_IMMEDIATE.valmaskmin+1; // FIXME: this is an abstraction breakage - private static final long mask = ~(-1L << DataLatch_WIDTH); - public static boolean isSmallEnoughToFit(long immediate) { + public boolean isSmallEnoughToFit(long immediate) { if ((immediate & ~mask) == 0) return true; if ((immediate | mask) == -1L) return true; return false; } + public boolean isSmallEnoughToFit(BitVector immediate) { + boolean b = immediate.get((int)DataLatch_WIDTH); + for(int i=DataLatch_WIDTH+1; i