anchor.diff:        rule finishSink;
   	 $dumpoff();
   	 // each time we write a burst of k values via sinks
  -	 //let index <- toGet(indexpipes[jj+kk+1]).get();
   	 let b <- sinks[j].finish();
   	 let c = dotprodCount-fromInteger(kk);
   	 int jint = fromInteger(j);
  
positive.code:    
     zipWithM(mkConnection, fxpipes, map(getRowColSinkPipe, sinks));
     
     XYRangePipeIfc#(UInt#(addrwidth)) indexpipeifc <- mkXYRangePipeOut();
     XYRangePipeIfc#(UInt#(addrwidth)) offsetpipeA <- mkXYRangePipeOut();
     XYRangePipeIfc#(UInt#(addrwidth)) offsetpipeB <- mkXYRangePipeOut();
     XYRangePipeIfc#(UInt#(addrwidth)) offsetpipeC <- mkXYRangePipeOut();
  
     Vector#(TAdd#(J,K), PipeOut#(Tuple2#(UInt#(addrwidth),UInt#(addrwidth)))) indexpipes <- mkForkVector(indexpipeifc.pipe);
     Vector#(J, PipeOut#(Tuple2#(UInt#(addrwidth),UInt#(addrwidth))))        offsetpipesA <- mkForkVector(offsetpipeA.pipe);
     Vector#(K, PipeOut#(Tuple2#(UInt#(addrwidth),UInt#(addrwidth))))        offsetpipesB <- mkForkVector(offsetpipeB.pipe);
     Vector#(J, PipeOut#(Tuple2#(UInt#(addrwidth),UInt#(addrwidth))))        offsetpipesC <- mkForkVector(offsetpipeC.pipe);
  
negative.code:       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);
        if (verbose) $display($format(fshow("mm.start ")+fshow(indexcfg)));
        if (timing || verbose || tagging)
  	 indexpipeifc.start(indexcfg);
        offsetpipeA.start(offsetcfgA);
        offsetpipeB.start(offsetcfgB);
        offsetpipeC.start(offsetcfgC);
  