anchor.diff:     Reg#(UInt#(32)) row <- mkReg(0);
      FIFOF#(UInt#(32)) tagFifo <- mkFIFOF;
   `endif
  +   // perhaps memreadengine could do the labeling
  +   Reg#(Bit#(ObjectOffsetSize)) countReg <- mkReg(0);
  +   Reg#(Bool) firstReg <- mkReg(True);
  +   Reg#(Bool) lastReg  <- mkReg(False);
  +
      method Action start(ObjectPointer h, Bit#(ObjectOffsetSize) a, Bit#(ObjectOffsetSize) l, UInt#(32) tag);
   `ifdef TAGGED_TOKENS
         tagFifo.enq(tag);
   `endif
         vs.start(h,a,l);
  +      countReg <= l;
  +      firstReg <= True;
  +      lastReg <= (l == 1);
      endmethod
      method ActionValue#(Bool) finish;
   `ifdef TAGGED_TOKENS
  
positive.code:    interface Vector aInputs = map(toCountedPut(aTokensPutReg), map(toPut, aFifos));
     interface Vector bInputs = map(toCountedPut(bTokensPutReg), map(toPut, bFifos));
     interface Vector fxPipes = fxPipesN;
     interface Reg numElts;
        method Action _write(UInt#(20) v);
  	 for (Integer i = 0; i < rowsPerTile; i = i+1)
  	    fxdotprods[i].numElts <= v;
        endmethod
        method UInt#(20) _read();
  	 return fxdotprods[0].numElts;
        endmethod
     endinterface
     interface MmTileDebug debug;
        interface PipeOut macCount = macCountPipe;
        method Bit#(RowsPerTile) aNotEmpty(); return pack(map(fifofNotEmpty, aFifos)); endmethod
  
negative.code:    UInt#(32) col;
  `endif
     Float v;
     Bool first;
     Bool last;
     } Token deriving (Eq,Bits);
  
  interface SharedDotProdServer#(numeric type k);
     interface Put#(Token)                 aInput;
     interface Put#(Token)                 bInput;
     interface Vector#(k, PipeOut#(Token)) pipes;
  