[libre-riscv-dev] [Bug 50] nmigen pinmux
bugzilla-daemon at libre-riscv.org
bugzilla-daemon at libre-riscv.org
Fri Apr 26 12:01:57 BST 2019
http://bugs.libre-riscv.org/show_bug.cgi?id=50
--- Comment #1 from Luke Kenneth Casson Leighton <lkcl at lkcl.net> ---
On Fri, Apr 26, 2019 at 11:25 AM Rishabh Jain <rishucoding at gmail.com> wrote:
>
> hi luke,
>
> i am having difficulty in understanding nmigen Record (hdl/rec.py)
> i am able to follow some part of hdl/rec.py like Direction, fields,
> __init__ in class Layout checking
> for valid field, are the elements of field valid, avoiding duplication of
> names.
> but, i am not able to understand the full picture :(
in some ways, you don't actually need to read all the code, just know
the function names and read the docstrings. except (*sigh*) Record
and Layout don't *have* any docstrings... *sigh*...
> can you give me some pointers over what is layout, shape?
Layout is just a list of signal-width plus signal-Direction.
(or signal-width plus signed/unsigned plus Direction).
shape is a tuple of signal-width plus if the signal is signed or unsigned.
> from our diagram of GPIO (https://libre-riscv.org/shakti/m_class/pinmux/)
> the i/o pad is a PHYSICAL PIN of processor which connects it to
> peripherals, memory, etc, right?
> so, we mux (select one of many) inputs of processor coming to i/o pad from
> various peripherals and mux outputs of
> processor coming to i/o pad going to peripherals.
> I am not able to relate FAN_OUT and FAN_IN with this diagram :(
FAN_OUT and FAN_IN are actually Muxers, nothing to do with Record/Layout...
there is an example somewhere of a multi-selection Mux...
https://github.com/m-labs/nmigen/blob/master/examples/pmux.py
ah, it's not quite the same. actually, FAN_IN and FAN_OUT would be:
with m.Switch(mux):
with m.Case(0):
m.d.comb += self.o.eq(self.a)
with m.Case(1):
m.d.comb += self.o.eq(self.b)
that would be one of them and the other would be:
with m.Switch(mux):
with m.Case(0):
m.d.comb += self.a.eq(self.o)
with m.Case(1):
m.d.comb += self.b.eq(self.o)
you'll have to work out which is which :)
actually it turns out that doing this is not necessary, you can use an Array:
signals = [self.a, self.b, self.c, self.d]
array = Array(signals)
m.d.comb += self.o.eq(array[self.muxselector])
or for the other one:
m.d.comb += array[self.muxselector].eq(self.o)
so instead of a massive list of Switch/Case statements, just use Array.
--
You are receiving this mail because:
You are on the CC list for the bug.
More information about the libre-riscv-dev
mailing list