From: adam Date: Mon, 3 Nov 2008 10:03:55 +0000 (+0100) Subject: add Marina code X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=0ab984118577be2cb141ca0652ece7312eeca016;p=fleet.git add Marina code --- diff --git a/src/edu/berkeley/fleet/marina/MarinaDock.java b/src/edu/berkeley/fleet/marina/MarinaDock.java new file mode 100644 index 0000000..158eef7 --- /dev/null +++ b/src/edu/berkeley/fleet/marina/MarinaDock.java @@ -0,0 +1,23 @@ +package edu.berkeley.fleet.marina; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.two.*; + +public class MarinaDock extends FleetTwoDock { + + public Destination getDataDestination() { return null; } + public Destination getInstructionDestination() { return null; } + public int getInstructionFifoSize() { return 0; } + public Path getPath(Destination d,BitVector bv) { return null; } + + private boolean isInput; + public boolean isInputDock() { return isInput; } + public boolean isOutputDock() { return !isInput; } + + public MarinaDock(MarinaShip ship, boolean isInput) { + super(ship, null); + this.isInput = isInput; + ship.addDock(this); + } + +} + diff --git a/src/edu/berkeley/fleet/marina/MarinaFleet.java b/src/edu/berkeley/fleet/marina/MarinaFleet.java new file mode 100644 index 0000000..949acde --- /dev/null +++ b/src/edu/berkeley/fleet/marina/MarinaFleet.java @@ -0,0 +1,40 @@ +package edu.berkeley.fleet.marina; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.two.*; +import edu.berkeley.fleet.*; +import java.util.*; + +public class MarinaFleet extends FleetTwoFleet { + + private MarinaShip fakeShip = new MarinaShip(this); + private MarinaDock onlyDock = new MarinaDock(fakeShip, true); + + public MarinaFleet() { + // use "internal encoding" + super(true); + } + + public BitVector encodeInstruction(Dock dispatchFrom, Instruction instruction) { + return encodeInstruction(instruction, dispatchFrom); + } + + public Iterator iterator() { + return new HashSet().iterator(); + } + + public Ship getShip(String type, int ordinal) { + throw new RuntimeException("not implemented"); + } + + public FleetProcess run(Instruction[] instructions) { + throw new RuntimeException("not implemented"); + } + + public BitVector getDestAddr(Path path) { + return new BitVector(0); + } + + public Dock getOnlyInputDock() { + return onlyDock; + } +} diff --git a/src/edu/berkeley/fleet/marina/MarinaShip.java b/src/edu/berkeley/fleet/marina/MarinaShip.java new file mode 100644 index 0000000..55fd98d --- /dev/null +++ b/src/edu/berkeley/fleet/marina/MarinaShip.java @@ -0,0 +1,22 @@ +package edu.berkeley.fleet.marina; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.two.*; +import java.util.*; + +public class MarinaShip extends FleetTwoShip { + + private HashSet docks = new HashSet(); + + public Iterator iterator() { return (Iterator)(Object)docks.iterator(); } + + private MarinaFleet fleet; + + /*package*/ void addDock(MarinaDock dock) { docks.add(dock); } + + public MarinaShip(MarinaFleet fleet) { + super(fleet, null); + this.fleet = fleet; + } + +} + diff --git a/src/edu/berkeley/fleet/two/FleetTwoFleet.java b/src/edu/berkeley/fleet/two/FleetTwoFleet.java index da3e2f1..0f44bc3 100644 --- a/src/edu/berkeley/fleet/two/FleetTwoFleet.java +++ b/src/edu/berkeley/fleet/two/FleetTwoFleet.java @@ -10,73 +10,190 @@ 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"); + public final Mask PACKET_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 I; + public final Mask OS; + 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 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 long DataLatch_WIDTH; + private final long mask; + + public FleetTwoFleet() { this(false); } + + public FleetTwoFleet(boolean useInternalEncoding) { + PACKET_TOKEN = new Mask("v................................................."); + 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"); + I = new Mask(".................1..................."); + OS = new Mask(".......1............................."); + P = new Mask(".vvvvvv.............................."); + P_NOT_A = new Mask(".100001.............................."); + P_A = new Mask(".100010.............................."); + P_NOT_B = new Mask(".100100.............................."); + P_B = new Mask(".101000.............................."); + P_UNUSED = new Mask(".111111.............................."); + P_OLC_ZERO = new Mask(".010000.............................."); + P_OLC_NONZERO = new Mask(".100000.............................."); + P_ALWAYS = new Mask(".000000.............................."); + + SHIFT = new Mask("..........101111.1vvvvvvvvvvvvvvvvvvv"); + + TAIL = new Mask("................1...................."); + + MOVE = new Mask("..........110111....................."); + TI = new Mask("..........110111..1.................."); + DI = new Mask("..........110111...1................."); + FLUSH = new Mask("..........110111...01................"); + DC = new Mask("..........110111...11................"); + DO = new Mask("..........110111.....1..............."); + TO = new Mask("..........110111......1.............."); + PATH_IMMEDIATE = new Mask("..........110111.......0vvvvvvvvvvvvv"); + PATH_DATA = new Mask("..........110111.......11............"); + PATH_NOCHANGE = new Mask("..........110111.......10............"); + + SET_OLC_FROM_IMMEDIATE = new Mask("..........111101.0.............vvvvvv"); + SET_OLC_FROM_DATA_LATCH = new Mask("..........111101.1..................."); + SET_OLC_FROM_OLC_MINUS_ONE = new Mask("..........111011....................."); + + SET_ILC_FROM_IMMEDIATE = new Mask("..........011111.0...........0.vvvvvv"); + SET_ILC_FROM_INFINITY = new Mask("..........011111.............1......."); + SET_ILC_FROM_DATA_LATCH = new Mask("..........011111.1..................."); + + SET_IMMEDIATE = new Mask("..........101111.0.....vvvvvvvvvvvvvv"); + SET_IMMEDIATE_EXTEND = new Mask("..........101111.0....v.............."); + + SET_FLAGS = new Mask("..........111110....................."); + SET_FLAGS_A = new Mask("..........111110.........vvvvvv......"); + SET_FLAGS_B = new Mask("..........111110...............vvvvvv"); + } else { + DISPATCH_PATH = new Mask("vvvvvvvvvvv.........................."); + DISPATCH_INSTR = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv"); + I = new Mask("...........1........................."); + OS = new Mask("............1........................"); + 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"); + + TAIL = new Mask("................11..................."); + + 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; @@ -190,6 +307,7 @@ public abstract class FleetTwoFleet extends Fleet { throw new RuntimeException("unknown instruction: 0x" + Long.toString(inst, 16)); } + // FIXME: should use BitVector here public long writeInstruction(Instruction d, Dock dispatchFrom) { long instr = 0;