X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fadd%2Fiocontrol.py;h=3d823c9ba2d9bcd7b8795e4bfd7dbd115cdacb2b;hb=6bff1a997f3846872cf489c24b5c01426c4dc97c;hp=524bccb50f6d1af8785af14913b53766edabdd04;hpb=2f729947895abc624534ec1f6e368c3f859f35c3;p=ieee754fpu.git diff --git a/src/add/iocontrol.py b/src/add/iocontrol.py index 524bccb5..3d823c9b 100644 --- a/src/add/iocontrol.py +++ b/src/add/iocontrol.py @@ -188,16 +188,17 @@ class PrevControl(Elaboratable): return self.s_ready_o # set dynamically by stage return self._ready_o # return this when not under dynamic control - def _connect_in(self, prev, direct=False, fn=None): + def _connect_in(self, prev, direct=False, fn=None, do_data=True): """ internal helper function to connect stage to an input source. do not use to connect stage-to-stage! """ valid_i = prev.valid_i if direct else prev.valid_i_test + res = [self.valid_i.eq(valid_i), + prev.ready_o.eq(self.ready_o)] + if do_data is False: + return res data_i = fn(prev.data_i) if fn is not None else prev.data_i - return [self.valid_i.eq(valid_i), - prev.ready_o.eq(self.ready_o), - nmoperator.eq(self.data_i, data_i), - ] + return res + [nmoperator.eq(self.data_i, data_i)] @property def valid_i_test(self): @@ -223,7 +224,7 @@ class PrevControl(Elaboratable): return m def eq(self, i): - return [self.data_i.eq(i.data_i), + return [nmoperator.eq(self.data_i, i.data_i), self.ready_o.eq(i.ready_o), self.valid_i.eq(i.valid_i)] @@ -262,26 +263,28 @@ class NextControl(Elaboratable): return self.ready_i & self.d_valid return self.ready_i - def connect_to_next(self, nxt): + def connect_to_next(self, nxt, do_data=True): """ helper function to connect to the next stage data/valid/ready. data/valid is passed *TO* nxt, and ready comes *IN* from nxt. use this when connecting stage-to-stage """ - return [nxt.valid_i.eq(self.valid_o), - self.ready_i.eq(nxt.ready_o), - nmoperator.eq(nxt.data_i, self.data_o), - ] + res = [nxt.valid_i.eq(self.valid_o), + self.ready_i.eq(nxt.ready_o)] + if do_data: + res.append(nmoperator.eq(nxt.data_i, self.data_o)) + return res - def _connect_out(self, nxt, direct=False, fn=None): + def _connect_out(self, nxt, direct=False, fn=None, do_data=True): """ internal helper function to connect stage to an output source. do not use to connect stage-to-stage! """ ready_i = nxt.ready_i if direct else nxt.ready_i_test + res = [nxt.valid_o.eq(self.valid_o), + self.ready_i.eq(ready_i)] + if not do_data: + return res data_o = fn(nxt.data_o) if fn is not None else nxt.data_o - return [nxt.valid_o.eq(self.valid_o), - self.ready_i.eq(ready_i), - nmoperator.eq(data_o, self.data_o), - ] + return res + [nmoperator.eq(data_o, self.data_o)] def elaborate(self, platform): m = Module()