1 """ Example 5: Making use of PyRTL and Introspection. """
3 from nmigen
import Module
, Signal
4 from nmigen
.cli
import main
, verilog
, rtlil
7 from pipeline
import SimplePipeline
, ObjectProxy
, PipeManager
10 class SimplePipelineExample(SimplePipeline
):
11 """ A very simple pipeline to show how registers are inferred. """
13 def __init__(self
, pipe
):
14 SimplePipeline
.__init
__(self
, pipe
)
15 self
._loopback
= Signal(4)
19 self
.n
= ~self
._loopback
26 self
._pipe
.comb
+= localv
.eq(2)
27 self
.n
= self
.n
<< localv
33 self
._pipe
.sync
+= self
._loopback
.eq(self
.n
+ 3)
36 class ObjectBasedPipelineExample(SimplePipeline
):
37 """ A very simple pipeline to show how registers are inferred. """
39 def __init__(self
, pipe
):
40 SimplePipeline
.__init
__(self
, pipe
)
41 self
._loopback
= Signal(4)
49 self
.n
= ~self
._loopback
53 self
.n
= self
.n
+ self
.o
.a
54 o
= ObjectProxy(self
._pipe
)
61 self
._pipe
.comb
+= localv
.eq(2)
62 self
.n
= self
.n
<< localv
63 o
= ObjectProxy(self
._pipe
)
64 o
.b
= self
.n
+ self
.o
.a
+ self
.o
.b
70 self
.o
.b
= self
.o
.b
+ self
.n
73 self
._pipe
.sync
+= self
._loopback
.eq(self
.n
+ 3 + self
.o
.b
)
80 self
.p
= ObjectBasedPipelineExample(self
.m
.d
)
82 def get_fragment(self
, platform
=None):
86 class PipelineStageExample(PipeManager
):
90 self
._loopback
= Signal(4)
91 PipeManager
.__init
__(self
, self
.m
)
94 self
.n
= ~self
._loopback
101 self
._pipe
.comb
+= localv
.eq(2)
102 self
.n
= self
.n
<< localv
108 self
._pipe
.sync
+= self
._loopback
.eq(self
.n
+ 3)
110 def get_fragment(self
, platform
=None):
112 with self
.Stage("first") as (p
, m
):
113 p
.n
= ~self
._loopback
114 with self
.Stage("second", p
) as (p
, m
):
116 with self
.Stage("third", p
) as (p
, m
):
118 m
.d
.comb
+= localv
.eq(2)
125 if __name__
== "__main__":
126 example
= PipeModule()
127 with
open("pipe_module.il", "w") as f
:
128 f
.write(rtlil
.convert(example
, ports
=[
131 example
= PipelineStageExample()
132 with
open("pipe_stage_module.il", "w") as f
:
133 f
.write(rtlil
.convert(example
, ports
=[