refactor MarinaPacket
authorAdam Megacz <adam.megacz@sun.com>
Tue, 24 Mar 2009 18:22:12 +0000 (18:22 +0000)
committerAdam Megacz <adam.megacz@sun.com>
Tue, 24 Mar 2009 18:22:12 +0000 (18:22 +0000)
testCode/com/sun/vlsi/chips/marina/test/MarinaPacket.java

index f92e528..ecc531f 100644 (file)
@@ -6,27 +6,37 @@ import com.sun.async.test.ChipModel;
 import com.sun.async.test.JtagTester;
 import com.sun.async.test.NanosimModel;
 
-/** This class encapsulates a "packet" -- a data item in flight plus
- * its tokenhood and path */
+/**
+ * This class encapsulates a "packet" -- a data item in flight plus
+ * its tokenhood and path.
+ *
+ * This should be the only class that knows how to turn a packet into
+ * its constituent parts and vice versa.
+ */
 public class MarinaPacket {
 
+    public static final int PATH_WIDTH   = 14;
+    public static final int WORD_WIDTH   = 37;
+    public static final int PACKET_WIDTH = PATH_WIDTH+WORD_WIDTH+1;
+
     public final BitVector data;
     public final boolean tokenhood;
     public final BitVector path;
 
-    /** "parse" a token from the raw 1+14+37 bits in the north proper stopper */
+    /** "parse" a token from the raw bits in the north proper stopper */
     public MarinaPacket(BitVector singleBitVector) {
-        if (singleBitVector.getNumBits()!=1+14+37)
-            throw new RuntimeException("wrong number of bits!");
-        this.data = new BitVector(37, "marina packet data");
-        this.path = new BitVector(14, "marina packet path");
+        MarinaUtils.expectLength(singleBitVector,PACKET_WIDTH);
+        this.data = new BitVector(WORD_WIDTH, "marina packet data");
+        this.path = new BitVector(PATH_WIDTH, "marina packet path");
         this.tokenhood = !singleBitVector.get(0);
-        for(int i=0; i<14; i++) path.set(i, singleBitVector.get(i+1));
-        for(int i=0; i<37; i++) data.set(i, singleBitVector.get(i+15));
+        for(int i=0; i<PATH_WIDTH; i++) path.set(i, singleBitVector.get(i+1));
+        for(int i=0; i<WORD_WIDTH; i++) data.set(i, singleBitVector.get(i+PATH_WIDTH+1));
     }
 
     /** manually assemble a packet */
     public MarinaPacket(BitVector data, boolean tokenhood, BitVector path) {
+        MarinaUtils.expectLength(data, WORD_WIDTH);
+        MarinaUtils.expectLength(path, PATH_WIDTH);
         this.data = data;
         this.tokenhood = tokenhood;
         this.path = path;
@@ -34,17 +44,17 @@ public class MarinaPacket {
 
     /** convert a packet into a single BitVector, suitable for insertion in the north proper stopper */
     public BitVector toSingleBitVector() {
-        BitVector bv = new BitVector(1+14+37, "marina packet");
+        BitVector bv = new BitVector(PACKET_WIDTH, "marina packet");
         bv.set(0, !tokenhood);
-        for(int i=0; i<14; i++) bv.set(i+1,  path.get(i));
-        for(int i=0; i<37; i++) bv.set(i+15, data.get(i));
+        for(int i=0; i<PATH_WIDTH; i++) bv.set(i+1,            path.get(i));
+        for(int i=0; i<WORD_WIDTH; i++) bv.set(i+PATH_WIDTH+1, data.get(i));
         return bv;
     }
 
     public String toString() {
         return
             "tokenhood="+(tokenhood ? "token" : "data")
-            + ", path[14:1]=" + path.bitReverse().getState()
-            + ", data[37:1]=" + data.bitReverse().getState();
+            + ", path["+PATH_WIDTH+":1]=" + path.bitReverse().getState()
+            + ", data["+WORD_WIDTH+":1]=" + data.bitReverse().getState();
     }
 }
\ No newline at end of file