anchor.diff:          deqReq[1] <= False;
       endmethod
   
  +    method Bool notEmpty if (!isValid(enqReq[0]) && !deqReq[0]);
  +        return !empty;
  +    endmethod
  +    method Bool notFull if (!isValid(enqReq[0]) && !deqReq[0]);
  +        return !full;
  +    endmethod
  +
       // different search implementations
       // search < {enq, deq}
       method Bool search(searchType x) if (!isValid(enqReq[0]) && !deqReq[0]);
  
positive.code:             enqueued = True;
              nextEnqP = (enqP == fromInteger(valueOf(size) - 1)) ? 0 : enqP + 1;
              // perform state updates
              data[enqP] <= tagged Valid enqVal;
              enqP <= nextEnqP;
          end
  
          // dequeue logic
  
negative.code:     method Action deq;
      method dataType first;
      method Action clear;
      method Bool notEmpty;
      method Bool notFull;
      method Bool search(searchType x);
  endinterface
  
  // {search, notEmpty, notFull} < {enq , deq} < clear
  // first < deq
  module mkSearchFIFO#(function Bool isMatch(searchType s, dataType d))(SearchFIFO#(size, dataType, searchType)) provisos (Bits#(dataType, dataSize));
      // use valid bits to make search logic smaller
  