From 1dba2c229ab095375b0a91122381940ad23cf678 Mon Sep 17 00:00:00 2001 From: Adam Megacz Date: Sat, 29 Aug 2009 16:05:05 -0700 Subject: [PATCH] fix Counter.ship software implementation to exactly match semantics of FPGA --- ships/Counter.ship | 70 +++++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/ships/Counter.ship b/ships/Counter.ship index 05f98a9..37aa452 100644 --- a/ships/Counter.ship +++ b/ships/Counter.ship @@ -31,60 +31,68 @@ boolean op_c2 = false; boolean op_v1 = false; boolean op_v2 = false; long temp = 0; +boolean out_draining; public void reset() { super.reset(); full = false; temp = 0; + out_draining = false; } public void service() { - if (full) { - if (temp < 0) { - temp = 0; - full = false; + if (!box_inOp.dataReadyForShip()) full = false; - // ugly hack due to mishandling of resets - if (box_inOp.dataReadyForShip()) box_inOp.removeDataForShip(); + if (out_draining && box_out.readyForDataFromShip()) { + if (op_count) temp = temp - box_in2.peekDataForShip(); + else temp--; + if (op_pass && op_v1) box_in1.removeDataForShip(); + if (op_pass && op_v2) box_in2.removeDataForShip(); + out_draining = false; + } else if (box_inOp.dataReadyForShip()) { + long op = box_inOp.peekDataForShip(); + op_count = (op & 15)==12; + op_repeat = ((op>>2) & 3)==0; + op_pass = ((op>>2) & 3)==1; + op_drop = ((op>>2) & 3)==2; + op_c1 = (op_repeat || op_pass || op_drop) && !(((op>>1)&1)!=0); + op_c2 = (op_repeat || op_pass || op_drop) && (((op>>1)&1)!=0); + op_v1 = (op_repeat || op_pass || op_drop) && !(((op>>0)&1)!=0); + op_v2 = (op_repeat || op_pass || op_drop) && (((op>>0)&1)!=0); + if (!full) { + if (op_count && box_in1.dataReadyForShip() && box_in2.dataReadyForShip()) { + temp = box_in1.peekDataForShip() - box_in2.peekDataForShip(); + box_in1.removeDataForShip(); + full = true; + } else if (op_c1 && box_in1.dataReadyForShip()) { + temp = box_in1.peekDataForShip() - 1; + box_in1.removeDataForShip(); + full = true; + } else if (op_c2 && box_in2.dataReadyForShip()) { + temp = box_in2.peekDataForShip() - 1; + box_in2.removeDataForShip(); + full = true; + } + } else if (temp < 0) { + full = false; + box_inOp.removeDataForShip(); if (op_count) box_in2.removeDataForShip(); else if (op_repeat && op_v1) box_in1.removeDataForShip(); else if (op_repeat && op_v2) box_in2.removeDataForShip(); } else if (box_out.readyForDataFromShip()) { if (op_count) { + out_draining = true; box_out.addDataFromShip(temp, (temp - box_in2.peekDataForShip()) < 0); - temp = temp - box_in2.peekDataForShip(); } else if (op_v1 && box_in1.dataReadyForShip()) { if (op_drop) { box_in1.removeDataForShip(); temp--; } - else { box_out.addDataFromShip(op_pass ? box_in1.removeDataForShip() : box_in1.peekDataForShip(), temp<=0); temp--; } + else { box_out.addDataFromShip(box_in1.peekDataForShip(), temp<=0); out_draining = true; } } else if (op_v2 && box_in2.dataReadyForShip()) { if (op_drop) { box_in2.removeDataForShip(); temp--; } - else { box_out.addDataFromShip(op_pass ? box_in2.removeDataForShip() : box_in2.peekDataForShip(), temp<=0); temp--; } + else { box_out.addDataFromShip(box_in2.peekDataForShip(), temp<=0); out_draining = true; } } - } - - } else if (box_inOp.dataReadyForShip()) { - long op = box_inOp.peekDataForShip(); - op_count = (op & 15)==12; - op_repeat = ((op>>2) & 3)==0; - op_pass = ((op>>2) & 3)==1; - op_drop = ((op>>2) & 3)==2; - op_c1 = (op_repeat || op_pass || op_drop) && !(((op>>1)&1)!=0); - op_c2 = (op_repeat || op_pass || op_drop) && (((op>>1)&1)!=0); - op_v1 = (op_repeat || op_pass || op_drop) && !(((op>>0)&1)!=0); - op_v2 = (op_repeat || op_pass || op_drop) && (((op>>0)&1)!=0); - - if (op_count && (!box_in1.dataReadyForShip() || !box_in2.dataReadyForShip())) return; - if (op_c1 && !box_in1.dataReadyForShip()) return; - if (op_c2 && !box_in2.dataReadyForShip()) return; - - full = true; - - if (op_count) temp = box_in1.removeDataForShip() - box_in2.peekDataForShip(); - if (op_c1) temp = box_in1.removeDataForShip()-1; - if (op_c2) temp = box_in2.removeDataForShip()-1; } } -- 1.7.10.4