X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=pipestage.py;h=4ec0da059d159ae8aac29f4505098de5990d02b7;hb=feb4fc23d6dbe1a3f5fde3dabcca5aa24a65deff;hp=dfa2a3ef42eeb7744db5b6a3aaa7c8256543ffdf;hpb=06b76ae69bd4cd33f0f074a1430d078b988b65c4;p=rv32.git diff --git a/pipestage.py b/pipestage.py index dfa2a3e..4ec0da0 100644 --- a/pipestage.py +++ b/pipestage.py @@ -1,8 +1,9 @@ """ Example 5: Making use of PyRTL and Introspection. """ from copy import deepcopy -from migen import * +from migen import Module, Signal from migen.fhdl import verilog +from migen.fhdl.bitcontainer import value_bits_sign # The following example shows how pyrtl can be used to make some interesting @@ -21,7 +22,10 @@ class SimplePipeline(object): self._current_stage_num = 0 def _setup(self): - stage_list = [method for method in dir(self) if method.startswith('stage')] + stage_list = [] + for method in dir(self): + if method.startswith('stage'): + stage_list.append(method) for stage in sorted(stage_list): stage_method = getattr(self, stage) stage_method() @@ -43,8 +47,7 @@ class SimplePipeline(object): next_stage = self._current_stage_num + 1 pipereg_id = str(self._current_stage_num) + 'to' + str(next_stage) rname = 'pipereg_' + pipereg_id + '_' + name - #new_pipereg = pyrtl.Register(bitwidth=len(value), name=rname) - new_pipereg = Signal(len(value), name_override=rname) + new_pipereg = Signal(value_bits_sign(value), name_override=rname) if next_stage not in self._pipeline_register_map: self._pipeline_register_map[next_stage] = {} self._pipeline_register_map[next_stage][name] = new_pipereg @@ -56,24 +59,23 @@ class SimplePipelineExample(SimplePipeline): def __init__(self, pipe): super(SimplePipelineExample, self).__init__(pipe) - self._loopback = Signal() + self._loopback = Signal(4) self._setup() def stage0(self): - n = Signal() self.n = ~self._loopback def stage1(self): - self.n = self.n + self.n = self.n + 1 def stage2(self): - self.n = self.n + self.n = self.n << 1 def stage3(self): - self.n = self.n + self.n = ~self.n def stage4(self): - self._pipe.sync += self._loopback.eq(self.n) + self._pipe.sync += self._loopback.eq(self.n + 3) class PipeModule(Module): def __init__(self):