anchor.diff:     Vector#(N,FIFOF#(Bool)) lastFifos <- replicateM(mkFIFOF());
      Vector#(N, PipeOut#(Tuple3#(Bool,Float,Float))) abpipes = map(toPipeOut,abfifos);
   
  -   Vector#(NUM_MACS, Server#(Tuple3#(Maybe#(Float), Float, Float), Tuple2#(Float,Exception))) macs <- replicateM(mkFloatMac(defaultValue));
  -   Vector#(1, FIFOF#(Bit#(TLog#(N)))) chanFifo <- replicateM(mkFIFOF());
  +   Vector#(NUM_MACS, Server#(Tuple2#(Float, Float), Tuple2#(Float,Exception))) muls <- replicateM(mkFloatMultiplier(defaultValue));
  +   Vector#(NUM_MACS, Server#(Tuple2#(Float, Float), Tuple2#(Float,Exception))) adders <- replicateM(mkFloatAdder(defaultValue));
  +   Vector#(1, FIFOF#(Bit#(TLog#(TAdd#(N,1))))) accumChanFifo <- replicateM(mkFIFOF());
  +   Vector#(1, FIFOF#(Bit#(TLog#(N)))) mulChanFifoFifo <- replicateM(mkFIFOF());
      Vector#(N, FIFO#(Float)) accumFifo <- replicateM(mkFIFO());
      Vector#(N, FIFOF#(Float)) resultFifos <- replicateM(mkFIFOF());
   
  
positive.code: module [Module] mkDotProdServer#(UInt#(TLog#(K)) label)(DotProdServer#(N));
  
     let n = valueOf(N);
     Bool verbose = False;
  
     Reg#(UInt#(20)) numEltsReg <- mkReg(0);
     Reg#(UInt#(20)) countInReg <- mkReg(0);
  
negative.code:       endrule
     end
  
     //FIXME: works only for N==2
     rule combine;
        let a <- toGet(resultFifos[0]).get();
        let b <- toGet(resultFifos[1]).get();
        accumChanFifo[0].enq(fromInteger(valueOf(N)));
        adders[0].request.put(tuple2(a, b));
     endrule
     FIFOF#(Float) dotfifo <- mkFIFOF();
     rule dotprod if (accumChanFifo[0].first == fromInteger(valueOf(N)));
        accumChanFifo[0].deq();
        match { .dp, .exc } <- adders[0].response.get();
        dotfifo.enq(dp);
     endrule
     PipeOut#(Float) dotpipe = toPipeOut(dotfifo);
     interface Put request;
        method Action put(Tuple2#(Vector#(N,Float),Vector#(N,Float)) tpl);
  	 Bool isFirst = (countInReg == 0);
  