# Node ID 3d8b972ce367c108f0cb80f92b39e16eb9e2aa49 # Parent 58f1140116501cccf3952db138ace9bb00eec110 diff --git a/src/mem/slicc/ast/OutPortDeclAST.py b/src/mem/slicc/ast/OutPortDeclAST.py --- a/src/mem/slicc/ast/OutPortDeclAST.py +++ b/src/mem/slicc/ast/OutPortDeclAST.py @@ -55,6 +55,13 @@ self.error("The message type '%s' does not exist.", self.msg_type.ident) + # Copy information about the associated message buffers virtual network + # so that later on output ports pointing to the same message buffer can + # be identified and resource checks can be coalesced + if "network" in self.var_expr.var: + self["network"] = self.var_expr.var["network"] + self["virtual_network"] = self.var_expr.var["virtual_network"] + var = Var(self.symtab, self.ident, self.location, self.queue_type.type, str(code), self.pairs) self.symtab.newSymbol(var) diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -729,6 +729,33 @@ 'Cycles(${{var["recycle_latency"]}}));') else: code('$vid->setRecycleLatency(m_recycle_latency);') + # Set buffer size + c = '' + if "buffer_size" in var: + size = var["buffer_size"] + if isinstance(size, str): + try: + # see if this is an integer + size = int(size) + c = "%s" % size + except ValueError: + # if not, it should be a member + c = "m_%s" % size + elif isinstance(size, int): + c = "%s" % size + else: + assert(isinstance(size, AST)) + func_code = code_formatter() + ret_type = size.generate(func_code) + assert(ret_type.isPrimitive) + c = str(func_code) + code('$vid->resize(${{c}});') + else: + code(''' +if (m_buffer_size > 0) { + $vid->resize(m_buffer_size); +} +''') # Set the prefetchers code() @@ -1370,9 +1397,31 @@ request_types = trans.request_types # Check for resources + # Account for multiple network buffers pointing to the + # same resource (same "network" and "virtual_network") case_sorter = [] res = trans.resources + network_res = {} + condensed_res = {} for key,val in res.iteritems(): + if "network" in key: + if (key["network"], key["virtual_network"]) \ + in network_res: + num = int(val) + num += int(condensed_res[ \ + network_res[ \ + (key["network"], \ + key["virtual_network"])]]) + condensed_res[network_res[ \ + (key["network"], \ + key["virtual_network"])]] = str(num) + else: + network_res[(key["network"], \ + key["virtual_network"])] = key + condensed_res[key] = val + else: + condensed_res[key] = val + for key,val in condensed_res.iteritems(): val = ''' if (!%s.areNSlotsAvailable(%s)) return TransitionResult_ResourceStall;