@@ -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