1 from nmutil
.singlepipe
import ControlBase
2 from nmutil
.pipemodbase
import PipeModBaseChain
3 from soc
.fu
.alu
.input_stage
import ALUInputStage
4 from soc
.fu
.alu
.output_stage
import ALUOutputStage
5 from soc
.fu
.div
.setup_stage
import DivSetupStage
6 from soc
.fu
.div
.core_stages
import (DivCoreSetupStage
, DivCoreCalculateStage
,
8 from soc
.fu
.div
.output_stage
import DivOutputStage
11 class DivStagesStart(PipeModBaseChain
):
13 alu_input
= ALUInputStage(self
.pspec
)
14 div_setup
= DivSetupStage(self
.pspec
)
15 core_setup
= DivCoreSetupStage(self
.pspec
)
16 return [alu_input
, div_setup
, core_setup
]
19 class DivStagesMiddle(PipeModBaseChain
):
20 def __init__(self
, pspec
, stage_start_index
, stage_end_index
):
21 self
.stage_start_index
= stage_start_index
22 self
.stage_end_index
= stage_end_index
23 super().__init
__(pspec
)
27 for index
in range(self
.stage_start_index
, self
.stage_end_index
):
28 stages
.append(DivCoreCalculateStage(self
.pspec
, index
))
32 class DivStagesEnd(PipeModBaseChain
):
34 core_final
= DivCoreFinalStage(self
.pspec
)
35 div_out
= DivOutputStage(self
.pspec
)
36 alu_out
= ALUOutputStage(self
.pspec
)
37 return [core_final
, div_out
, alu_out
]
40 class DIVBasePipe(ControlBase
):
41 def __init__(self
, pspec
, compute_steps_per_stage
=4):
42 ControlBase
.__init
__(self
)
43 self
.pipe_start
= DivStagesStart(pspec
)
44 compute_steps
= pspec
.core_config
.n_stages
45 self
.pipe_middles
= []
46 for start
in range(0, compute_steps
, compute_steps_per_stage
):
47 end
= min(start
+ compute_steps_per_stage
, compute_steps
)
48 self
.pipe_middles
.append(DivStagesMiddle(pspec
, start
, end
))
49 self
.pipe_end
= DivStagesEnd(pspec
)
50 self
._eqs
= self
.connect([self
.pipe_start
,
54 def elaborate(self
, platform
):
55 m
= ControlBase
.elaborate(self
, platform
)
56 m
.submodules
.pipe_start
= self
.pipe_start
57 for i
in self
.pipe_middles
:
58 name
= f
"pipe_{i.stage_start_index}_to_{i.stage_end_index}"
59 setattr(m
.submodules
, name
, i
)
60 m
.submodules
.pipe_end
= self
.pipe_end