From: adam Date: Thu, 22 Feb 2007 15:32:00 +0000 (+0100) Subject: update ships for overhaul X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=7bbbd4be446d1426a2cbc34e61dfb42a6f7cfcaa;p=fleet.git update ships for overhaul --- diff --git a/ships/Alu1.ship b/ships/Alu1.ship index baa5662..9c15fd2 100644 --- a/ships/Alu1.ship +++ b/ships/Alu1.ship @@ -16,9 +16,9 @@ ABS: == Fleeterpreter ==================================================== public void service() { if (box_in.dataReadyForShip() && box_inOp.dataReadyForShip()) { - int data = box_in.removeDataForShip(); - int opcode = box_inOp.removeDataForShip(); - switch(opcode) { + long data = box_in.removeDataForShip(); + long opcode = box_inOp.removeDataForShip(); + switch((int)opcode) { case 0: box_out.addDataFromShip(-1 * data); // NEG break; case 1: box_out.addDataFromShip(data+1); // INC diff --git a/ships/Alu2.ship b/ships/Alu2.ship index 14de79f..013748e 100644 --- a/ships/Alu2.ship +++ b/ships/Alu2.ship @@ -44,10 +44,10 @@ public void service() { box_in2.dataReadyForShip() && box_inOp.dataReadyForShip() && box_out.readyForItemFromShip()) { - int a = box_in1.removeDataForShip(); - int b = box_in2.removeDataForShip(); - int op = box_inOp.removeDataForShip(); - switch(op) { + long a = box_in1.removeDataForShip(); + long b = box_in2.removeDataForShip(); + long op = box_inOp.removeDataForShip(); + switch((int)op) { case 0: box_out.addDataFromShip(a+b); // ADD break; case 1: box_out.addDataFromShip(a-b); // SUB diff --git a/ships/Dscratch.ship b/ships/Dscratch.ship index 30d0396..3a95180 100644 --- a/ships/Dscratch.ship +++ b/ships/Dscratch.ship @@ -23,15 +23,15 @@ token out: outWriteDone public void service() { if (box_inReadAddr.dataReadyForShip() && box_outReadData.readyForItemFromShip()) { - box_outReadData.addDataFromShip((int)readMem(box_inReadAddr.removeDataForShip())); + box_outReadData.addDataFromShip(readMem((int)box_inReadAddr.removeDataForShip())); } if (box_inWriteAddr.dataReadyForShip() && box_inWriteData.dataReadyForShip() && box_outWriteDone.readyForItemFromShip()) { - writeMem(box_inWriteAddr.removeDataForShip(), + writeMem((int)box_inWriteAddr.removeDataForShip(), box_inWriteData.removeDataForShip()); - box_outWriteDone.addTokenFromShip(); + box_outWriteDone.addDataFromShip(0); } } diff --git a/ships/Fifo.ship b/ships/Fifo.ship index ff674a4..fde05a3 100644 --- a/ships/Fifo.ship +++ b/ships/Fifo.ship @@ -7,7 +7,7 @@ data out: out == Constants ======================================================== == TeX ============================================================== == Fleeterpreter ==================================================== - private Queue fifo = new LinkedList(); + private Queue fifo = new LinkedList(); public void service() { if (box_in.dataReadyForShip()) { fifo.add(box_in.removeDataForShip()); diff --git a/ships/Halt.ship b/ships/Halt.ship index 12521eb..fd4f755 100644 --- a/ships/Halt.ship +++ b/ships/Halt.ship @@ -9,10 +9,11 @@ token in: in == Fleeterpreter ==================================================== public void service() { - if (!box_in.tokenReadyForShip()) return; - box_in.removeTokenForShip(); - ((Interpreter)getInterpreter()).halt = true; - Log.println(ANSI.yellow(" HALT: ====== halt ship got a token; halting the fleet ======")); + if (!box_in.dataReadyForShip()) return; + box_in.removeDataForShip(); + // FIXME + // ((Interpreter)getInterpreter()).halt = true; + // Log.println(ANSI.yellow(" HALT: ====== halt ship got a token; halting the fleet ======")); } == FleetSim ============================================================== diff --git a/ships/Iscratch.ship b/ships/Iscratch.ship index 0edde7f..98db762 100644 --- a/ships/Iscratch.ship +++ b/ships/Iscratch.ship @@ -29,19 +29,19 @@ data in: inCBD public void service() { if (box_inCBD.dataReadyForShip()) { - int val = box_inCBD.removeDataForShip(); - int addr = val >> 6; - int size = val & 0x3f; - dispatch(addr, size); + long val = box_inCBD.removeDataForShip(); + long addr = val >> 6; + long size = val & 0x3f; + dispatch((int)addr, (int)size); } if (box_inWriteAddr.dataReadyForShip() && box_inWriteData.dataReadyForShip() && box_outWriteDone.readyForItemFromShip()) { Interpreter f = (Interpreter)getFleet(); - writeMem(box_inWriteAddr.removeDataForShip(), + writeMem((int)box_inWriteAddr.removeDataForShip(), box_inWriteData.removeDataForShip()); - box_outWriteDone.addTokenFromShip(); + box_outWriteDone.addDataFromShip(0); } } diff --git a/ships/Lut3.ship b/ships/Lut3.ship index 04d31bb..3ff150a 100644 --- a/ships/Lut3.ship +++ b/ships/Lut3.ship @@ -44,11 +44,11 @@ under input {\tt in3}. box_in2.dataReadyForShip() && box_in3.dataReadyForShip() && box_inLut.dataReadyForShip()) { - int a = box_in1.removeDataForShip(); - int b = box_in2.removeDataForShip(); - int c = box_in3.removeDataForShip(); - int lut = box_inLut.removeDataForShip(); - int ret = 0; + long a = box_in1.removeDataForShip(); + long b = box_in2.removeDataForShip(); + long c = box_in3.removeDataForShip(); + long lut = box_inLut.removeDataForShip(); + long ret = 0; ret |= ((lut & (1<<0))==0) ? 0 : (~a) & (~b) & (~c); ret |= ((lut & (1<<1))==0) ? 0 : ( a) & (~b) & (~c); ret |= ((lut & (1<<2))==0) ? 0 : (~a) & ( b) & (~c); diff --git a/ships/Memory.ship b/ships/Memory.ship new file mode 100644 index 0000000..c8cd957 --- /dev/null +++ b/ships/Memory.ship @@ -0,0 +1,166 @@ +ship: Memory + +== Ports =========================================================== +data in: inCBD +data in: inAddr.read +data in: inAddr.write +data in: inAddr.readMany +data in: inAddr.writeMany +data in: inData +data in: inStride +data in: inCount + +data out: out + +== Fleeterpreter ==================================================== + private long[] mem = new long[0]; + public long readMem(int addr) { return mem[addr]; } + public void writeMem(int addr, long val) { + if (addr >= mem.length) { + long[] newmem = new long[addr * 2 + 1]; + System.arraycopy(mem, 0, newmem, 0, mem.length); + mem = newmem; + } + mem[addr] = val; + } + + public void dispatch(int addr, int size) { + for(int i=addr; i> 6); + base = base & ~(0xffffffff << 18); + int size = (int)launch; + size = size & ~(0xffffffff << 6); + dispatch(base, size); + } + + public void service() { + if (box_inCBD.dataReadyForShip()) { + long val = box_inCBD.removeDataForShip(); + long addr = val >> 6; + long size = val & 0x3f; + dispatch((int)addr, (int)size); + } + if (box_inAddr.dataReadyForShip() && box_out.readyForItemFromShip()) { + Packet packet = box_inAddr.peekPacketForShip(); + if (packet.destination.getDestinationName().equals("read")) { + box_out.addDataFromShip(readMem((int)box_inAddr.removeDataForShip())); + } else if (packet.destination.getDestinationName().equals("write") && box_inData.dataReadyForShip()) { + writeMem((int)box_inAddr.removeDataForShip(), + box_inData.removeDataForShip()); + box_out.addDataFromShip(0); + } + } + } + +== FleetSim ============================================================== + +== FPGA ============================================================== +`include "macros.v" +`define BRAM_ADDR_WIDTH 14 +`define BRAM_DATA_WIDTH `DATAWIDTH +`define BRAM_NAME dscratch_bram +`include "bram.inc" + +module dscratch (clk, + read_addr_r, read_addr_a_, read_addr_d, + read_data_r_, read_data_a, read_data_d_, + write_addr_r, write_addr_a_, write_addr_d, + write_data_r, write_data_a_, write_data_d, + write_done_r_, write_done_a, write_done_d_ + ); + + input clk; + `input(read_addr_r, read_addr_a, read_addr_a_, [(`DATAWIDTH-1):0], read_addr_d) + `output(read_data_r, read_data_r_, read_data_a, [(`DATAWIDTH-1):0], read_data_d_) + `defreg(read_data_d_, [(`DATAWIDTH-1):0], read_data_d) + + `input(write_addr_r, write_addr_a, write_addr_a_, [(`DATAWIDTH-1):0], write_addr_d) + `input(write_data_r, write_data_a, write_data_a_, [(`DATAWIDTH-1):0], write_data_d) + `output(write_done_r, write_done_r_, write_done_a, [(`DATAWIDTH-1):0], write_done_d_) + `defreg(write_done_d_, [(`DATAWIDTH-1):0], write_done_d) + + reg bram_we; + wire bram_we_; + assign bram_we_ = bram_we; + wire [(`BRAM_DATA_WIDTH-1):0] bram_read_data; + reg [(`BRAM_ADDR_WIDTH-1):0] bram_write_address; + wire [(`BRAM_ADDR_WIDTH-1):0] bram_read_address; + reg [(`BRAM_DATA_WIDTH-1):0] bram_write_data; + wire [(`BRAM_DATA_WIDTH-1):0] bram_write_data_; + assign bram_write_data_ = bram_write_data; + `BRAM_NAME mybram(clk, + bram_we_, bram_write_address, + bram_read_address, bram_write_data_, + not_connected, bram_read_data); + + reg send_done; + + reg have_read; initial have_read = 0; + reg read_pending; initial read_pending = 0; + assign bram_read_address = read_addr_d; + + always @(posedge clk) begin + bram_we = 0; + if (send_done) begin + `onwrite(write_done_r, write_done_a) + send_done = 0; + end + end else begin + if (!write_addr_r && write_addr_a) write_addr_a = 0; + if (!write_data_r && write_data_a) write_data_a = 0; + if (write_addr_r && write_data_r) begin + write_addr_a = 1; + write_data_a = 1; + bram_we = 1; + send_done = 1; + bram_write_address = write_addr_d; + bram_write_data = write_data_d; + end + end + + if (read_pending) begin + read_pending <= 0; + have_read <= 1; + read_data_d <= bram_read_data; + end else if (have_read) begin + `onwrite(read_data_r, read_data_a) + have_read <= 0; + end + end else begin + `onread(read_addr_r, read_addr_a) + // ======= Careful with the timing here! ===================== + // We MUST capture bram_read_data on the very next clock since + // read_addr_d is free to change after the next clock + // =========================================================== + read_pending <= 1; + end + end + + end + +endmodule + + +== Constants ======================================================== +== TeX ============================================================== + +== Contributors ========================================================= +Adam Megacz diff --git a/ships/Shift.ship b/ships/Shift.ship index c3c8142..18ef138 100644 --- a/ships/Shift.ship +++ b/ships/Shift.ship @@ -18,8 +18,8 @@ To Do: == Fleeterpreter ==================================================== public void service() { if (box_in.dataReadyForShip() && box_inShift.dataReadyForShip()) { - int val = box_in.removeDataForShip(); - int inShift = box_inShift.removeDataForShip(); + long val = box_in.removeDataForShip(); + long inShift = box_inShift.removeDataForShip(); if (inShift < 0) val = val >> (-1 * inShift); else val = val << inShift; box_out.addDataFromShip(val);