anchor.diff:    provisos(Bits#(CoeffData, a__),
        Bits#(ProductData, b__));
      /* input registers */
  -   Reg#(Complex#(Signal)) xin <- mkReg(?);
  -   Reg#(Bit#(1)) xinvalid <- mkReg(0);
  -   Reg#(CoeffData) ain <- mkReg(?);
  +   FIFOF#(CoeffData) ain <- mkPipelineFIFOF();
  +   FIFOF#(Complex#(Signal)) xin <- mkPipelineFIFOF();
      /* pipeline registers at output of multipliers */
  -   Reg#(Product) arxr <- mkReg(?);
  -   Reg#(Product) aixi <- mkReg(?);
  -   Reg#(Product) arxi <- mkReg(?);
  -   Reg#(Product) aixr <- mkReg(?);
  -   Reg#(Bit#(1)) mulloutvalid <- mkReg(0):
  -   Reg#(Bit#(1)) muloutphase <- mkReg(?);
  +   Reg#(MulData) ax <- mkReg(?);
      /* result registers */
  -   Reg#(ProductData) yout <- mkReg(?);
  -   Reg#(Bit#(1)) youtvalid <- mkReg(0);
  +   FIFOF#(ProductData) yout <- mkPipelineFIFOF();
   
  -   rule work (muloutvalid == 0 || youtvalid == 0);
  +   rule work;
         /* compute multiplies */
  -      arxr <= fxptMult(ain.a.rel, xin.rel);
  -      aixi <= fxptMult(ain.a.img, xin.img);
  -      arxi <= fxptMult(ain.a.rel, xin.img);
  -      aixr <= fxptMult(ain.a.img, xin.rel);
  -      muloutvalid <= 1;
  -      muloutphase <= ain.filterPhase;
  -   endrule
  -   
  -   rule workadd (youtvalid == 0);
  +      Product arxr = fxptMult(ain.a.rel, xin.first.rel);
  +      Product aixi = fxptMult(ain.a.img, xin.first.img);
  +      Product arxi = fxptMult(ain.a.rel, xin.first.img);
  +      Product aixr = fxptMult(ain.a.img, xin.first.rel);
  +      ain.deq();
  +      xin.deq();
  +      ax <= Muldata{arxr: arxr, aixi: aixi, arxi: arxi, aixr: aixr,
  +	 filterPhase ain.filterPhase};
         /* combine into outputs */
  -      yout <= ProductData{y: Complex{rel: arxr - aixi, img: arxi + aixr}, filterPhase: muloutphase};
  +      yout.enq(ProductData{y: Complex{rel: arxr - aixi, img: arxi + aixr}, filterPhase: muloutphase});
      endrule
      
      interface PipeOut y = toPipeOut(yout);
  -   interface PipeIn x;
  -      method Action enq(Complex#(Signal) v);
  -         xin <= v;
  -         xinvalid <= 1;
  -      endmethod
  -      method Bool notFull();
  -         return (xinvalid == 0 || );
  -      endmethod
  -   endinterface
  -   interface PipeIn a;
  -      method Action enq(CoeffData v);
  -         ain <= v;
  -         ainvalid <= 1;
  -      endmethod
  -      method Bool notFull();
  -         return (True);
  -      endmethod
  -   endinterface
  -   
  +   interface PipeIn x = toPipeIn(xin);
  +   interface PipeIn a = toPipeIn(ain);
      
   endmodule
  
positive.code: // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  // SOFTWARE.
  
  import Complex::*;
  import FixedPoint::*;
  import Pipe::*;
  
negative.code: 		Bit#(1) filterPhase;
  		} ProductData;
  
  typedef struct {
  		Product arxr;
  		Product arxr;
  		Product arxr;
  		Product arxr;
  		Bit#(1) filterPhase;
  		} MulData;
  
  interface FPCMult;
     interface PipeIn#(Complex#(Signal)) x;
     interface PipeIn#(CoeffData) a;
  