anchor.diff:     rule duplicateSignal;
         let v = infifo.first;
         infifo.deq();
  -      mul[0].x.enq(v);
  -      mul[1].x.enq(v);
  +      mul[0].x.enq(v[0]);
  +      mul[1].x.enq(v[1]);
      endrule
      
      rule filter_phase;
  
positive.code: interface ChannelSelect;
     interface PipeIn#(Vector#(2, Complex#(Signal))) rfreq;
     interface PipeOut#(Complex#(Signal)) ifreq;
     method Action setCoeff(Bit#(10) addr, Complex#(FixedPoint#(2, 23)) value);
  endinterface
  
  
  module mkChannelSelect#(UInt#(10) decimation)(ChannelSelect)
     provisos(Bits#(CoeffData, a__),
  	    Bits#(ProductData, b__));
     BRAM_Configure cfg = defaultValue;
     cfg.memorySize = 1024;
     BRAM2Port#(UInt#(8), Complex#(FixedPoint#(2,23))) coeffRam0 <- 
         mkBRAM2Server(cfg);
     BRAM2Port#(UInt#(8), Complex#(FixedPoint#(2,23))) coeffRam1 <- 
         mkBRAM2Server(cfg);
     Reg#(UInt#(10)) filterPhase <- mkReg(?);
     FIFO#(Bit#(1)) delayFilterPhase <- mkSizedFIFO(3);  // length > bram read latency
  
  
     FIFOF#(Vector#(2, Signal)) infifo <- mkFIFOF();
     FIFOF#(Vector#(2, Signal)) outfifo <- mkFIFOF();
     Vector#(2, FPCMult) mul <- replicateM(mkFPCMult());
  
     Vector#(2, Reg#(Complex#(Product))) accum <- replicateM(mkReg(?));
  
negative.code: import Pipe::*;
  import FIFO::*;
  import FIFOF::*;
  import SpecialFIFOs::*;
  import BRAM::*;
  import BRAMFIFO::*;
  import Vector::*;
  