1 from nmigen
import Module
, Signal
, Mux
, Const
2 from nmigen
.hdl
.rec
import Record
, Layout
, DIR_NONE
3 from nmigen
.compat
.sim
import run_simulation
4 from nmigen
.cli
import verilog
, rtlil
5 from nmigen
.compat
.fhdl
.bitcontainer
import value_bits_sign
6 from singlepipe
import flatten
9 class RecordObject(Record
):
10 def __init__(self
, name
=None):
11 Record
.__init
__(self
, layout
=[], name
=None)
13 def __setattr__(self
, k
, v
):
14 if k
in dir(Record
) or "fields" not in self
.__dict
__:
15 return object.__setattr
__(self
, k
, v
)
16 self
.__dict
__["fields"][k
] = v
17 if isinstance(v
, Record
):
18 newlayout
= {k
: (k
, v
.layout
)}
20 newlayout
= {k
: (k
, v
.shape())}
21 self
.__dict
__["layout"].fields
.update(newlayout
)
27 self
.r1
= RecordObject()
28 self
.r1
.sig1
= Signal(32)
29 self
.r1
.r2
= RecordObject()
30 self
.r1
.r2
.sig2
= Signal(32)
31 self
.r1
.r3
= RecordObject()
32 self
.r1
.r3
.sig3
= Signal(32)
33 self
.sig123
= Signal(96)
35 def elaborate(self
, platform
):
39 m
.d
.comb
+= sig1
.eq(self
.r1
.sig1
)
41 m
.d
.comb
+= sig2
.eq(self
.r1
.r2
.sig2
)
43 print (self
.r1
.fields
)
44 print (self
.r1
.shape())
46 m
.d
.comb
+= self
.sig123
.eq(flatten(self
.r1
))
52 yield dut
.r1
.sig1
.eq(5)
53 yield dut
.r1
.r2
.sig2
.eq(10)
55 sig1
= yield dut
.r1
.sig1
57 sig2
= yield dut
.r1
.r2
.sig2
62 ######################################################################
64 ######################################################################
66 if __name__
== '__main__':
69 run_simulation(dut
, testbench(dut
), vcd_name
="test_record1.vcd")
70 vl
= rtlil
.convert(dut
, ports
=[dut
.sig123
, dut
.r1
.sig1
, dut
.r1
.r2
.sig2
])
71 with
open("test_record1.il", "w") as f
: