X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fieee754%2Ffpadd%2Fstatemachine.py;h=decbc3d4e87f58630df8afe797d03398a186e857;hb=1464aba03659adec485de985b4b3ebcfc02ba487;hp=4418b3fa8f07471b5b9067a6175f0306ad10c5d8;hpb=b1b03478dedc69a06b76e2da3357884369883063;p=ieee754fpu.git diff --git a/src/ieee754/fpadd/statemachine.py b/src/ieee754/fpadd/statemachine.py index 4418b3fa..decbc3d4 100644 --- a/src/ieee754/fpadd/statemachine.py +++ b/src/ieee754/fpadd/statemachine.py @@ -2,51 +2,51 @@ # Copyright (C) Jonathan P Dawson 2013 # 2013-12-12 -from nmigen import Module, Signal, Cat, Mux, Array, Const +from nmigen import Module, Signal, Cat, Mux, Array, Const, Elaboratable from nmigen.cli import main, verilog from math import log -from fpbase import FPOpIn, FPOpOut -from fpbase import Trigger -from singlepipe import (StageChain, SimpleHandshake) +from ieee754.fpcommon.fpbase import FPOpIn, FPOpOut +from ieee754.fpcommon.fpbase import Trigger +from nmutil.singlepipe import (StageChain, SimpleHandshake) -from fpbase import FPState, FPID -from fpcommon.getop import (FPGetOp, FPADDBaseData, FPGet2Op) -from fpcommon.denorm import (FPSCData, FPAddDeNorm) -from fpcommon.postcalc import FPAddStage1Data -from fpcommon.postnormalise import (FPNorm1Data, +from ieee754.fpcommon.fpbase import FPState, FPID +from ieee754.fpcommon.getop import (FPGetOp, FPADDBaseData, FPGet2Op) +from ieee754.fpcommon.denorm import (FPSCData, FPAddDeNorm) +from ieee754.fpcommon.postcalc import FPAddStage1Data +from ieee754.fpcommon.postnormalise import (FPNorm1Data, FPNorm1Single, FPNorm1Multi) -from fpcommon.roundz import (FPRoundData, FPRound) -from fpcommon.corrections import FPCorrections -from fpcommon.pack import (FPPackData, FPPackMod, FPPack) -from fpcommon.normtopack import FPNormToPack -from fpcommon.putz import (FPPutZ, FPPutZIdx) +from ieee754.fpcommon.roundz import (FPRoundData, FPRound) +from ieee754.fpcommon.corrections import FPCorrections +from ieee754.fpcommon.pack import (FPPackData, FPPackMod, FPPack) +from ieee754.fpcommon.normtopack import FPNormToPack +from ieee754.fpcommon.putz import (FPPutZ, FPPutZIdx) -from fpadd.specialcases import (FPAddSpecialCases, FPAddSpecialCasesDeNorm) -from fpadd.align import (FPAddAlignMulti, FPAddAlignSingle) -from fpadd.add0 import (FPAddStage0Data, FPAddStage0) -from fpadd.add1 import (FPAddStage1Mod, FPAddStage1) -from fpadd.addstages import FPAddAlignSingleAdd +from .specialcases import (FPAddSpecialCases, FPAddSpecialCasesDeNorm) +from .align import (FPAddAlignMulti, FPAddAlignSingle) +from .add0 import (FPAddStage0Data, FPAddStage0) +from .add1 import (FPAddStage1Mod, FPAddStage1) +from .addstages import FPAddAlignSingleAdd class FPOpData: def __init__(self, width, id_wid): self.z = FPOpOut(width) self.z.data_o = Signal(width) - self.mid = Signal(id_wid, reset_less=True) + self.muxid = Signal(id_wid, reset_less=True) def __iter__(self): yield self.z - yield self.mid + yield self.muxid def eq(self, i): - return [self.z.eq(i.z), self.mid.eq(i.mid)] + return [self.z.eq(i.z), self.muxid.eq(i.mid)] def ports(self): return list(self) -class FPADDBaseMod: +class FPADDBaseMod(Elaboratable): def __init__(self, width, id_wid=None, single_cycle=False, compact=True): """ IEEE754 FP Add @@ -107,9 +107,11 @@ class FPADDBaseMod: sc = self.add_state(FPAddSpecialCases(self.width, self.id_wid)) sc.setup(m, a, b, self.in_mid) + m.submodules.sc = sc dn = self.add_state(FPAddDeNorm(self.width, self.id_wid)) dn.setup(m, a, b, sc.in_mid) + m.submodules.dn = dn if self.single_cycle: alm = self.add_state(FPAddAlignSingle(self.width, self.id_wid)) @@ -117,12 +119,15 @@ class FPADDBaseMod: else: alm = self.add_state(FPAddAlignMulti(self.width, self.id_wid)) alm.setup(m, dn.out_a, dn.out_b, dn.in_mid) + m.submodules.alm = alm add0 = self.add_state(FPAddStage0(self.width, self.id_wid)) add0.setup(m, alm.out_a, alm.out_b, alm.in_mid) + m.submodules.add0 = add0 add1 = self.add_state(FPAddStage1(self.width, self.id_wid)) add1.setup(m, add0.out_tot, add0.out_z, add0.in_mid) + m.submodules.add1 = add1 if self.single_cycle: n1 = self.add_state(FPNorm1Single(self.width, self.id_wid)) @@ -156,11 +161,14 @@ class FPADDBaseMod: get.trigger_setup(m, self.in_t.stb, self.in_t.ack) chainlist = [get, sc, alm, n1] - chain = StageChain(chainlist, specallocate=True) + chain = StageChain(chainlist, specallocate=False) chain.setup(m, self.i) + m.submodules.sc = sc + m.submodules.alm = alm + m.submodules.n1 = n1 for mod in chainlist: - sc = self.add_state(mod) + self.add_state(mod) ppz = self.add_state(FPPutZ("pack_put_z", n1.out_z.z, self.o, n1.out_z.mid, self.o.mid)) @@ -260,7 +268,7 @@ class FPADDBase(FPState): m.d.sync += self.out_z.stb.eq(1) -class FPADD(FPID): +class FPADD(FPID, Elaboratable): """ FPADD: stages as follows: FPGetOp (a)