""" Pipeline API. For multi-input and multi-output variants, see multipipe.
Associated development bugs:
+ * http://bugs.libre-riscv.org/show_bug.cgi?id=148
* http://bugs.libre-riscv.org/show_bug.cgi?id=64
* http://bugs.libre-riscv.org/show_bug.cgi?id=57
- Important: see Stage API (stageapi.py) in combination with below
+ Important: see Stage API (stageapi.py) and IO Control API
+ (iocontrol.py) in combination with below. This module
+ "combines" the Stage API with the IO Control API to create
+ the Pipeline API.
+
+ The one critically important key difference between StageAPI and
+ PipelineAPI:
+
+ * StageAPI: combinatorial (NO REGISTERS / LATCHES PERMITTED)
+ * PipelineAPI: synchronous registers / latches get added here
RecordBasedStage:
----------------
m.submodules.fn = fn = NextControl()
fn.valid_o, fn.ready_i, fn.data_o = fifo.readable, fifo.re, fifo.dout
connections = fn._connect_out(self.n, fn=nmoperator.cat)
+ valid_eq, ready_eq, data_o = connections
# ok ok so we can't just do the ready/valid eqs straight:
# first 2 from connections are the ready/valid, 3rd is data.
if self.fwft:
- m.d.comb += connections[:2] # combinatorial on next ready/valid
+ m.d.comb += [valid_eq, ready_eq] # combinatorial on next ready/valid
else:
- m.d.sync += connections[:2] # non-fwft mode needs sync
- data_o = connections[2] # get the data
+ m.d.sync += [valid_eq, ready_eq] # non-fwft mode needs sync
data_o = self._postprocess(data_o) # XXX TBD, does nothing right now
m.d.comb += data_o