from fpbase import FPNumIn, FPNumOut, FPOp, Overflow, FPBase, FPNumBase
from fpbase import MultiShiftRMerge, Trigger
-from example_buf_pipe import StageChain
+from example_buf_pipe import StageChain, UnbufferedPipeline
#from fpbase import FPNumShiftMultiRight
self.a = FPNumBase(width, True)
self.b = FPNumBase(width, True)
self.z = FPNumOut(width, False)
+ self.oz = Signal(width, reset_less=True)
self.out_do_z = Signal(reset_less=True)
self.mid = Signal(id_wid, reset_less=True)
def eq(self, i):
- return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z),
+ return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z), self.oz.eq(i.oz),
self.a.eq(i.a), self.b.eq(i.b), self.mid.eq(i.mid)]
m.d.comb += self.o.a.eq(self.i.a)
m.d.comb += self.o.b.eq(self.i.b)
+ m.d.comb += self.o.oz.eq(self.o.z.v)
m.d.comb += self.o.mid.eq(self.i.mid)
return m
m.d.sync += self.o.eq(self.dmod.o)
def action(self, m):
- with m.If(self.out_do_z):
- m.next = "put_z"
- with m.Else():
+ #with m.If(self.out_do_z):
+ # m.next = "put_z"
+ #with m.Else():
m.next = "align"
m.d.comb += self.o.mid.eq(self.i.mid)
m.d.comb += self.o.z.eq(self.i.z)
m.d.comb += self.o.out_do_z.eq(self.i.out_do_z)
+ m.d.comb += self.o.oz.eq(self.i.oz)
return m
self.b = FPNumIn(None, width)
self.z = FPNumOut(width, False)
self.out_do_z = Signal(reset_less=True)
+ self.oz = Signal(width, reset_less=True)
self.mid = Signal(id_wid, reset_less=True)
def eq(self, i):
- return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z),
+ return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z), self.oz.eq(i.oz),
self.a.eq(i.a), self.b.eq(i.b), self.mid.eq(i.mid)]
m.d.comb += self.o.mid.eq(self.i.mid)
m.d.comb += self.o.z.eq(self.i.z)
m.d.comb += self.o.out_do_z.eq(self.i.out_do_z)
+ m.d.comb += self.o.oz.eq(self.i.oz)
return m
def __init__(self, width, id_wid):
self.z = FPNumBase(width, False)
self.out_do_z = Signal(reset_less=True)
+ self.oz = Signal(width, reset_less=True)
self.tot = Signal(self.z.m_width + 4, reset_less=True)
self.mid = Signal(id_wid, reset_less=True)
def eq(self, i):
- return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z),
+ return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z), self.oz.eq(i.oz),
self.tot.eq(i.tot), self.mid.eq(i.mid)]
self.o.tot.eq(bm0 - am0),
self.o.z.s.eq(self.i.b.s)
]
- with m.Else():
- m.d.comb += self.o.z.eq(self.i.z)
+ m.d.comb += self.o.oz.eq(self.i.oz)
m.d.comb += self.o.out_do_z.eq(self.i.out_do_z)
m.d.comb += self.o.mid.eq(self.i.mid)
return m
def __init__(self, width, id_wid):
self.z = FPNumBase(width, False)
self.out_do_z = Signal(reset_less=True)
+ self.oz = Signal(width, reset_less=True)
self.of = Overflow()
self.mid = Signal(id_wid, reset_less=True)
def eq(self, i):
- return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z),
+ return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z), self.oz.eq(i.oz),
self.of.eq(i.of), self.mid.eq(i.mid)]
]
m.d.comb += self.o.out_do_z.eq(self.i.out_do_z)
+ m.d.comb += self.o.oz.eq(self.i.oz)
m.d.comb += self.o.mid.eq(self.i.mid)
return m
self.roundz = Signal(reset_less=True)
self.z = FPNumBase(width, False)
self.out_do_z = Signal(reset_less=True)
+ self.oz = Signal(width, reset_less=True)
self.mid = Signal(id_wid, reset_less=True)
def eq(self, i):
- return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z),
+ return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z), self.oz.eq(i.oz),
self.roundz.eq(i.roundz), self.mid.eq(i.mid)]
m.d.comb += self.o.mid.eq(self.i.mid)
m.d.comb += self.o.out_do_z.eq(self.i.out_do_z)
+ m.d.comb += self.o.oz.eq(self.i.oz)
return m
def __init__(self, width, id_wid):
self.z = FPNumBase(width, False)
self.out_do_z = Signal(reset_less=True)
+ self.oz = Signal(width, reset_less=True)
self.mid = Signal(id_wid, reset_less=True)
def eq(self, i):
- return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z),
+ return [self.z.eq(i.z), self.out_do_z.eq(i.out_do_z), self.oz.eq(i.oz),
self.mid.eq(i.mid)]
with m.Else():
m.d.comb += self.o.z.create(self.i.z.s, self.i.z.e, self.i.z.m)
with m.Else():
- m.d.comb += self.o.z.eq(self.i.z)
+ m.d.comb += self.o.z.v.eq(self.i.oz)
return m
ppz = self.add_state(FPPutZ("pack_put_z", n1.out_z.z, self.o,
n1.out_z.mid, self.o.mid))
- pz = self.add_state(FPPutZ("put_z", sc.out_z.z, self.o,
- sc.o.mid, self.o.mid))
+ #pz = self.add_state(FPPutZ("put_z", sc.out_z.z, self.o,
+ # sc.o.mid, self.o.mid))
class FPADDBase(FPState):
with m.Else():
m.d.sync += self.out_z.stb.eq(1)
+class FPADDStageIn:
+ def __init__(self, width, id_wid):
+ self.a = Signal(width)
+ self.b = Signal(width)
+ self.mid = Signal(id_wid, reset_less=True)
+
+ def eq(self, i):
+ return [self.a.eq(i.a), self.b.eq(i.b), self.mid.eq(i.mid)]
+
+
+class FPADDStageOut:
+ def __init__(self, width, id_wid):
+ self.z = Signal(width)
+ self.mid = Signal(id_wid, reset_less=True)
+
+ def eq(self, i):
+ return [self.z.eq(i.z), self.mid.eq(i.mid)]
+
+
+# matches the format of FPADDStageOut, allows eq function to do assignments
+class PlaceHolder: pass
+
+
+class FPAddBaseStage:
+ def __init__(self, width, id_wid):
+ self.width = width
+ self.id_wid = id_wid
+
+ def ispec(self):
+ return FPADDStageIn(self.width, self.id_wid)
+
+ def ospec(self):
+ return FPADDStageOut(self.width, self.id_wid)
+
+ def process(self, i):
+ o = PlaceHolder()
+ o.z = i.a + i.b
+ o.mid = i.mid
+ return o
+
+
+class FPADDBasePipe:
+ def __init__(self, width, id_wid):
+ stage1 = FPAddBaseStage(width, id_wid)
+ self.pipe = UnbufferedPipeline(stage1)
+
+ def elaborate(self, platform):
+ return self.pipe.elaborate(platform)
+
+ def ports(self):
+ return self.pipe.ports()
class ResArray:
def __init__(self, width, id_wid):