53a54,57
>
> # Data members in the State Machine that have been declared before
> # the opening brace '{' of the machine. Note that these along with
> # the members in self.objects form the entire set of data members.
54a59
>
76a82,85
>
> # Data members in the State Machine that have been declared inside
> # the {} machine. Note that these along with the config params
> # form the entire set of data members of the machine.
203c212,218
< if python_class_map.has_key(param.type_ast.type.c_ident):
---
> if param.type_ast.type.c_ident == "MessageBuffer":
> if param["network"] == "To":
> code('${{param.ident}} = MasterPort(${dflt_str}"")')
> else:
> code('${{param.ident}} = SlavePort(${dflt_str}"")')
>
> elif python_class_map.has_key(param.type_ast.type.c_ident):
244d258
< has_peer = False
248,250c262
< if "network" in var and "physical_network" in var:
< has_peer = True
< seen_types.add(var.type.ident)
---
> seen_types.add(var.type.ident)
262a275
>
263a277
> void setNetQueue(const std::string& name, MessageBuffer *b);
343,344d356
< if has_peer:
< code('void getQueuesFromPeer(AbstractController *);')
407d418
< has_peer = False
488a500,505
>
> # Do not initialize messgage buffers since they are initialized
> # when the port based connections are made.
> if param.type_ast.type.c_ident == "MessageBuffer":
> continue
>
492a510
>
502,510d519
< else:
< if "network" in var and "physical_network" in var and \
< var["network"] == "To":
< has_peer = True
< code('''
< m_${{var.ident}}_ptr = new ${{var.type.c_ident}}();
< peerQueueMap[${{var["physical_network"]}}] = m_${{var.ident}}_ptr;
< m_${{var.ident}}_ptr->setSender(this);
< ''')
513,514d521
< if (p->peer != NULL)
< connectWithPeer(p->peer);
531c538
< $c_ident::init()
---
> $c_ident::setNetQueue(const std::string& name, MessageBuffer *b)
533c540
< MachineType machine_type = string_to_MachineType("${{var.machine.ident}}");
---
> MachineType machine_type = string_to_MachineType("${{self.ident}}");
535a543,617
> ''')
> code.indent()
>
> # set for maintaining the vnet, direction pairs already seen for this
> # machine. This map helps in implementing the check for avoiding
> # multiple message buffers being mapped to the same vnet.
> vnet_dir_set = set()
>
> for var in self.config_parameters:
> if "network" in var:
> vtype = var.type_ast.type
> vid = "m_%s_ptr" % var.ident
>
> code('''
> if ("${{var.ident}}" == name) {
> $vid = b;
> assert($vid != NULL);
> ''')
> code.indent()
> # Network port object
> network = var["network"]
> ordered = var["ordered"]
>
> if "virtual_network" in var:
> vnet = var["virtual_network"]
> vnet_type = var["vnet_type"]
>
> assert (vnet, network) not in vnet_dir_set
> vnet_dir_set.add((vnet,network))
>
> code('''
> m_net_ptr->set${network}NetQueue(m_version + base, $ordered, $vnet,
> "$vnet_type", b);
> ''')
> # Set the end
> if network == "To":
> code('$vid->setSender(this);')
> else:
> code('$vid->setReceiver(this);')
>
> # Set ordering
> code('$vid->setOrdering(${{var["ordered"]}});')
>
> # Set randomization
> if "random" in var:
> # A buffer
> code('$vid->setRandomization(${{var["random"]}});')
>
> # Set Priority
> if "rank" in var:
> code('$vid->setPriority(${{var["rank"]}})')
>
> # Set buffer size
> code('$vid->resize(m_buffer_size);')
>
> if "recycle_latency" in var:
> code('$vid->setRecycleLatency( ' \
> 'Cycles(${{var["recycle_latency"]}}));')
> else:
> code('$vid->setRecycleLatency(m_recycle_latency);')
>
> # set description (may be overriden later by port def)
> code('''
> $vid->setDescription("[Version " + to_string(m_version) + ", ${ident}, name=${{var.ident}}]");
> ''')
> code.dedent()
> code('}\n')
>
> code.dedent()
> code('''
> }
>
> void
> $c_ident::init()
> {
540a623
>
592,640d674
< else:
< # Network port object
< network = var["network"]
< ordered = var["ordered"]
<
< if "virtual_network" in var:
< vnet = var["virtual_network"]
< vnet_type = var["vnet_type"]
<
< assert var.machine is not None
< code('''
< $vid = m_net_ptr->get${network}NetQueue(m_version + base, $ordered, $vnet, "$vnet_type");
< assert($vid != NULL);
< ''')
<
< # Set the end
< if network == "To":
< code('$vid->setSender(this);')
< else:
< code('$vid->setReceiver(this);')
<
< # Set ordering
< if "ordered" in var:
< # A buffer
< code('$vid->setOrdering(${{var["ordered"]}});')
<
< # Set randomization
< if "random" in var:
< # A buffer
< code('$vid->setRandomization(${{var["random"]}});')
<
< # Set Priority
< if "rank" in var:
< code('$vid->setPriority(${{var["rank"]}})')
<
< # Set buffer size
< if vtype.isBuffer:
< code('''
< if (m_buffer_size > 0) {
< $vid->resize(m_buffer_size);
< }
< ''')
<
< # set description (may be overriden later by port def)
< code('''
< $vid->setDescription("[Version " + to_string(m_version) + ", ${ident}, name=${{var.ident}}]");
<
< ''')
<
967a1002,1008
>
> for var in self.config_parameters:
> vtype = var.type_ast.type
> if vtype.isBuffer:
> vid = "m_%s_ptr" % var.ident
> code('if ($vid->functionalRead(pkt)) { return true; }')
>
984a1026,1032
>
> for var in self.config_parameters:
> vtype = var.type_ast.type
> if vtype.isBuffer:
> vid = "m_%s_ptr" % var.ident
> code('num_functional_writes += $vid->functionalWrite(pkt);')
>
990,1009d1037
< # Check if this controller has a peer, if yes then write the
< # function for connecting to the peer.
< if has_peer:
< code('''
<
< void
< $c_ident::getQueuesFromPeer(AbstractController *peer)
< {
< ''')
< for var in self.objects:
< if "network" in var and "physical_network" in var and \
< var["network"] == "From":
< code('''
< m_${{var.ident}}_ptr = peer->getPeerQueue(${{var["physical_network"]}});
< assert(m_${{var.ident}}_ptr != NULL);
< m_${{var.ident}}_ptr->setReceiver(this);
<
< ''')
< code('}')
<