Skip to content

Commit aaa77a7

Browse files
committed
to_multibank_ram() method with object cache
1 parent 52dbb59 commit aaa77a7

File tree

5 files changed

+98
-80
lines changed

5 files changed

+98
-80
lines changed

tests/extension/thread_/multibank_nested_ram_dma_block/thread_multibank_nested_ram_dma_block.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def mkLed(memory_datawidth=128):
2727
rams = [vthread.MultibankRAM(m, 'myram%d' % i, clk, rst, datawidth, addrwidth,
2828
numbanks=pack_size)
2929
for i in range(numbanks)]
30-
myram = vthread.MultibankRAM(rams=rams, keep_hierarchy=True)
30+
myram = vthread.to_multibank_ram(rams, keep_hierarchy=True)
3131

3232
all_ok = m.TmpReg(initval=0)
3333

tests/extension/thread_/stream_multibank_nested/thread_stream_multibank_nested.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,19 @@ def mkLed(memory_datawidth=128):
2626
numbanks=numbanks)
2727
ram_a1 = vthread.MultibankRAM(m, 'ram_a1', clk, rst, datawidth, addrwidth,
2828
numbanks=numbanks)
29-
ram_a = vthread.MultibankRAM(rams=(ram_a0, ram_a1), name='ram_a')
29+
ram_a = vthread.to_multibank_ram((ram_a0, ram_a1), name='ram_a')
3030

3131
ram_b0 = vthread.MultibankRAM(m, 'ram_b0', clk, rst, datawidth, addrwidth,
3232
numbanks=numbanks)
3333
ram_b1 = vthread.MultibankRAM(m, 'ram_b1', clk, rst, datawidth, addrwidth,
3434
numbanks=numbanks)
35-
ram_b = vthread.MultibankRAM(rams=(ram_b0, ram_b1), name='ram_b')
35+
ram_b = vthread.to_multibank_ram((ram_b0, ram_b1), name='ram_b')
3636

3737
ram_c0 = vthread.MultibankRAM(m, 'ram_c0', clk, rst, datawidth, addrwidth,
3838
numbanks=numbanks)
3939
ram_c1 = vthread.MultibankRAM(m, 'ram_c1', clk, rst, datawidth, addrwidth,
4040
numbanks=numbanks)
41-
ram_c = vthread.MultibankRAM(rams=(ram_c0, ram_c1), name='ram_c')
41+
ram_c = vthread.to_multibank_ram((ram_c0, ram_c1), name='ram_c')
4242

4343
strm = vthread.Stream(m, 'mystream', clk, rst)
4444
a = strm.source('a')

tests/extension/thread_/to_multibank_ram/thread_to_multibank_ram.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def mkLed(memory_datawidth=128):
2424

2525
myrams = [vthread.RAM(m, 'myram_%d' % i, clk, rst, datawidth, addrwidth)
2626
for i in range(numbanks)]
27-
myram = vthread.MultibankRAM(rams=myrams, name='myram')
27+
myram = vthread.to_multibank_ram(myrams, name='myram')
2828

2929
all_ok = m.TmpReg(initval=0)
3030

veriloggen/thread/axi.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from veriloggen.dataflow.dtypes import make_condition
1515

1616
from .ttypes import _MutexFunction
17-
from .ram import RAM, FixedRAM, MultibankRAM
17+
from .ram import RAM, FixedRAM, MultibankRAM, to_multibank_ram
1818

1919

