X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Ffleet%2Floops%2FMemoryUtils.java;h=3f0bfe6824d7b8e773b293378071e91a1887f666;hb=9bf010e6a0f48f8f9c28071fe397d8e4c47ea2a3;hp=78d80f0186eb7f613b88a33e7671facd5d07d6f4;hpb=cf8fdbe291499018cbb4edab0447172af20f752d;p=fleet.git diff --git a/src/edu/berkeley/fleet/loops/MemoryUtils.java b/src/edu/berkeley/fleet/loops/MemoryUtils.java index 78d80f0..3f0bfe6 100644 --- a/src/edu/berkeley/fleet/loops/MemoryUtils.java +++ b/src/edu/berkeley/fleet/loops/MemoryUtils.java @@ -2,6 +2,7 @@ package edu.berkeley.fleet.loops; import edu.berkeley.fleet.loops.*; import java.util.concurrent.Semaphore; import java.util.*; +import java.io.*; import java.net.*; import edu.berkeley.fleet.two.*; import edu.berkeley.fleet.fpga.*; @@ -15,98 +16,307 @@ import static edu.berkeley.fleet.api.Predicate.*; public class MemoryUtils { - public static void readMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException { - doMem(true, fp, memory, offset, vals); + public static void readMem(FleetProcess fp, + ShipPool pool, + Ship memory, + long offset, + BitVector[] vals) throws RuntimeException { + doMem(true, fp, pool, memory, offset, vals); } - public static void writeMem(FleetProcess fp, Ship memory, long offset, long[] vals) throws RuntimeException { - doMem(false, fp, memory, offset, long2bv(fp.getFleet(), vals)); + + public static void writeMem(FleetProcess fp, + ShipPool pool, + Ship memory, + long offset, + long[] vals) throws RuntimeException { + doMem(false, fp, pool, memory, offset, long2bv(fp.getFleet(), vals)); } - public static void writeMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException { - doMem(false, fp, memory, offset, vals); + + public static void writeMem(FleetProcess fp, + ShipPool pool, + Ship memory, + long offset, + BitVector[] vals) throws RuntimeException { + doMem(false, fp, pool, memory, offset, vals); } - public static void doMem(final boolean read, final FleetProcess fp, final Ship memory, final long offset, final BitVector[] vals) throws RuntimeException { + + /* + public static void clearMem(FleetProcess fp, + Ship memory, + ShipPool pool, + long offset, + long count) throws RuntimeException { if (fp.getFleet() != memory.getFleet()) throw new RuntimeException("Fleet mismatch"); - final Dock inAddrWrite = memory.getDock("inAddrWrite"); - final Dock inDataWrite = memory.getDock("inDataWrite"); - final Dock inAddrRead = memory.getDock("inAddrRead"); - final Dock out = memory.getDock("out"); - final Dock debugIn = fp.getDebugInputDock(); + Ship counter1 = pool.allocateShip("Counter"); + Ship counter2 = pool.allocateShip("Counter"); + //Ship alu = pool.allocateShip("Alu"); - final Semaphore sem = new Semaphore(12 /* FIXME */); + final Dock debugIn = fp.getDebugInputDock(); - Context ctx = new Context(fp.getFleet()); + CodeBag ctx = new CodeBag(fp.getFleet()); LoopFactory lf; - if (read) { - lf = new LoopFactory(ctx, inAddrRead, 0); + + lf = ctx.loopFactory(counter1.getDock("inOp"), 1); + lf.literal(counter1.getDock("inOp").getConstant("COUNT")); + lf.deliver(); + + lf = ctx.loopFactory(counter1.getDock("in1"), 1); + lf.literal(count); + lf.deliver(); + + lf = ctx.loopFactory(counter1.getDock("in2"), 1); + lf.literal(1); + lf.deliver(); + + lf = ctx.loopFactory(counter1.getDock("out"), 0); + lf.abortLoopIfTorpedoPresent(); + lf.recvToken(); + lf.collect(); + lf.send(memory.getDock("inAddrWrite").getDataDestination()); + + lf = ctx.loopFactory(memory.getDock("inDataWrite"), 0); + lf.literal(0); + lf.abortLoopIfTorpedoPresent(); + lf.deliver(); + + lf = ctx.loopFactory(memory.getDock("inAddrWrite"), 1); + lf.sendToken(counter1.getDock("out").getDataDestination()); + lf = lf.makeNext(0); + lf.abortLoopIfTorpedoPresent(); + lf.recvWord(); + lf.deliver(); + lf.sendToken(counter1.getDock("out").getDataDestination()); + + lf = ctx.loopFactory(memory.getDock("out"), 0); + lf.recvToken(); + lf.recvWord(); + lf.send(counter2.getDock("in2").getDataDestination()); + + lf = ctx.loopFactory(counter2.getDock("inOp"), 1); + lf.literal(counter2.getDock("inOp").getConstant("DROP_C1_V2")); + lf.deliver(); + lf.literal(counter2.getDock("inOp").getConstant("PASS_C1_V2")); + lf.deliver(); + + lf = ctx.loopFactory(counter2.getDock("in2"), 0); + lf.recvWord(); + lf.deliver(); + + fp.sendToken(counter1.getDock("out").getInstructionDestination()); + fp.sendToken(memory.getDock("inDataWrite").getInstructionDestination()); + fp.sendToken(memory.getDock("inAddrWrite").getInstructionDestination()); + fp.sendToken(memory.getDock("out").getInstructionDestination()); + fp.sendToken(counter2.getDock("in2").getInstructionDestination()); + + lf = ctx.loopFactory(counter2.getDock("in1"), 1); + lf.literal(count-1); + lf.deliver(); + lf.literal(1); + lf.deliver(); + + lf = ctx.loopFactory(counter2.getDock("out"), 1); + lf.collect(); + lf.send(debugIn.getDataDestination()); + + pool.releaseShip(counter1); + pool.releaseShip(counter2); + //pool.releaseShip(alu); + } + */ + + public static void doMem(final boolean read, + final FleetProcess fp, + final ShipPool pool, + final Ship memory, + final long offset, + final BitVector[] vals) { + + try { + MemoryOutputStream mos = new MemoryOutputStream(fp, pool, memory, offset, read); + for(int i=0; i ai = new ArrayList(); - ctx.emit(ai); - for(Instruction ins : ai) - fp.sendInstruction(ins); - - new Thread() { - public void run() { try { - for(int i=0; i0) System.exit(-1); } }