From: megacz Date: Mon, 6 Apr 2009 18:28:37 +0000 (-0700) Subject: utilize DeferredBitVector functionality in Fleet implementations X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=c3e9fd16fa102815a1069da13aa8e0366808f049;p=fleet.git utilize DeferredBitVector functionality in Fleet implementations --- diff --git a/src/edu/berkeley/fleet/api/Instruction.java b/src/edu/berkeley/fleet/api/Instruction.java index 145459f..a9698ed 100644 --- a/src/edu/berkeley/fleet/api/Instruction.java +++ b/src/edu/berkeley/fleet/api/Instruction.java @@ -214,18 +214,22 @@ public abstract class Instruction { /** shifts an immediate into the low-order bits of the data latch */ public static class Shift extends Instruction { - public final BitVector immediate; - public Shift(Dock dock, BitVector immediate) { this(dock, Predicate.Default, immediate); } - public Shift(Dock dock, Predicate predicate, BitVector immediate) { + public final DeferredBitVector immediate; + public Shift(Dock dock, DeferredBitVector immediate) { this(dock, Predicate.Default, immediate); } + public Shift(final Dock dock, Predicate predicate, final DeferredBitVector arg) { super(dock, predicate); - this.immediate = immediate; - this.immediate.setImmutable(); - if (immediate.length() != dock.getShip().getFleet().getShiftWidth()) - throw new RuntimeException("attempt to create a Shift instruction with a "+immediate.length()+ - "-bit immediate on a Fleet that uses "+dock.getShip().getFleet().getShiftWidth()+ - "-bit shift instructions"); + this.immediate = new DeferredBitVector() { + public BitVector getBitVector() { + BitVector ret = arg.getBitVector(); + if (ret.length() != dock.getShip().getFleet().getShiftWidth()) + throw new RuntimeException("attempt to create a Shift instruction with a "+ret.length()+ + "-bit immediate on a Fleet that uses "+dock.getShip().getFleet().getShiftWidth()+ + "-bit shift instructions"); + return ret; + } + }; } - public String toString() { return super.toString()+"shift "+immediate; } + public String toString() { return super.toString()+"shift "+immediate.getBitVector(); } } /** a flush instruction */ diff --git a/src/edu/berkeley/fleet/interpreter/InterpreterDock.java b/src/edu/berkeley/fleet/interpreter/InterpreterDock.java index 14fd5b3..40e66b0 100644 --- a/src/edu/berkeley/fleet/interpreter/InterpreterDock.java +++ b/src/edu/berkeley/fleet/interpreter/InterpreterDock.java @@ -190,8 +190,9 @@ class InterpreterDock extends FleetTwoDock { Instruction.Shift shift = (Instruction.Shift)instructions.peek(); for(int i=dataLatch.length()-1; i>=getShip().getFleet().getShiftWidth(); i--) dataLatch.set(i, dataLatch.get(i-getShip().getFleet().getShiftWidth())); + BitVector shift_immediate = shift.immediate.getBitVector(); for(int i=getShip().getFleet().getShiftWidth()-1; i>=0; i--) - dataLatch.set(i, shift.immediate.get(i)); + dataLatch.set(i, shift_immediate.get(i)); break; } else if (instructions.peek() instanceof Instruction.Set) { diff --git a/src/edu/berkeley/fleet/two/FleetTwoFleet.java b/src/edu/berkeley/fleet/two/FleetTwoFleet.java index fea301d..0c84eca 100644 --- a/src/edu/berkeley/fleet/two/FleetTwoFleet.java +++ b/src/edu/berkeley/fleet/two/FleetTwoFleet.java @@ -368,7 +368,7 @@ public abstract class FleetTwoFleet extends Fleet { } else if (d instanceof Shift) { Shift shift = (Shift)d; instr = SHIFT.set(instr); - instr = SHIFT.setval(instr, shift.immediate); + instr = SHIFT.setval(instr, shift.immediate.getBitVector()); } else if (d instanceof Flush) { instr = FLUSH.set(instr);