anchor.diff:  	 
   	 let startA = row*descriptorA.numColumns; // row major
   	 let startB = col*descriptorB.numColumns; // col major layout (pre-transposed)
  -	 let startC = row*descriptorC.numColumns + col; // row major
  +	 let startC = row*descriptorC.numColumns; // + col; // row major
   	 
   	 int i_v = fromInteger(i);
   	 if (timing || verbose) $display($format(fshow(cycles)+fshow("    startDotProd xy=")+fshow(tuple2(row,col))
   	    +fshow(" startA=")+fshow(startA)
   	    +fshow(" startB=")+fshow(startB)
  -	    +fshow(" startC=")+fshow(startC)
  +	    +fshow(" startC=")+fshow(startC+col)
   	    +fshow(" k=")+fshow(i_v)));
   
   	 UInt#(TLog#(K)) in = fromInteger(i);
   	 if (i == 0) begin
  -	    sinkC.vector.start(descriptorC.pointer, pack(truncate(startC>>nshift)), fromInteger(k/n));
  - 	    if (verbose || verbose1) $display($format(fshow(cycles)+fshow("      sinkC[")+fshow(in)+fshow("].start")+fshow(startC)));
  +	    startCFifo.enq(startC);
   	 end
   	 if (i == 0) begin
  -	    sourceA[0].start(descriptorA.pointer, pack(truncate(startA>>nshift)), pack(truncate(descriptorA.numColumns>>nshift)));
  +	    startAFifo.enq(startA);
  +	 end
  +	 colFifo.enq(col);
  +	 //startBFifo.enq(startB);
  +	 if (verbose || verbose1) $display($format(fshow(cycles)+fshow("    sourceB[")+fshow(in)+fshow("].start")+fshow(startB)));
  +      endrule
  +      rule startDotProd2;
  +	 UInt#(TLog#(K)) in = fromInteger(i);
  +	 let col <- toGet(colFifo).get();
  +	 if (i == 0) begin
  +	    let startC <- toGet(startCFifo).get();
  +	    startC = startC + col;
  +	    sinkC.vector.start(descriptorC.pointer, pack(extend(startC>>nshift)), fromInteger(k/n));
  +	    if (verbose || verbose1) $display($format(fshow(cycles)+fshow("      sinkC[")+fshow(in)+fshow("].start")+fshow(startC)));
  +	 end
  +	 if (i == 0) begin
  +	    let startA <- toGet(startAFifo).get();
  +	    sourceA[0].start(descriptorA.pointer, pack(extend(startA>>nshift)), pack(extend(descriptorA.numColumns>>nshift)));
   	    if (verbose || verbose1) $display($format(fshow(cycles)+fshow("    sourceA[0].start")+fshow(startA)));
   	 end
  -	 sourceB[i].start(descriptorB.pointer, pack(truncate(startB>>nshift)), pack(truncate(descriptorB.numColumns>>nshift)));
  -	 if (verbose || verbose1) $display($format(fshow(cycles)+fshow("    sourceB[")+fshow(in)+fshow("].start")+fshow(startB)));
  +	 let startB = col*descriptorB.numColumns; // col major layout (pre-transposed)
  +	 sourceB[i].start(descriptorB.pointer, pack(extend(startB>>nshift)), pack(extend(descriptorB.numColumns>>nshift)));
         endrule
         if (i == 0)
   	 rule finishSourceA;
  
positive.code: 				     Vector#(K, VectorSource#(dsz, Vector#(N, Float))) sourceB,
  				     function Module#(DmaVectorSink#(dsz, Vector#(N, Float))) mkSink(PipeOut#(Vector#(N, Float)) pipe_in)
  				     )(DmaMatrixMultiplyIfc#(addrwidth, dsz))
     provisos (Add#(a__,ObjectOffsetSize,addrwidth)
  	     , Add#(N,n__,K)
  	     , Mul#(N,m__,K)
  	     , Add#(1,0,J)
  	     , Log#(N,nshift)
  
negative.code: 
     method Action start(ObjectPointer pointerA, UInt#(addrwidth) numRowsA, UInt#(addrwidth) numColumnsA,
  		       ObjectPointer pointerB, UInt#(addrwidth) numRowsB, UInt#(addrwidth) numColumnsB,
  		       ObjectPointer pointerC) if (!running);
        XYRangeConfig#(UInt#(addrwidth)) xycfg = XYRangeConfig {xbase: 0, xlimit: numRowsA, xstep: 1,
  							      ybase: 0, ylimit: numRowsB, ystep: fromInteger(k) };
        descriptorA <= MatrixDescriptor { pointer: pointerA, base: 0, numRows: numRowsA, numColumns: numColumnsA};
        descriptorB <= MatrixDescriptor { pointer: pointerB, base: 0, numRows: numRowsB, numColumns: numColumnsB};
        descriptorC <= MatrixDescriptor { pointer: pointerC, base: 0, numRows: numRowsA, numColumns: numRowsB};
        dotprodCount <= numRowsA*numRowsB;
        running <= True;
  
        if (verbose) $display("mm pointerA=%d pointerB=%d pointerC=%d\n", pointerA, pointerB, pointerC);
        if (verbose) $display("mm.start ra=%d ca=%d rb=%d cb=%d dotprodCount=%d", numRowsA, numColumnsA, numRowsB, numColumnsB, dotprodCount);
  