From bc1d077e62f5c37255997067402596c4af5a9bb8 Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 3 Nov 2008 11:18:57 +0100 Subject: [PATCH] add src/edu/berkeley/fleet/ir/Gadgets.java --- src/edu/berkeley/fleet/ir/Gadgets.java | 241 ++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 src/edu/berkeley/fleet/ir/Gadgets.java diff --git a/src/edu/berkeley/fleet/ir/Gadgets.java b/src/edu/berkeley/fleet/ir/Gadgets.java new file mode 100644 index 0000000..d2aa279 --- /dev/null +++ b/src/edu/berkeley/fleet/ir/Gadgets.java @@ -0,0 +1,241 @@ +package edu.berkeley.fleet.ir; +import java.util.concurrent.Semaphore; +import java.util.*; +import java.net.*; +import edu.berkeley.fleet.two.*; +import edu.berkeley.fleet.fpga.*; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.Instruction.*; +import edu.berkeley.fleet.api.Instruction.Set; +import edu.berkeley.fleet.api.Instruction.Set.*; +import edu.berkeley.fleet.ir.Context.LoopFactory; +import static edu.berkeley.fleet.util.BitManipulations.*; +import edu.berkeley.fleet.api.Instruction.Set.FlagFunction; +import edu.berkeley.fleet.api.Instruction.Set; +import edu.berkeley.fleet.api.Instruction.Set.SetDest; +import edu.berkeley.fleet.api.Instruction.Set.FlagFunction; +import static edu.berkeley.fleet.api.Predicate.*; +import edu.berkeley.fleet.ir.Context.LoopFactory; + +/* + - Change Alu behavior to "drain one" + - DROP1, DROP2 + - secondary DDR chip + - facility for launching and Concluding a context + - implement the merge operation and test it + - test case for DRAM ship + - hideously ugly hacks in Verilog.java! + - dispatch ALWAYS needs to go via memory first, unless transmissions to + debugIn are flow-controlled properly + - current write-to-mem transformation screws up -- it can clog + */ + +public class Gadgets { + + public static void readMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException { + doMem(true, fp, memory, offset, vals); + } + public static void writeMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException { + doMem(false, fp, memory, offset, vals); + } + public static void doMem(final boolean read, final FleetProcess fp, final Ship memory, final long offset, final BitVector[] vals) 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(); + + final Semaphore sem = new Semaphore(12 /* FIXME */); + + Context ctx = new Context(fp.getFleet()); + LoopFactory lf; + if (read) { + lf = ctx.new LoopFactory(inAddrRead, 0); + lf.abortLoopIfTorpedoPresent(); + lf.recvWord(); + lf.deliver(); + } else { + lf = ctx.new LoopFactory(inAddrWrite, 0); + lf.abortLoopIfTorpedoPresent(); + lf.recvWord(); + lf.deliver(); + lf = ctx.new LoopFactory(inDataWrite, 0); + lf.abortLoopIfTorpedoPresent(); + lf.recvWord(); + lf.deliver(); + } + + lf = ctx.new LoopFactory(out, 0); + lf.abortLoopIfTorpedoPresent(); + lf.collectWord(); + lf.sendWord(debugIn.getDataDestination()); + + lf = ctx.new LoopFactory(debugIn, 0); + lf.abortLoopIfTorpedoPresent(); + lf.recvWord(); + lf.deliver(); + + ArrayList ai = new ArrayList(); + ctx.emit(ai); + for(Instruction ins : ai) + fp.sendInstruction(ins); + + new Thread() { + public void run() { try { + for(int i=0; i