Stack looks like this:
-scnorm - FPDIVSpecialCasesDeNorm ispec FPADDBaseData
+scnorm - FPDIVSpecialCasesDeNorm ispec FPBaseData
------ ospec FPSCData
StageChain: FPDIVSpecialCasesMod,
pipediv0 - FPDivStagesSetup ispec FPSCData
-------- ospec DivPipeInterstageData
- StageChain: FPDivStage0Mod,
+ StageChain: FPDivPreFPAdjust,
DivPipeSetupStage,
DivPipeCalculateStage,
...
...
DivPipeCalculateStage,
DivPipeFinalStage,
- FPDivStage2Mod
+ FPDivPostToFPFormat
normpack - FPNormToPack ispec FPPostCalcData
-------- ospec FPPackData
even 8 is starting to get alarmingly high.
"""
-from nmigen import Module
-from nmigen.cli import main, verilog
-
from nmutil.singlepipe import ControlBase
from nmutil.concurrentunit import ReservationStations, num_bits
-from ieee754.fpcommon.getop import FPADDBaseData
-from ieee754.fpcommon.denorm import FPSCData
from ieee754.fpcommon.fpbase import FPFormat
-from ieee754.fpcommon.pack import FPPackData
from ieee754.fpcommon.normtopack import FPNormToPack
from ieee754.fpdiv.specialcases import FPDIVSpecialCasesDeNorm
from ieee754.fpdiv.divstages import (FPDivStagesSetup,
FPDivStagesFinal)
from ieee754.pipeline import PipelineSpec
from ieee754.div_rem_sqrt_rsqrt.core import DivPipeCoreConfig
+from nmutil.dynamicpipe import MaskCancellableRedir
class FPDIVBasePipe(ControlBase):
def __init__(self, pspec):
self.pspec = pspec
- ControlBase.__init__(self)
+ ControlBase.__init__(self, maskwid=pspec.maskwid)
pipechain = []
# to which the answer: "as few as possible"
class FPDIVMuxInOut(ReservationStations):
""" Reservation-Station version of FPDIV pipeline.
- * fan-in on inputs (an array of FPADDBaseData: a,b,mid)
+ * fan-in on inputs (an array of FPBaseData: a,b,mid)
* N-stage divider pipeline
* fan-out on outputs (an array of FPPackData: z,mid)
fmt = FPFormat.standard(width)
log2_radix = 3 # tested options so far: 1, 2 and 3.
n_comb_stages = 2 # 2 compute stages per pipeline stage
+ maskwid = 1 # SIMD width effectively
# extra bits needed: guard + round (sticky comes from remainer.bool())
fraction_width = fmt.fraction_width
# the last stage
cfg = DivPipeCoreConfig(fmt.width, fraction_width, log2_radix)
+ self.pspec.pipekls = MaskCancellableRedir
+ self.pspec.maskwid = maskwid * num_rows # RS gets just maskwid
self.pspec.fpformat = fmt
self.pspec.n_comb_stages = n_comb_stages
self.pspec.core_config = cfg
# new_pspec.opkls = DivPipeCoreOperation
# self.alu = FPDIVBasePipe(new_pspec)
self.alu = FPDIVBasePipe(self.pspec)
- ReservationStations.__init__(self, num_rows)
-
- def i_specfn(self):
- return FPADDBaseData(self.pspec)
-
- def o_specfn(self):
- return FPPackData(self.pspec)
+ ReservationStations.__init__(self, num_rows, maskwid=maskwid)