blob: 306f9093b983483bcceb58816126905ea9215987 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
from amaranth import *
class InOutBuff(Elaboratable):
'''
This module wraps another modules input and output with a buffer
This is usefull for doing timeing analysis on combinational logic
An instance of a module should be passed, not the module itself
'''
def __init__(self, sub_module: Elaboratable):
assert sub_module.ports is not None, 'sub_module must have ports'
self.sub_module = sub_module
ports_in = [Signal(port.width, name=port.name + '_inbuf') for port in sub_module.ports['in']]
ports_out = [Signal(port.width, name=port.name + '_outbuf') for port in sub_module.ports['out']]
self.ports = {'in': ports_in, 'out': ports_out}
def elaborate(self, platform):
m = Module()
m.submodules.sub = self.sub_module
for i in range(len(self.ports['in'])):
m.d.sync += self.sub_module.ports['in'][i].eq(self.ports['in'][i])
for i in range(len(self.ports['out'])):
m.d.sync += self.ports['out'][i].eq(self.sub_module.ports['out'][i])
return m
|