OpenCores
URL https://opencores.org/ocsvn/bluespec_md6/bluespec_md6/trunk

Subversion Repositories bluespec_md6

[/] [bluespec_md6/] [trunk/] [lib/] [bsv/] [BypassFIFO/] [BypassFIFO.bsv] - Rev 9

Go to most recent revision | Compare with Previous | Blame | View Log

package BypassFIFO;

import RWire::*;
import FIFO::*;
import FIFOF::*;

module mkBypassFIFO(FIFO#(a)) provisos (Bits#(a,sa));

RWire#(a) enqw <- mkRWire;
RWire#(a) result <- mkRWire;
RWire#(PrimUnit) deqw <- mkRWire;
FIFOF#(a) the_fifof <- mkUGFIFOF;

rule doResult;
  if (the_fifof.notEmpty)
    result.wset(the_fifof.first());
  else case (enqw.wget()) matches
    tagged Just .r:
      result.wset(r);
    tagged Nothing:
      noAction;
    endcase
endrule

rule doUpdate_enq;
  case (enqw.wget()) matches
    tagged Just .r: 
      if (the_fifof.notEmpty || !isJust(deqw.wget))
        the_fifof.enq(r); 
    tagged Nothing:
      noAction;
  endcase
endrule

rule doUpdate_deq;
  if (isJust(deqw.wget) && the_fifof.notEmpty)
    the_fifof.deq();
endrule

method Action clear();
  the_fifof.clear();
endmethod: clear

method Action enq(val) if (the_fifof.notFull);
  enqw.wset(val);
endmethod: enq

method Action deq() if ((the_fifof.notEmpty || isJust (enqw.wget())));
  deqw.wset(?); // I hate '?'.
endmethod: deq

method first() if (isJust(result.wget));
  return unJust(result.wget);
endmethod: first

endmodule: mkBypassFIFO

module mkBypassSizedFIFO#(Integer x) (FIFO#(a)) provisos (Bits#(a,sa));

RWire#(a) enqw <- mkRWire;
RWire#(a) result <- mkRWire;
RWire#(PrimUnit) deqw <- mkRWire;
FIFOF#(a) the_fifof <- mkUGSizedFIFOF(x);

rule doResult;
  if (the_fifof.notEmpty)
    result.wset(the_fifof.first());
  else case (enqw.wget()) matches
    tagged Just .r:
      result.wset(r);
    tagged Nothing:
      noAction;
    endcase
endrule

rule doUpdate_enq;
  case (enqw.wget()) matches
    tagged Just .r: 
      if (the_fifof.notEmpty || !isJust(deqw.wget))
        the_fifof.enq(r); 
    tagged Nothing:
      noAction;
  endcase
endrule

rule doUpdate_deq;
  if (isJust(deqw.wget) && the_fifof.notEmpty)
    the_fifof.deq();
endrule

method Action clear();
  the_fifof.clear();
endmethod: clear

method Action enq(val) if (the_fifof.notFull);
  enqw.wset(val);
endmethod: enq

method Action deq() if ((the_fifof.notEmpty || isJust (enqw.wget())));
  deqw.wset(?); // I hate '?'.
endmethod: deq

method first() if (isJust(result.wget));
  return unJust(result.wget);
endmethod: first

endmodule

module mkBypassFIFO_old(FIFO#(a)) provisos (Bits#(a,sa));

RWire#(a) enqw <- mkRWire;
RWire#(PrimUnit) deqw <- mkRWire;
FIFOF#(a) the_fifof <- mkUGFIFOF;

rule doUpdate_enq;
  if ((isJust(enqw.wget())) &&
      (the_fifof.notEmpty || (!(isJust(deqw.wget())))))
     //Put into the FIFO if necessary
     the_fifof.enq (unJust(enqw.wget()));
endrule

rule doUpdate_deq;
  if((isJust(deqw.wget())) && (!(isJust(enqw.wget()) || the_fifof.notEmpty)))
     //dequeue if we should
     the_fifof.deq();

endrule

method Action clear();
  the_fifof.clear();
endmethod: clear

method Action enq(val) if (the_fifof.notFull);
  enqw.wset(val);
endmethod: enq

method Action deq() if ((the_fifof.notEmpty || isJust (enqw.wget())));
  deqw.wset(?); // I hate '?'.
endmethod: deq

method first() if ((the_fifof.notEmpty || isJust(enqw.wget())));
  // if it's Empty, then the rwire must be something
  return (the_fifof.notEmpty)? (the_fifof.first()): (unJust (enqw.wget));
endmethod: first

endmodule: mkBypassFIFO_old


//XXX check this for correctness
module mkBypassSizedFIFO_old#(Integer x)(FIFO#(a)) provisos (Bits#(a,sa));

RWire#(a) enqw <- mkRWire;
RWire#(PrimUnit) deqw <- mkRWire;
FIFOF#(a) the_fifof <- mkSizedFIFOF(x);

rule doUpdate;
  //Put into the FIFO if necessary
  if ((isJust(enqw.wget())) &&
      (the_fifof.notEmpty || (!(isJust(deqw.wget())))))
     the_fifof.enq (unJust(enqw.wget()));

  if((isJust(deqw.wget())) && (!(isJust(enqw.wget()) || the_fifof.notEmpty)))
     //dequeue if we should
     the_fifof.deq();

endrule: doUpdate

method Action clear();
  the_fifof.clear();
endmethod: clear

method Action enq(val) if (the_fifof.notFull);
  enqw.wset(val);
endmethod: enq

method Action deq() if (the_fifof.notEmpty || isJust (enqw.wget()));
  deqw.wset(?); // I hate '?'.
endmethod: deq

method first() if (the_fifof.notEmpty || isJust (enqw.wget()));
  // if it's Empty, then the rwire must be something
  return (the_fifof.notEmpty)? (the_fifof.first): (unJust (enqw.wget));
endmethod: first

endmodule: mkBypassSizedFIFO_old

endpackage: BypassFIFO

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.