[libre-riscv-dev] [Bug 132] SIMD-like nmigen signal for partitioning

bugzilla-daemon at libre-riscv.org bugzilla-daemon at libre-riscv.org
Sun Aug 25 09:38:37 BST 2019


http://bugs.libre-riscv.org/show_bug.cgi?id=132

--- Comment #34 from Luke Kenneth Casson Leighton <lkcl at lkcl.net> ---
(In reply to Jacob Lifshay from comment #32)

> > here's a simple example:
> > 
> > -        with m.If(self.i.product[-1]):
> > -            comb += p.eq(self.i.product)
> > -        with m.Else():
> > -            # get 1 bit of extra accuracy if the mantissa top bit is zero
> > -            comb += p.eq(self.i.product<<1)
> > -            comb += self.o.z.e.eq(self.i.z.e-1)
> > +        msb = Signal(reset_less=True)
> > +        e = self.o.z.e
> > +        comb += msb.eq(self.i.product[-1])
> > +        comb += p.eq(Mux(msb, self.i.product, self.i.product<<1))
> > +        comb += e.eq(Mux(msb, self.i.z.e, self.i.z.e-1))
> > 
> > that would do alright, wouldn't it? 
> 
> that looks fine to me.

yeh.  oh, except i realised: arrays.  the next bit of the code is as follows:

        mw = self.o.z.m_width
        comb += [
            self.o.z.m.eq(p[mw+2:]),            # mantissa
            self.o.of.m0.eq(p[mw+2]),           # copy of LSB
            self.o.of.guard.eq(p[mw+1]),        # guard
            self.o.of.round_bit.eq(p[mw]),      # round
            self.o.of.sticky.eq(p[0:mw].bool()) # sticky
        ]

the assumption here is that the mantissa width is a fixed parameter.

we'll need a P-variant of "Part" which takes a *list* of partition-selectable
widths/offsets - is that making any sense?

this is going to be quite intrusive, however, ultimately, i think if we
tried to write an "explicit" partitioned version of this code (with for-loops
etc.) it would quickly become not just unreadable but also apparent that
the process is extremely regular and monotonous.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


More information about the libre-riscv-dev mailing list