2020
class AXIM(AxiMaster, _MutexFunction):
@@ -229,7 +229,7 @@ def _dma_read(self, fsm, ram, local_addr, global_addr, size,
229229
raise TypeError('AXIM-lite does not support DMA.')
230230

231231
if isinstance(ram, (tuple, list)):
232-
ram = MultibankRAM(rams=ram)
232+
ram = to_multibank_ram(ram)
233233

234234
if not isinstance(ram, (RAM, MultibankRAM)):
235235
raise TypeError('RAM object is required.')
@@ -784,7 +784,7 @@ def _dma_write(self, fsm, ram, local_addr, global_addr, size,
784784
raise TypeError('AXIM-lite does not support DMA.')
785785

786786
if isinstance(ram, (tuple, list)):
787-
ram = MultibankRAM(rams=ram)
787+
ram = to_multibank_ram(ram)
788788

789789
if not isinstance(ram, (RAM, MultibankRAM)):
790790
raise TypeError('RAM object is required.')

veriloggen/thread/ram.py

Lines changed: 90 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,77 +1106,27 @@ class MultibankRAM(object):
11061106
'dma_read_block', 'dma_read_block_async',
11071107
'dma_write_block', 'dma_write_block_async') + _MutexFunction.__intrinsics__
11081108

1109-
def __init__(self, m=None, name=None, clk=None, rst=None,
1110-
datawidth=32, addrwidth=10, numports=1,
1111-
numbanks=2, rams=None, keep_hierarchy=False):
1112-
1113-
if rams is not None:
1114-
if not isinstance(rams, (tuple, list)):
1115-
rams = [rams]
1116-
1117-
if not keep_hierarchy:
1118-
rams = extract_rams(rams)
1119-
1120-
if len(rams) < 2:
1121-
raise ValueError('numbanks must be 2 or more')
1122-
1123-
max_datawidth = 0
1124-
for ram in rams:
1125-
max_datawidth = max(max_datawidth, ram.datawidth)
1126-
1127-
max_addrwidth = 0
1128-
for ram in rams:
1129-
max_addrwidth = max(max_addrwidth, ram.addrwidth)
1130-
1131-
max_numports = rams[0].numports
1132-
for ram in rams[1:]:
1133-
if max_numports != ram.numports:
1134-
raise ValueError('numports must be same')
1135-
1136-
self.m = rams[0].m
1137-
self.name = ('_'.join([ram.name for ram in rams])
1138-
if name is None else name)
1139-
self.clk = rams[0].clk
1140-
self.rst = rams[0].rst
1141-
self.orig_datawidth = max_datawidth
1142-
self.datawidth = max_datawidth * len(rams)
1143-
self.addrwidth = max_addrwidth
1144-
self.numports = max_numports
1145-
self.numbanks = len(rams)
1146-
self.shift = util.log2(self.numbanks)
1147-
self.rams = rams
1148-
self.keep_hierarchy = keep_hierarchy
1149-
self.seq = None
1150-
1151-
for ram in self.rams:
1152-
if ram.seq is not None:
1153-
self.seq = ram.seq
1154-
break
1155-
1156-
elif (m is not None and name is not None and
1157-
clk is not None and rst is not None):
1158-
1159-
if numbanks < 2:
1160-
raise ValueError('numbanks must be 2 or more')
1161-
1162-
self.m = m
1163-
self.name = name
1164-
self.clk = clk
1165-
self.rst = rst
1166-
self.orig_datawidth = datawidth
1167-
self.datawidth = datawidth * numbanks
1168-
self.addrwidth = addrwidth
1169-
self.numports = numports
1170-
self.numbanks = numbanks
1171-
self.shift = util.log2(self.numbanks)
1172-
self.rams = [RAM(m, '_'.join([name, '%d' % i]),
1173-
clk, rst, datawidth, addrwidth, numports)
1174-
for i in range(numbanks)]
1175-
self.keep_hierarchy = keep_hierarchy
1176-
self.seq = None
1109+
def __init__(self, m, name, clk, rst,
1110+
datawidth=32, addrwidth=10, numports=1, numbanks=2):
11771111

1178-
else:
1179-
raise ValueError('RAMs or module information must be specified.')
1112+
if numbanks < 2:
1113+
raise ValueError('numbanks must be 2 or more')
1114+
1115+
self.m = m
1116+
self.name = name
1117+
self.clk = clk
1118+
self.rst = rst
1119+
self.orig_datawidth = datawidth
1120+
self.datawidth = datawidth * numbanks
1121+
self.addrwidth = addrwidth
1122+
self.numports = numports
1123+
self.numbanks = numbanks
1124+
self.shift = util.log2(self.numbanks)
1125+
self.rams = [RAM(m, '_'.join([name, '%d' % i]),
1126+
clk, rst, datawidth, addrwidth, numports)
1127+
for i in range(numbanks)]
1128+
self.keep_hierarchy = False
1129+
self.seq = None
11801130

11811131
self.df = DataflowManager(self.m, self.clk, self.rst)
11821132

@@ -2154,7 +2104,7 @@ def _read_dataflow_block_nested(self, port, addr, length=1, block_size=1,
21542104
for i, sub in enumerate(ram.rams):
21552105
rams[i].append(sub)
21562106

2157-
rams = [MultibankRAM(rams=ram_list, keep_hierarchy=True)
2107+
rams = [to_multibank_ram(ram_list, keep_hierarchy=True)
21582108
for ram_list in rams]
21592109

21602110
data_list = []
@@ -2580,7 +2530,7 @@ def _write_dataflow_block_nested(self, port, addr, data, length=1, block_size=1,
25802530
for i, sub in enumerate(ram.rams):
25812531
rams[i].append(sub)
25822532

2583-
rams = [MultibankRAM(rams=ram_list, keep_hierarchy=True)
2533+
rams = [to_multibank_ram(ram_list, keep_hierarchy=True)
25842534
for ram_list in rams]
25852535

25862536
done_list = []
@@ -2596,3 +2546,71 @@ def _write_dataflow_block_nested(self, port, addr, data, length=1, block_size=1,
25962546

25972547
merged_done = done_list[0]
25982548
return merged_done
2549+
2550+
2551+
class _PackedMultibankRAM(MultibankRAM):
2552+
def __init__(self, src=None, name=None, keep_hierarchy=False):
2553+
2554+
if not isinstance(src, (tuple, list)):
2555+
src = [src]
2556+
2557+
if not keep_hierarchy:
2558+
src = extract_rams(src)
2559+
2560+
if len(src) < 2:
2561+
raise ValueError('numbanks must be 2 or more')
2562+
2563+
max_datawidth = 0
2564+
for ram in src:
2565+
max_datawidth = max(max_datawidth, ram.datawidth)
2566+
2567+
max_addrwidth = 0
2568+
for ram in src:
2569+
max_addrwidth = max(max_addrwidth, ram.addrwidth)
2570+
2571+
max_numports = src[0].numports
2572+
for ram in src[1:]:
2573+
if max_numports != ram.numports:
2574+
raise ValueError('numports must be same')
2575+
2576+
self.m = src[0].m
2577+
self.name = ('_'.join([ram.name for ram in src])
2578+
if name is None else name)
2579+
self.clk = src[0].clk
2580+
self.rst = src[0].rst
2581+
self.orig_datawidth = max_datawidth
2582+
self.datawidth = max_datawidth * len(src)
2583+
self.addrwidth = max_addrwidth
2584+
self.numports = max_numports
2585+
self.numbanks = len(src)
2586+
self.shift = util.log2(self.numbanks)
2587+
self.rams = src
2588+
self.keep_hierarchy = keep_hierarchy
2589+
self.seq = None
2590+
2591+
for ram in self.rams:
2592+
if ram.seq is not None:
2593+
self.seq = ram.seq
2594+
break
2595+
2596+
self.df = DataflowManager(self.m, self.clk, self.rst)
2597+
2598+
# key: (axi._id(), port, ram_method_name)
2599+
self.cache_dma_reqs = {}
2600+
2601+
self.mutex = None
2602+
2603+
2604+
multibank_ram_cache = {}
2605+
2606+
2607+
def to_multibank_ram(rams, name=None, keep_hierarchy=False):
2608+
ids = tuple([ram._id() for ram in rams])
2609+
2610+
if ids in multibank_ram_cache:
2611+
return multibank_ram_cache[ids]
2612+
2613+
ram = _PackedMultibankRAM(rams, name, keep_hierarchy)
2614+
multibank_ram_cache[ids] = ram
2615+
2616+
return ram

0 commit comments

Comments
 (0)